К статье
Практический материал

Разработка и Конфигурация · 10 мин

1С: как запросом получить уникальный идентификатор

Как в 1С получить уникальный идентификатор ссылки запросом: функция ПредставлениеСсылки, метод УникальныйИдентификатор(), примеры кода, типичные ошибки и FAQ.

Уникальный идентификатор (GUID) в 1С — это 36-символьная строка вида «a3f2c1d4-5b6e-4f7a-8b9c-0d1e2f3a4b5c», которая однозначно определяет ссылку на объект базы данных: элемент справочника, документ, план видов характеристик и т.д. Он нужен при обмене данными между базами, интеграции с внешними системами, сайтами и веб-сервисами, где ссылку нельзя передать «как есть».

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

Ниже разобраны рабочие способы получить GUID через запрос и около него: от простого варианта «запрос + метод платформы» до решений для СКД, консоли запросов и обменов. Для каждого способа указаны ограничения и ситуации, где он уместен.

Почему запрос не возвращает GUID напрямую

Язык запросов 1С работает с данными на уровне таблиц и полей, а уникальный идентификатор — это служебное свойство объекта «ссылка», которое не хранится в виде отдельного доступного поля в явном строковом виде. Хотя физически GUID лежит в поле _IDRRef таблицы базы данных, платформа не предоставляет к нему доступа через конструктор запроса.

Поэтому конструкция вида ВЫБРАТЬ Товары.Ссылка.УникальныйИдентификатор невозможна — запрос выдаст ошибку. Единственное, что можно сделать в самом запросе, — выбрать ссылку целиком и дальше обработать её в коде на встроенном языке.

Способ 1: запрос выбирает ссылку, метод возвращает GUID

Самый распространённый и надёжный вариант — получить выборку ссылок запросом, а затем в цикле для каждой ссылки вызвать метод УникальныйИдентификатор(). Метод возвращает значение типа «УникальныйИдентификатор», которое при приведении к строке даёт привычный GUID.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

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

Пока Выборка.Следующий() Цикл

GUID = Строка(Выборка.Ссылка.УникальныйИдентификатор());

Сообщить(GUID);

КонецЦикла;

Если нужен GUID одного конкретного объекта, запрос вообще не обязателен — достаточно взять ссылку любым способом (например, из реквизита формы) и вызвать тот же метод. Запрос оправдан, когда GUID нужны для набора объектов, отобранных по условию.

Обратная задача: получить ссылку по GUID

Часто вместе с получением GUID требуется обратная операция — по строке идентификатора найти ссылку. Для этого используется менеджер соответствующего объекта и метод ПолучитьСсылку(), куда передаётся объект типа «УникальныйИдентификатор», созданный из строки.

GUIDСтрокой = "a3f2c1d4-5b6e-4f7a-8b9c-0d1e2f3a4b5c";

УИД = Новый УникальныйИдентификатор(GUIDСтрокой);

СсылкаНаТовар = Справочники.Номенклатура.ПолучитьСсылку(УИД);

Если СсылкаНаТовар.ПолучитьОбъект() = Неопределено Тогда

// Объект с таким GUID в базе отсутствует

КонецЕсли;

Проверка существования важна: ПолучитьСсылку() вернёт ссылку даже на несуществующий объект, и обращение к её реквизитам приведёт к ошибке или значениям по умолчанию. Надёжная проверка — попытка получить объект или запрос к таблице по полученной ссылке.

Способ 2: GUID в СКД через ПредставлениеСсылки()

В системе компоновки данных доступна функция языка выражений ПредставлениеСсылки(), которая для ссылки возвращает её уникальный идентификатор в строковом виде. Это единственный способ получить GUID «внутри» запроса без последующего перебора выборки — но только в контексте СКД.

ВЫБРАТЬ

Номенклатура.Ссылка КАК Ссылка

ИЗ

Справочник.Номенклатура КАК Номенклатура

// В вычисляемом поле СКД:

// ПредставлениеСсылки(Ссылка)

Функция добавляется на закладке «Вычисляемые поля» конструктора СКД: в поле «Выражение» указывается ПредставлениеСсылки(Ссылка), тип значения — строка. В результате отчёта колонка будет содержать GUID каждой ссылки.

Как добавить GUID в отчёт на СКД
  1. 1
    Откройте схему компоновки данных отчёта
  2. 2
    В наборе данных выберите поле со ссылкой
  3. 3
    На закладке «Вычисляемые поля» добавьте поле GUID
  4. 4
    В выражении укажите ПредставлениеСсылки(Ссылка)
  5. 5
    Добавьте вычисляемое поле в выбранные поля настроек
  6. 6
    Сформируйте отчёт и проверьте колонку с идентификаторами

Способ 3: GUID в консоли запросов и для отладки

При отладке в консоли запросов результат содержит ссылки как объекты, и GUID в таблице не виден. Простой приём — обойти результат запроса в коде конфигуратора или во встроенной консоли кода и вывести идентификаторы в табличный документ или окно сообщений, как в примере из первого способа.

Ещё один вариант для разовой задачи — выгрузить результат запроса в таблицу значений методом Выгрузить(), добавить в неё колонку «GUID» и заполнить её в цикле. Полученную таблицу удобно сохранить в Excel или CSV для передачи во внешнюю систему.

ТаблицаРезультата = Запрос.Выполнить().Выгрузить();

