1с выразить уникальный идентификатор как строка в запросе
Еще посмотрите метод:
ЗначениеВСтрокуВнутр( );
Синтаксис:
ЗначениеВСтрокуВнутр( )
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
— значение объекта агрегатного типа данных которое нужно преобразовать.
Что это такое
Прежде всего, глобальный уникальный идентификатор (ГУИД) — это набор символов. В тексте он представляется записью из шестнадцатеричных цифр. Эта группа заключена в фигурные скобки, между собой они разделяются дефисами и всего их — тридцать две. Алгоритм, с помощью которого генерируется значение такого кода, был создан фирмой Microsoft (Майкрософт, англ.).
Применяется эта фишка, прежде всего, во избежание конфликтов при программировании (в этой публикации нас интересует именно этот момент). Самим алгоритмом кодирования неповторимость ключа не гарантируется. Однако общее количество возможных ключей слишком велико (3,4028×10 38 ) — соответственно вероятность совпадения ничтожно мала.
Выглядит это примерно так:
Таким образом, применение такой системы призвано различать по GUID (Globally Unique Identifier — Глобальный Уникальный Идентификатор) две (возможно, несовместимые) версии одного компонента (элемента).
ГУИД в 1С
Каждый объект (object, англ.) системы в 1С характеризуется ссылкой, которая является типом данных. Как и все элементы общей системы — хранится в справочнике. Логически она состоит из его имени и GUID. Уникальность имени контролируется системой — нельзя создать второй справочник с уже имеющимся именем. Таким образом, object является неповторимой сущностью в системе за счёт исключительности его обеих составляющих.
Операции с ключами
Уникальный идентификатор в 1С назначается в момент первичной записи элемента. Уже в процессе самой регистрации можно видеть ключ, который будет привязан к нему. Можно в этот процесс вмешаться и вручную до момента регистрации изменить его по своему желанию. Узнать нужный ГУИД можно через созданный запрос в «Конструкторе запроса» (это стандартный метод для любого элемента):
Полученное значение при использовании такого метода будет иметь специальный тип.
Для преобразования к строке нужно употребить: «Строка(Параметр)».
Получить новый ГУИД можно с помощью такого запроса:
Преобразование в код ссылки элемента можно методом УникальныйИдентификатор():
Ошибки
Чаще всего ошибки, сопряжённые с ключами компонент, возникают когда элемент из базы был удалён, а ключ его в системе остался. При удалении нужно проверять целостность базы.
Теперь вы знаете как в программе 1С происходит присвоение ключей для исключения ошибок в программировании, как узнать или присвоить код элемента, откуда возникают ошибки, связанные с этой темой. Оставляйте свои комментарии.
Как известно, с помощью языка запросов 1С получить уникальный идентификатор объекта ссылочного типа на данный момент нельзя. Но используя возможность СКД обращаться к внешним функциям можно получить строковое представление уникального идентификатора ссылки. Для этого необходимо использовать глобальную функцию XMLСтрока в вычисляемых полях в макете схемы компоновки.
Далее проведем эксперимент по быстродействию получения результата через запрос с последующей обработкой выборки и вариантов с использованием СКД.
Рассмотрим два случая — вывод в табличный документ и формирование текстового документа.
Так же в случае с СКД мы можем создать схему компоновки программно или использовать готовую. Результат работы СКД так же можно обойти в цикле, либо вывести в таблицу значений с последующей обработкой. Для экспериментов будет использоваться платформа 8.3, конфигурация УТ11 (файловая), справочник «КлассификаторБанковРФ», более 4000 элементов.
Схему компоновки и макет можно посмотреть, скачав обработку (ссылка в конце).
По результатам замера производительности видно, что вывод результата в табличный документ происходит быстрее при использовании СКД, причем вариант с программным созданием схемы отрабатывает несколько быстрее.
В тоже время вывод результатов в текстовый документ отрабатывает быстрее для запроса.
Программное создание схемы компоновки отработало быстрее, чем получение макета схемы.
Подскажите, в РН нельзя сделать измерение с типом УникальныйИндентификатор, только реквизит. В ТЧ документа есть УникальныйИдентификатор.
Как в запросе связать их в условии ГДЕ, что-то ВЫРАЗИТЬ КАК Строка у меня ругается
(0) уже поздно, всё сделано, регистр новый и его надо соединять с документом
чет не думал что никак..
(7) + 100500
Если эту хрень в измерения пихать понадобилось, то стопудово это объектная сущность и лучше ее выразить явно. Ну либо в консерватории еще раньше ошибка.
(6) Хранить УИД в виде строки это значит занимать в 2 раза больше места
а если еще и в условии соединения использовать выражения то и принудительно не использовать индекс, если он есть
(8) Есть услуга, у неё есть уникальный идентификатор в РС и ТЧ документов, для того чтобы конкретная Номенклатура была уникальной. Этот идентификатор проходит через документы, и его я пишу в новом РН. Поэтому мне и надо сравнить ТЧ документа и измерение регистра, ну так уже было, я не с нуля делаю..
(6) В запросах 1С вообще нельзя приводить типы. Никак. Это делает больно уже очень давно.
ВЫРАЗИТЬ используется только для конкретизации типов.
(11) Жесть какая. Лучше переделай, пока не поздно. Что делает номенклатуру уникальной? В жизни, а не в кривом архитектурном решении?
(16) так как именно услуга уникальна, смотрю по РН продажи по ней, дабы вывести разницу
(15) ну каждая услуга уникальна на протяжении своей жизни дабы иметь в итоге статус и прочие атрибуты в РС
(20) дык делай новую номенклатуру с уникальными характеристиками каждый раз, нафига извраты с УИНами??
(0) Ну добавь в новый регистр еще и реквизит с типом УникальныйИндентификатор, У тебя в этом регистре будет измерение строкой и реквизит уином.
(29) я так и сделал а толку, соединение то возможно только с измерением, поэтому за сравнение и спросил
(20) То есть вы таким хитрым образом избегаете персонификации заказов? А когда понадобится персонификация? Или хранение и анализ дополнительных атрибутов неперсонифицированных заказов? Ты понимаешь, что такое архитектурное решение будет провоцировать рождение новых костылей и очень быстро захлебнется в этих костылях? А в итоге у вас все равно появится документ "Заказ", сопоставленный с идентификатором?
(33) я не сильно понял о чем ты, возможно разумное, но переделывать ничего не собираюсь, решаю маленькую конкретную задачку
(35) Мне просто интересно, почему в измерении не ссылка на заказ, а какой-то безликий идентификатор. Какая-то мысль у кого-то в голове была же? Хочется ее понять.
Мысль была простая. Насяльник сказал уникально идентифицировать услугу, добавили УИД. Уникально? Уникально! :)
Ты в (20) сказал ключевую фразу - "при первом ее заказе".
Отсюда сразу два вопроса:
1) можно ли повторно заказать эту же самую услугу по тому же идентификатору (вероятно нет, иначе я вообще ничего не понимаю)
2) как в системе отражается факт заказа. Каким документом. Как называется вид документа, в котором генерится идентификатор услуги.
(41) ну делается Заказ с какой-то там услугой, в ТЧ есть УИД, который в момент проведения ей и присваивается. Далее этот УИД сопровождает услугу на протяжении её жизни.
(44) Типа в рамках одного заказа могут заказать несколько однотипных услуг с разными характеристиками и характеристики всегда уникальны? Ну, такое. На несчастной табличке сэкономили, зато кучу неудобств приобрели.
(51) Должен же быть какой-то признак уникальности в жизни. А вообще ТС со своими темами просто достоин звания архитектор-абстракционист.
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование.
Фредерик Брукс-младший
Вы бы объяснили, чего достигнуть желаете, какого числа и зачем? По первоначальному вопросу вам уже ответили: запросом получить невозможно.
(7) chmv,
гуид не может быть числом,
а вот строкой - без проблем, добавляем Строка(Выборка.Ссылка.УникальныйИдентификатор())
(8)если очень хочется , то и числом гуид может быть.
просто надо привести каждое составляющее гуида к примеру к 10 системе счисления.
если бы 1с8 честно выполняла бы запрос вида
Выбрать ссылка
Из спрвочник.ххх
где ссылка < 100000000000000000000000
тогда без проблем. но 1с транслирует этот запрос в чушь полную.
те работает только сравнение на равно (не равно)
для соединения
создать полную таблицу с гуидами задача технически не решенмая из-за огромного размера оной.
ждем , когда исправят ошибку.
Через Com соединение запросом тяну данные из другой базы. Вместе с данными нужно вытянуть ГУИДы записей справочников.
Как это сделать? Можно ли это сделать?
Нужно для организации обмена данными по ГУИД.
(12) конвертация. возможно в будущем. сейчас надо бегом переписать имеющийся обмен, но хочется перевести с кодов на ГУИД.
(13) да, сделала как вы написали: в Тз, ее обрабатываю. но не могу получить именно гуид:
возвращает для всех записей одно и тоже значение
GUID будет строкой, если нужно, его можно преобразовать в нормальный, через Новый УникальныйИдентификатор(GUIDСтрокой)
База источник - COM объект базы, к которой подключаетесь и в которой запрос создаете
Можно в Модуле внешнего соединения запросом выгрузить справочник в тз, добавить колонку ГУИД с типом строка, пройтись присвоить ГУИД и вернуть тз в базу приемник.
ЗУП.String(СтрокаТЗ.РодительСсылка); - выдает представление ссылки
ЗначениеВСтрокуВнутр(СтрокаТЗ.Ссылка); - выдает все одинаковые значения
ЗУП.String(СтрокаТЗ.Ссылка.УникальныйИдентификатор()); - вот это выдает то что нужно.
Если объекты требуется сравнивать по УИД, то иногда целесообразно добавить в объект реквизит GUID и в процедуре ПриЗаписи вносить в него УИД (только придется повторно вызывать запись и придумать флаг для защиты от зацикливания) или же в процедуре ПередЗаписью генерить новый GUID и его вносить в УИД.
Тогда можно и в запросе использовать. Но если задача разовая, то не стоит заморачиваться.
(23) задача не разовая, раз в час регламентное задание в БУХ тянет данные из ЗУП. БУХ нетиповая, обмен тоже нетривиальный.
переходим на ЗУП.3.1 - обмен приходится переписывать - из другой базы и немного другие источники данных.
вот заодно хочется перейти еще на на ГУИДы.
Тогда по-любому переходите. В вашем случае я бы выбрал вариант генерирования GUID'а перед записью объекта, т.е. генерите GUID и вносите его в УИД ссылки и в новый реквизит GUID.
(26) спасибо! Да, прописываю заполнение соответствий - в случае если такого соответствия еще нет.
Сделала для соответствий РегСведений.
извиняюсь за некропостинг, но такую задачу можно решить при помощи инструментов разработчика - если необходимо делать выборку, там есть кнопка в консоли запросов - "отображать идентификаторы" и заместо ссылок он будет выводить guid.
Начиная с платформы 8.3.12
В языке запросов расширена поддержка значений следующих типов: УникальныйИдентификатор, ХранилищеЗначений.
Реализована возможность создания временных таблиц на основании таблиц значений, содержащих колонки вышеуказанных типов.
Реализована возможность использовать поля и выражения типа УникальныйИдентификатор в операции множественного В.
Реализована возможность использовать поля и выражения типа УникальныйИдентификатор в операции множественного В.
но возможность получить в выборку поле со значением гуида для каждой ссылки по прежнему невозможно, так?
(31) Вполне возможно. Ставишь в параметрах консоли запросов галочку "Добавлять УИД" и рядом в выборке рядом с колонкой ссылочного типа появляется колонка с УИД.
(32) не думаю что это решение - это ваша консоль пост обработку выборки делает средствами встроенного языка.
(31) Ну в ближайшем будущем планируют это сделать
В версии платформы 1С 8.3.22 в язык запросов (и в язык выражений СКД) доблена функция УникальныйИдентификатор(Ссылка). Функция возвращает уникальный идентификатор переданной ссылки (или NULL, если передано значение NULL). Параметр Ссылка это выражение, результатом которого является ссылка (за исключением ссылок на таблицы внешних источников данных).
Получение Уникального ИДентификатора от ссылки в запросе в 1С 8.3:
В любой конфигурации 1С 8 у каждого объекта(документа, элемента справочника, элемента плана видов характеристик и т.п.) есть уникальный идентификатор(УИН). При помощи него можно переносить объекты между базами РИБ не боясь задвоения данных, быстро находить элемент справочника или документ и т.п.
Как получить уникальный идентификатор из ссылки? При помощи свойства ссылки УникальныйИдентификатор(). Пример 1:
Уникальный идентификатор в 1С 8 имеет тип УникальныйИдентификатор, но его можно преобразовать и в строковое значение(получится строка вот такого вида: 9712e912-d0b9-11e1-b37b-0050568458ce).
Как получить ссылку имея уникальный идентификатор? При помощи метода ПолучитьСсылку( ) менеджера справочника, документа и т.п.
Пример 4 (Здесь УИН — значение типа УникальныйИдентификатор):
Пример 5(Здесь СтрокаУИН — переменная со строковым значением уникального идентификатора):
В примере 5 уникальный идентификатор получается из строкового значения при помощи конструктора Новый УникальныйИдентификатор( )
Для получения уникального идентификатора объекта, используйте код вида:
Код 1C v 8.х
Как с помощью запроса получить уникальный идентификатор:
Код 1C v 8.х
В 1С 7.7 можно получить так
Через v7plus.dll
Код 1C v 7.x
Через WScript
Код 1C v 7.x
при OLE доступе:
Код 1C v 7.x
Еще посмотрите метод:
ЗначениеВСтрокуВнутр( );
Синтаксис:
ЗначениеВСтрокуВнутр( )
Назначение:
Преобразование значения объекта агрегатного типа в строковое системное представление.
Возвращает: представление значения объекта в строковом системном виде.
Параметры:
— значение объекта агрегатного типа данных которое нужно преобразовать.
В любой конфигурации 1С 8 у каждого объекта(документа, элемента справочника, элемента плана видов характеристик и т.п.) есть уникальный идентификатор(УИН). При помощи него можно переносить объекты между базами РИБ не боясь задвоения данных, быстро находить элемент справочника или документ и т.п.
Как получить уникальный идентификатор из ссылки? При помощи свойства ссылки УникальныйИдентификатор().
Пример 1:
Уникальный идентификатор в 1С 8 имеет тип УникальныйИдентификатор, но его можно преобразовать и в строковое значение(получится строка вот такого вида: 9712e912-d0b9-11e1-b37b-0050568458ce).
Как получить ссылку имея уникальный идентификатор? При помощи метода ПолучитьСсылку( ) менеджера справочника, документа и т.п.
Пример 4 (Здесь УИН — значение типа УникальныйИдентификатор):
Номенклатура = Справочники . Номенклатура . ПолучитьСсылку ( УИН ) ;
Пример 5 (Здесь СтрокаУИН — переменная со строковым значением уникального идентификатора):
Номенклатура = Справочники . Номенклатура . ПолучитьСсылку ( Новый УникальныйИдентификатор ( СтрокаУИН ) ) ;
В примере 5 уникальный идентификатор получается из строкового значения при помощи конструктора Новый УникальныйИдентификатор( )
Кроме преобразования строк и числа функция применяется для выделения одного типа в составных реквизитах.
Зачем использовать ВЫРАЗИТЬ для полей составного типа?
Поля составного типа — реквизиты, в которых допустимо указание значения различных типов.
В случае, когда такое поле не заполнено в нём хранится НЕОПРЕДЕЛЕНО, с которым не совсем удобно работать на выходе:
- необходимо постоянно проверять на заполнено
- если используется обращение к реквизитам через точку, при обращении возможно появление ошибки.
Пример №1:
Есть реквизит составного типа: Число+Перечисление
Если выполнить ВЫРАЗИТЬ(Реквизит как ЧИСЛО(15,0)) тогда на выходе получится NULL, что ничем не лучше.
Если вызвать ВЫРАЗИТЬ(Реквизит КАК Перечисление.ВидыЗаявок), в результате получится значение Перечисления.ВидыЗаявок.Пустая(), что вполне удобно.
Вышестоящий пример я привел для ситуации, когда удобство не так заметно.
Пример №2:
Реквизит составного типа: Справочник.ФизическиеЛица+Справочник.Сотрудники
Если вы сделаете отбор в запросе:
ГДЕ
Сотрудник ССЫЛКА Справочник.Сотрудник
У вас на выходе получатся только записи, где реквизит Сотрудник типа сотрудники, но если это поле пустое, там будет Неопределено.
В случае использования конструкции
ВЫРАЗИТЬ (Сотрудник как Справочник.Сотрудники) как ПолеСотрудник
В данном поле всегда будет значение ссылки и допустимо обращение к нему: в момент обработки результата запроса «ПолеСотрудник.Наименование», ПолеСотрудник.Пустая(), не вызывая ошибки.
Дополнительное преимущество такого использования:
В случае если составное поле имеет тип Справочник.Ссылка или Документ.Ссылка (любой справочник и любой документ, совместно) при выполнении запроса 1С присоединит все связанные таблицы:
- В лучшем случае это замедлит выполнение запроса.
- В больших конфигурациях типа УПП или ERP, такие запросы могут вызвать ошибку превышения количества таблиц в запросе — он попросту не выполнится.
Если же вы знаете, что там будет и ограничите значения функцией ВЫРАЗИТЬ, такого не происходит — и вы помогаете оптимизатору запросов, а для файловой версии это может оказаться критичным.
В типовых конфигурациях реквизит «ДокументОснование»,»ДокументОприходования», «Партия» или «Сделка», торговых документов чаще всего нуждается в таком преобразовании, т.к. составные поля используются редко: чаще разносят по различным реквизитам, которые видимы в зависимости от вида операции/ситуации.
Другие статьи про работу с ВЫРАЗИТЬ:
Всякая реклама есть средство отделить человека от его денег.
— Джон Пристли
Читайте также: