Как получить GUID ссылки в запросе 1С: современные и классические способы

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

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

Способ 1: Использование встроенной функции УНИКАЛЬНЫЙИДЕНТИФИКАТОР()

Начиная с версии платформы 8.3.22, разработчики получили долгожданный инструмент — встроенную функцию языка запросов УНИКАЛЬНЫЙИДЕНТИФИКАТОР(). Эта функция позволяет получить значение типа УникальныйИдентификатор прямо из ссылочного поля. Рассмотрим, как это выглядит на практике.

Проанализируем пример запроса, который выбирает номенклатуру и её идентификатор:


ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Номенклатура.Ссылка) КАК Идентификатор
ИЗ
    Справочник.Номенклатура КАК Номенклатура

Важно понимать несколько ключевых особенностей работы этой функции:

  1. Тип возвращаемого значения: Функция возвращает не строку, а объект типа УникальныйИдентификатор. Это позволяет сравнивать идентификаторы между собой в рамках запроса.
  2. Работа с NULL: Если в функцию передано значение NULL (например, при левом соединении), результат также будет NULL.
  3. Производительность: Данная операция выполняется на стороне СУБД. Это SARGable операция, что означает эффективное использование индексов и высокую скорость выполнения даже на больших объемах данных.

Способ 2: Работа с GUID в операциях соединения и фильтрации

С выходом версии 8.3.24 функционал был расширен. Теперь мы можем использовать строковые литералы GUID прямо в тексте запроса для сравнения. Это избавляет от необходимости передавать объект идентификатора через параметры запроса в простых случаях.

Разберем ситуацию, когда нам нужно найти конкретный объект по его известному GUID:


ВЫБРАТЬ
    Сотрудники.Наименование
ИЗ
    Справочник.Сотрудники КАК Сотрудники
ГДЕ
    УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Сотрудники.Ссылка) = УНИКАЛЬНЫЙИДЕНТИФИКАТОР("50074213-333e-11e3-9999-0050568b3260")

Обратите внимание: мы используем функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР() с обеих сторон равенства, чтобы привести строковую константу к соответствующему типу данных запроса. При возникновении ошибок несовместимости типов в сложных условиях соединения или фильтрации по строковому УИД пригодится руководство по сравнению строк с представлением ссылки в запросе.

Способ 3: Получение GUID через COM-соединение

Часто задача получения GUID возникает при организации обмена данными между базами через COM-соединение. В этом случае мы не всегда можем полагаться на версию платформы удаленной базы. Если база-источник работает на старой платформе, функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР() в запросе будет недоступна. Выясним, как обойти это ограничение. Для реализации и тестирования подобных сценариев взаимодействия можно использовать универсальную обработку для выполнения запросов через COM-подключение.

Самый надежный способ в этом случае — использование метода XMLString() или обращения к свойству УникальныйИдентификатор() ссылки в цикле обхода результата запроса. Посмотрим на пример кода:


// Предположим, V83 — это установленное COM-соединение
ЗапросСОМ = V83.NewObject("Запрос");
ЗапросСОМ.Текст = 
    "ВЫБРАТЬ
    |   Контрагенты.Ссылка КАК Ссылка,
    |   Контрагенты.Наименование КАК Наименование
    |ИЗ
    |   Справочник.Контрагенты КАК Контрагенты";

Выборка = ЗапросСОМ.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    // Вариант 1: Через XMLString (возвращает строку)
    СтрокаGUID = V83.XMLString(Выборка.Ссылка);
    
    // Вариант 2: Через обращение к методу ссылки
    ОбъектGUID = Выборка.Ссылка.УникальныйИдентификатор();
    СтрокаGUID2 = V83.String(ОбъектGUID);
    
    Сообщить("Контрагент: " + Выборка.Наименование + " GUID: " + СтрокаGUID);
КонецЦикла;

Важный нюанс: при работе через COM использование XMLString(Ссылка) предпочтительнее, так как оно сразу возвращает строковое представление идентификатора в стандартном формате, которое легко преобразовать обратно в тип УникальныйИдентификатор в базе-приемнике командой Новый УникальныйИдентификатор(СтрокаGUID).

Способ 4: Использование временных таблиц (для версий 8.3.12 - 8.3.21)

Если ваша платформа уже не совсем старая (выше 8.3.12), но еще не обновилась до 8.3.22, вы можете использовать возможности работы с типом УникальныйИдентификатор во временных таблицах. Хотя получить GUID из ссылки внутри самого SQL-запроса не получится, вы можете заранее подготовить таблицу значений с идентификаторами на стороне встроенного языка и передать её в запрос.

Проанализируем этот алгоритм:

  1. Создаем ТаблицаЗначений.
  2. Добавляем колонку с типом ОписаниеТипов("УникальныйИдентификатор").
  3. Заполняем таблицу данными.
  4. Передаем таблицу в запрос как параметр и помещаем её во временную таблицу.

ТЗ_Списком = Новый ТаблицаЗначений;
ТЗ_Списком.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор"));

// Заполняем ТЗ...
НоваяСтрока = ТЗ_Списком.Добавить();
НоваяСтрока.Идентификатор = ОбъектСсылка.УникальныйИдентификатор();

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ВТ_Данные.Идентификатор
    |ПОМЕСТИТЬ ВТ_Идентификаторы
    |ИЗ
    |   &ТЗ_Данные КАК ВТ_Данные";
    
Запрос.УстановитьПараметр("ТЗ_Данные", ТЗ_Списком);
// Теперь в запросе можно использовать фильтр ПО ВТ_Идентификаторы.Идентификатор

Способ 5: Получение строкового GUID в СКД

В Системе компоновки данных (СКД) часто требуется вывести GUID для технических целей или выгрузки в Excel. Для этого не обязательно менять запрос. Мы можем использовать функции общих модулей или встроенные функции языка выражений СКД.

Рассмотрим вариант использования вычисляемого поля:

Вкладка "Вычисляемые поля", выражение: XMLСтрока(Ссылка). Это простейший способ получить строковое представление идентификатора в отчете без изменения схемы запроса.

Технические подробности и хранение в СУБД

Для глубокого понимания процесса проанализируем, как 1С хранит ссылки. В таблицах MS SQL Server или PostgreSQL ссылочные поля (например, _IDRRef) имеют бинарный тип данных длиной 16 байт. Платформа 1С при выполнении функции УНИКАЛЬНЫЙИДЕНТИФИКАТОР() на уровне базы данных выполняет операцию CAST или аналогичную трансформацию бинарных данных.

Важно: порядок байтов в SQL-представлении ссылки (binary) отличается от привычного строкового представления GUID в 1С. Это так называемый "перевернутый" GUID. Поэтому прямое чтение SQL-таблиц внешними средствами без использования функций 1С требует понимания алгоритма перестановки байтов. Использование встроенной функции УНИКАЛЬНЫЙИДЕНТИФИКАТОР() в запросе 1С берет эту сложность на себя, гарантируя корректный результат.

Итоги

Подведем итог нашим изысканиям:

  1. Если у вас платформа 8.3.22 и выше — используйте функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) прямо в запросе. Это самый быстрый и правильный способ.
  2. Для COM-соединений используйте XMLString(Ссылка) на стороне источника.
  3. Для старых версий платформы остается только метод постобработки: выгрузка результата запроса в ТаблицаЗначений и заполнение колонки с идентификаторами в цикле.
  4. В СКД пользуйтесь функцией XMLСтрока() в вычисляемых полях для быстрого вывода идентификатора в отчет.

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

← На главную