Вопрос получения уникального идентификатора (GUID) ссылки непосредственно в тексте запроса долгое время оставался одной из самых обсуждаемых тем в сообществе 1С. Долгое время считалось, что это невозможно сделать без выгрузки данных в таблицу значений и последующей обработки встроенным языком. Однако с развитием платформы 1С:Предприятие 8.3 ситуация существенно изменилась. В этой статье мы подробно разберем, как получить GUID в запросе, начиная от самых современных инструментов и заканчивая методами для работы со старыми конфигурациями или внешними базами данных.
Начиная с версии платформы 8.3.22, разработчики получили долгожданный инструмент — встроенную функцию языка запросов УНИКАЛЬНЫЙИДЕНТИФИКАТОР(). Эта функция позволяет получить значение типа УникальныйИдентификатор прямо из ссылочного поля. Рассмотрим, как это выглядит на практике.
Проанализируем пример запроса, который выбирает номенклатуру и её идентификатор:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Номенклатура.Ссылка) КАК Идентификатор
ИЗ
Справочник.Номенклатура КАК Номенклатура
Важно понимать несколько ключевых особенностей работы этой функции:
УникальныйИдентификатор. Это позволяет сравнивать идентификаторы между собой в рамках запроса.NULL (например, при левом соединении), результат также будет NULL.С выходом версии 8.3.24 функционал был расширен. Теперь мы можем использовать строковые литералы GUID прямо в тексте запроса для сравнения. Это избавляет от необходимости передавать объект идентификатора через параметры запроса в простых случаях.
Разберем ситуацию, когда нам нужно найти конкретный объект по его известному GUID:
ВЫБРАТЬ
Сотрудники.Наименование
ИЗ
Справочник.Сотрудники КАК Сотрудники
ГДЕ
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Сотрудники.Ссылка) = УНИКАЛЬНЫЙИДЕНТИФИКАТОР("50074213-333e-11e3-9999-0050568b3260")
Обратите внимание: мы используем функцию УНИКАЛЬНЫЙИДЕНТИФИКАТОР() с обеих сторон равенства, чтобы привести строковую константу к соответствующему типу данных запроса. При возникновении ошибок несовместимости типов в сложных условиях соединения или фильтрации по строковому УИД пригодится руководство по сравнению строк с представлением ссылки в запросе.
Часто задача получения GUID возникает при организации обмена данными между базами через COM-соединение. В этом случае мы не всегда можем полагаться на версию платформы удаленной базы. Если база-источник работает на старой платформе, функция УНИКАЛЬНЫЙИДЕНТИФИКАТОР() в запросе будет недоступна. Выясним, как обойти это ограничение. Для реализации и тестирования подобных сценариев взаимодействия можно использовать универсальную обработку для выполнения запросов через COM-подключение.
Самый надежный способ в этом случае — использование метода XMLString() или обращения к свойству УникальныйИдентификатор() ссылки в цикле обхода результата запроса. Посмотрим на пример кода:
// Предположим, V83 — это установленное COM-соединение
ЗапросСОМ = V83.NewObject("Запрос");
ЗапросСОМ.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
Выборка = ЗапросСОМ.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Вариант 1: Через XMLString (возвращает строку)
СтрокаGUID = V83.XMLString(Выборка.Ссылка);
// Вариант 2: Через обращение к методу ссылки
ОбъектGUID = Выборка.Ссылка.УникальныйИдентификатор();
СтрокаGUID2 = V83.String(ОбъектGUID);
Сообщить("Контрагент: " + Выборка.Наименование + " GUID: " + СтрокаGUID);
КонецЦикла;
Важный нюанс: при работе через COM использование XMLString(Ссылка) предпочтительнее, так как оно сразу возвращает строковое представление идентификатора в стандартном формате, которое легко преобразовать обратно в тип УникальныйИдентификатор в базе-приемнике командой Новый УникальныйИдентификатор(СтрокаGUID).
Если ваша платформа уже не совсем старая (выше 8.3.12), но еще не обновилась до 8.3.22, вы можете использовать возможности работы с типом УникальныйИдентификатор во временных таблицах. Хотя получить GUID из ссылки внутри самого SQL-запроса не получится, вы можете заранее подготовить таблицу значений с идентификаторами на стороне встроенного языка и передать её в запрос.
Проанализируем этот алгоритм:
ТаблицаЗначений.ОписаниеТипов("УникальныйИдентификатор").
ТЗ_Списком = Новый ТаблицаЗначений;
ТЗ_Списком.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("УникальныйИдентификатор"));
// Заполняем ТЗ...
НоваяСтрока = ТЗ_Списком.Добавить();
НоваяСтрока.Идентификатор = ОбъектСсылка.УникальныйИдентификатор();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВТ_Данные.Идентификатор
|ПОМЕСТИТЬ ВТ_Идентификаторы
|ИЗ
| &ТЗ_Данные КАК ВТ_Данные";
Запрос.УстановитьПараметр("ТЗ_Данные", ТЗ_Списком);
// Теперь в запросе можно использовать фильтр ПО ВТ_Идентификаторы.Идентификатор
В Системе компоновки данных (СКД) часто требуется вывести GUID для технических целей или выгрузки в Excel. Для этого не обязательно менять запрос. Мы можем использовать функции общих модулей или встроенные функции языка выражений СКД.
Рассмотрим вариант использования вычисляемого поля:
Вкладка "Вычисляемые поля", выражение: XMLСтрока(Ссылка). Это простейший способ получить строковое представление идентификатора в отчете без изменения схемы запроса.
Для глубокого понимания процесса проанализируем, как 1С хранит ссылки. В таблицах MS SQL Server или PostgreSQL ссылочные поля (например, _IDRRef) имеют бинарный тип данных длиной 16 байт. Платформа 1С при выполнении функции УНИКАЛЬНЫЙИДЕНТИФИКАТОР() на уровне базы данных выполняет операцию CAST или аналогичную трансформацию бинарных данных.
Важно: порядок байтов в SQL-представлении ссылки (binary) отличается от привычного строкового представления GUID в 1С. Это так называемый "перевернутый" GUID. Поэтому прямое чтение SQL-таблиц внешними средствами без использования функций 1С требует понимания алгоритма перестановки байтов. Использование встроенной функции УНИКАЛЬНЫЙИДЕНТИФИКАТОР() в запросе 1С берет эту сложность на себя, гарантируя корректный результат.
Подведем итог нашим изысканиям:
УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Ссылка) прямо в запросе. Это самый быстрый и правильный способ.XMLString(Ссылка) на стороне источника.ТаблицаЗначений и заполнение колонки с идентификаторами в цикле.XMLСтрока() в вычисляемых полях для быстрого вывода идентификатора в отчет.Выбор метода зависит от версии вашей платформы и архитектурных задач, но современный стандарт 1С однозначно диктует использование встроенных функций запроса везде, где это возможно.