ТаблицаРезультата.Колонки.Добавить("GUID", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36)));

Для Каждого СтрокаТЗ Из ТаблицаРезультата Цикл

СтрокаТЗ.GUID = Строка(СтрокаТЗ.Ссылка.УникальныйИдентификатор());

КонецЦикла;

При выгрузке GUID для интеграции сразу приводите значение к строке через Строка() — если оставить тип «УникальныйИдентификатор», при сериализации в XML или JSON формат может отличаться от ожидаемого принимающей системой.
ПЗ
Практическое замечание

Сравнение способов получения GUID

СпособГде работаетОграничения
Запрос + УникальныйИдентификатор()Любой код на встроенном языкеТребуется перебор выборки в цикле
ПредставлениеСсылки()Только СКД (отчёты, динамические списки)Недоступна в обычном запросе
Выгрузка в таблицу значенийЭкспорт, интеграции, отладкаДополнительный расход памяти на больших выборках
Прямое чтение _IDRRef из СУБДВнешние инструменты, SQLНарушение лицензионных ограничений на прямой доступ, риск рассинхронизации

Для прикладного кода почти всегда достаточно первого способа. Прямое чтение служебных полей таблиц СУБД средствами SQL следует исключить: это нарушает модель работы платформы и при обновлениях структуры может привести к ошибкам.

Типичные ошибки при работе с GUID

Первая частая ошибка — попытка написать УникальныйИдентификатор() прямо в тексте запроса. Запрос не компилируется, и начинающие разработчики тратят время на поиск «правильного синтаксиса», которого не существует. Решение — вынести получение GUID за пределы запроса.

Вторая ошибка — сравнение GUID как строк без учёта регистра. Разные системы могут возвращать идентификатор в верхнем или нижнем регистре, поэтому при сопоставлении строки стоит приводить к одному регистру функцией НРег(). Третья ошибка — забыть, что у пустой ссылки GUID состоит из нулей, и отправить такой «пустой» идентификатор во внешнюю систему как реальное значение.

Типичные ошибки
01
Вызов УникальныйИдентификатор() в тексте запроса — запрос не выполнится, метод доступен только в коде
02
Сравнение GUID-строк без приведения регистра — совпадающие идентификаторы распознаются как разные
03
Отсутствие проверки существования объекта после ПолучитьСсылку() — обращение к реквизитам «битой» ссылки даёт ошибку
04
Передача GUID пустой ссылки (все нули) во внешнюю систему без предварительной проверки

Как проверить корректность результата

Проверка проста: GUID должен быть строкой из 36 символов в формате 8-4-4-4-12 шестнадцатеричных цифр, разделённых дефисами. Для контроля можно взять один известный объект, получить его GUID кодом, затем выполнить обратное преобразование через ПолучитьСсылку() и убедиться, что полученная ссылка равна исходной.

При массовой выгрузке полезно проверить отсутствие дублей GUID в выгруженном наборе: идентификаторы уникальны по построению, и повтор означает, что в выборку попала одна и та же ссылка несколько раз — например, из-за соединения таблиц в запросе.

Контрольные точки

Как проверить результат

Формат строки GUID
Норма

36 символов, шаблон 8-4-4-4-12 с дефисами

Тревожный признак

Другая длина, отсутствие дефисов, посторонние символы

Обратное преобразование
Норма

ПолучитьСсылку(УИД) возвращает исходную ссылку

Тревожный признак

Ссылка не совпадает или объект не найден

Уникальность в выгрузке
Норма

Все GUID в наборе различны

Тревожный признак

Дубли — признак лишних соединений в запросе

Часто задаваемые вопросы

Можно ли получить GUID в обычном запросе без СКД?

Нет, штатной функции языка запросов для этого не существует. Выбирайте ссылку запросом и вызывайте метод УникальныйИдентификатор() в коде при обходе результата.

Чем отличается GUID ссылки от навигационной ссылки?

Навигационная ссылка (e1cib/data/...) — это адрес объекта для открытия в клиенте, она содержит GUID внутри, но предназначена для интерфейса. Для интеграций используется именно GUID — чистый идентификатор без служебного префикса.

Меняется ли GUID при переносе объекта между базами?

Нет, при штатном обмене данными GUID сохраняется, поэтому он и используется для сопоставления объектов в распределённых системах. Новый идентификатор объект получает только при создании новой ссылки.

Как получить GUID предопределённого элемента?

Так же, как для обычной ссылки: получите ссылку через менеджер, например Справочники.Валюты.Рубль, и вызовите УникальныйИдентификатор(). Отдельного механизма для предопределённых элементов не требуется.

Работает ли ПредставлениеСсылки() в динамическом списке?

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

Что вернёт УникальныйИдентификатор() для пустой ссылки?

Идентификатор из одних нулей: 00000000-0000-0000-0000-000000000000. Перед выгрузкой таких значений стоит проверять ссылку функцией Пустая() и обрабатывать их отдельно.

Итог

Что важно запомнить

GUID нельзя выбрать напрямую в тексте запроса — выбирайте ссылку и вызывайте УникальныйИдентификатор() в коде. В СКД используйте ПредставлениеСсылки(). Для обратного поиска применяйте ПолучитьСсылку() с проверкой существования объекта. Не обращайтесь к служебным полям СУБД напрямую.