Часто при разработке мы сталкиваемся с необходимостью получить уникальный идентификатор ссылки (GUID) непосредственно в запросе. Особенно актуальной эта задача становится при интеграции с внешними базами данных, когда нам нужно связать объекты 1С с записями во внешних источниках. В этой статье мы подробно разберем, как работать с типом УникальныйИдентификатор в запросах, выясним причину распространенных ошибок и посмотрим на новые возможности платформы.
Многие разработчики по аналогии с приведением к строке или числу пытаются использовать конструкцию вида ВЫРАЗИТЬ(Поле КАК УникальныйИдентификатор). Однако при попытке выполнить такой запрос система выдаст ошибку. Проанализируем, почему так происходит.
В платформе 1С:Предприятие оператор ВЫРАЗИТЬ предназначен в первую очередь для работы с полями составного типа (чтобы ограничить выбираемые данные конкретным типом) или для ограничения длины строк и разрядности чисел. Важно понимать фундаментальное ограничение: тип УникальныйИдентификатор не может входить в составной тип данных в метаданных 1С. Следовательно, приведение произвольного составного поля или строки к UUID средствами самого языка запросов (до определенных версий) невозможно. Вы не можете просто взять строковое представление "e00508bf-..." и на лету скастовать его в GUID стандартным оператором приведения. Для обхода этих ограничений можно использовать методику сравнения строки с представлением ссылки в запросе.
Если ваша конфигурация работает на платформе версии 8.3.22 и выше, у нас появилась отличная встроенная функция языка запросов. Рассмотрим ее подробнее.
Теперь мы можем извлекать GUID из любой ссылки непосредственно на сервере базы данных без пост-обработки результата выборки. Для этого используется функция УникальныйИдентификатор(). Разберем на примере:
ВЫБРАТЬ
Номенклатура.Ссылка КАК СсылкаНоменклатуры,
УникальныйИдентификатор(Номенклатура.Ссылка) КАК GUIDНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура
Посмотрим на особенности этой функции:
СправочникСсылка или ДокументСсылка).УникальныйИдентификатор. Это не строка, а именно бинарный GUID.Проанализируем ситуацию, когда необходимо связать данные 1С с таблицей из SQL-базы, подключенной как внешний источник данных. Часто в таких таблицах первичным ключом выступает поле типа uniqueidentifier.
Если мы хотим, чтобы конструктор запросов 1С корректно видел тип этого поля, нам не нужно пытаться "выразить" его в запросе. Система 1С, как правило, автоматически распознает тип uniqueidentifier из MS SQL и проецирует его в свой внутренний тип УникальныйИдентификатор. Если этого не произошло автоматически, перейдите в конфигуратор, откройте свойства поля таблицы внешнего источника и вручную укажите нужный тип.
Когда типы синхронизированы, мы можем писать запросы, связывая ссылки 1С и внешние таблицы с использованием новой функции. В случаях, когда сопоставить объекты по идентификатору невозможно, применяется перенос данных между похожими конфигурациями 1С с поиском по произвольным полям.
ВЫБРАТЬ
ВнешняяТаблица.Наименование,
Номенклатура.Артикул
ИЗ
ВнешнийИсточникДанных.БазаSQL.Таблица.Товары КАК ВнешняяТаблица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО ВнешняяТаблица.ВнешнийИД = УникальныйИдентификатор(Номенклатура.Ссылка)
Если версия вашей платформы ниже 8.3.22, получить UUID прямо в запросе не выйдет. Однако мы можем решить задачу на этапе компоновки или вывода данных. Рассмотрим обходные пути для Системы Компоновки Данных (СКД).
В СКД мы можем использовать мощь выражений вычисляемых полей. Если нам нужно превратить ссылку в строковое представление ее уникального идентификатора для вывода в отчет, воспользуемся встроенной функцией преобразования:
XMLСтрока(Ссылка).Функция XMLСтрока() вернет каноничное строковое представление GUID (например, "9b8d2341-11e9-11ea-80c1-0050569f4b00"), с которым можно работать в пользовательских полях. Если же стоит обратная задача — получить объект идентификатора из строки в контексте СКД, мы можем применить конструкцию: XMLЗначение(Тип("УникальныйИдентификатор"), СтрокаСGUID). Это позволит системе распознать строку именно как типизированный идентификатор при расчете итогов или группировок.
Таким образом, мы видим, что напрямую преобразовать строку или составной тип в уникальный идентификатор языком SQL-запросов 1С нельзя из-за архитектурных ограничений метаданных. Однако использование актуальных версий платформы и грамотная работа с внешними источниками данных и СКД полностью покрывают потребности разработки. При необходимости наладить регулярное взаимодействие систем можно настроить автоматический обмен данными между базами 1С по расписанию.