Как выразить поле как УникальныйИдентификатор в запросе 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто при разработке мы сталкиваемся с необходимостью получить уникальный идентификатор ссылки (GUID) непосредственно в запросе. Особенно актуальной эта задача становится при интеграции с внешними базами данных, когда нам нужно связать объекты 1С с записями во внешних источниках. В этой статье мы подробно разберем, как работать с типом УникальныйИдентификатор в запросах, выясним причину распространенных ошибок и посмотрим на новые возможности платформы.

Ограничения оператора ВЫРАЗИТЬ и составных типов

Многие разработчики по аналогии с приведением к строке или числу пытаются использовать конструкцию вида ВЫРАЗИТЬ(Поле КАК УникальныйИдентификатор). Однако при попытке выполнить такой запрос система выдаст ошибку. Проанализируем, почему так происходит.

В платформе 1С:Предприятие оператор ВЫРАЗИТЬ предназначен в первую очередь для работы с полями составного типа (чтобы ограничить выбираемые данные конкретным типом) или для ограничения длины строк и разрядности чисел. Важно понимать фундаментальное ограничение: тип УникальныйИдентификатор не может входить в составной тип данных в метаданных 1С. Следовательно, приведение произвольного составного поля или строки к UUID средствами самого языка запросов (до определенных версий) невозможно. Вы не можете просто взять строковое представление "e00508bf-..." и на лету скастовать его в GUID стандартным оператором приведения. Для обхода этих ограничений можно использовать методику сравнения строки с представлением ссылки в запросе.

Новые возможности: Платформа 8.3.22 и функция УникальныйИдентификатор()

Если ваша конфигурация работает на платформе версии 8.3.22 и выше, у нас появилась отличная встроенная функция языка запросов. Рассмотрим ее подробнее.

Теперь мы можем извлекать GUID из любой ссылки непосредственно на сервере базы данных без пост-обработки результата выборки. Для этого используется функция УникальныйИдентификатор(). Разберем на примере:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК СсылкаНоменклатуры,
    УникальныйИдентификатор(Номенклатура.Ссылка) КАК GUIDНоменклатуры
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Посмотрим на особенности этой функции:

  1. Она принимает в качестве параметра поле ссылочного типа (например, СправочникСсылка или ДокументСсылка).
  2. Результатом ее выполнения является строго типизированное значение — УникальныйИдентификатор. Это не строка, а именно бинарный GUID.
  3. Функция позволяет значительно ускорить процессы синхронизации и сравнения данных с внешними таблицами. Для контроля корректности таких операций можно автоматически сравнивать бухгалтерские и налоговые проводки между базами 1С.

Работа с внешними источниками данных

Проанализируем ситуацию, когда необходимо связать данные 1С с таблицей из SQL-базы, подключенной как внешний источник данных. Часто в таких таблицах первичным ключом выступает поле типа uniqueidentifier.

Если мы хотим, чтобы конструктор запросов 1С корректно видел тип этого поля, нам не нужно пытаться "выразить" его в запросе. Система 1С, как правило, автоматически распознает тип uniqueidentifier из MS SQL и проецирует его в свой внутренний тип УникальныйИдентификатор. Если этого не произошло автоматически, перейдите в конфигуратор, откройте свойства поля таблицы внешнего источника и вручную укажите нужный тип.

Когда типы синхронизированы, мы можем писать запросы, связывая ссылки 1С и внешние таблицы с использованием новой функции. В случаях, когда сопоставить объекты по идентификатору невозможно, применяется перенос данных между похожими конфигурациями 1С с поиском по произвольным полям.


ВЫБРАТЬ
    ВнешняяТаблица.Наименование,
    Номенклатура.Артикул
ИЗ
    ВнешнийИсточникДанных.БазаSQL.Таблица.Товары КАК ВнешняяТаблица
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        ПО ВнешняяТаблица.ВнешнийИД = УникальныйИдентификатор(Номенклатура.Ссылка)

Альтернативные способы и работа в СКД

Если версия вашей платформы ниже 8.3.22, получить UUID прямо в запросе не выйдет. Однако мы можем решить задачу на этапе компоновки или вывода данных. Рассмотрим обходные пути для Системы Компоновки Данных (СКД).

В СКД мы можем использовать мощь выражений вычисляемых полей. Если нам нужно превратить ссылку в строковое представление ее уникального идентификатора для вывода в отчет, воспользуемся встроенной функцией преобразования:

  1. Откройте вкладку Вычисляемые поля в СКД.
  2. В колонке "Выражение" пропишите: XMLСтрока(Ссылка).

Функция XMLСтрока() вернет каноничное строковое представление GUID (например, "9b8d2341-11e9-11ea-80c1-0050569f4b00"), с которым можно работать в пользовательских полях. Если же стоит обратная задача — получить объект идентификатора из строки в контексте СКД, мы можем применить конструкцию: XMLЗначение(Тип("УникальныйИдентификатор"), СтрокаСGUID). Это позволит системе распознать строку именно как типизированный идентификатор при расчете итогов или группировок.

Таким образом, мы видим, что напрямую преобразовать строку или составной тип в уникальный идентификатор языком SQL-запросов 1С нельзя из-за архитектурных ограничений метаданных. Однако использование актуальных версий платформы и грамотная работа с внешними источниками данных и СКД полностью покрывают потребности разработки. При необходимости наладить регулярное взаимодействие систем можно настроить автоматический обмен данными между базами 1С по расписанию.

← На главную