Разработка и Конфигурация · 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 каждой ссылки.
- 1Откройте схему компоновки данных отчёта
- 2В наборе данных выберите поле со ссылкой
- 3На закладке «Вычисляемые поля» добавьте поле GUID
- 4В выражении укажите ПредставлениеСсылки(Ссылка)
- 5Добавьте вычисляемое поле в выбранные поля настроек
- 6Сформируйте отчёт и проверьте колонку с идентификаторами
Способ 3: GUID в консоли запросов и для отладки
При отладке в консоли запросов результат содержит ссылки как объекты, и GUID в таблице не виден. Простой приём — обойти результат запроса в коде конфигуратора или во встроенной консоли кода и вывести идентификаторы в табличный документ или окно сообщений, как в примере из первого способа.
Ещё один вариант для разовой задачи — выгрузить результат запроса в таблицу значений методом Выгрузить(), добавить в неё колонку «GUID» и заполнить её в цикле. Полученную таблицу удобно сохранить в Excel или CSV для передачи во внешнюю систему.
ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
ТаблицаРезультата.Колонки.Добавить("GUID", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(36)));
Для Каждого СтрокаТЗ Из ТаблицаРезультата Цикл
СтрокаТЗ.GUID = Строка(СтрокаТЗ.Ссылка.УникальныйИдентификатор());
КонецЦикла;
При выгрузке GUID для интеграции сразу приводите значение к строке через Строка() — если оставить тип «УникальныйИдентификатор», при сериализации в XML или JSON формат может отличаться от ожидаемого принимающей системой.
Сравнение способов получения GUID
| Способ | Где работает | Ограничения |
|---|---|---|
| Запрос + УникальныйИдентификатор() | Любой код на встроенном языке | Требуется перебор выборки в цикле |
| ПредставлениеСсылки() | Только СКД (отчёты, динамические списки) | Недоступна в обычном запросе |
| Выгрузка в таблицу значений | Экспорт, интеграции, отладка | Дополнительный расход памяти на больших выборках |
| Прямое чтение _IDRRef из СУБД | Внешние инструменты, SQL | Нарушение лицензионных ограничений на прямой доступ, риск рассинхронизации |
Для прикладного кода почти всегда достаточно первого способа. Прямое чтение служебных полей таблиц СУБД средствами SQL следует исключить: это нарушает модель работы платформы и при обновлениях структуры может привести к ошибкам.
Типичные ошибки при работе с GUID
Первая частая ошибка — попытка написать УникальныйИдентификатор() прямо в тексте запроса. Запрос не компилируется, и начинающие разработчики тратят время на поиск «правильного синтаксиса», которого не существует. Решение — вынести получение GUID за пределы запроса.
Вторая ошибка — сравнение GUID как строк без учёта регистра. Разные системы могут возвращать идентификатор в верхнем или нижнем регистре, поэтому при сопоставлении строки стоит приводить к одному регистру функцией НРег(). Третья ошибка — забыть, что у пустой ссылки GUID состоит из нулей, и отправить такой «пустой» идентификатор во внешнюю систему как реальное значение.
Как проверить корректность результата
Проверка проста: GUID должен быть строкой из 36 символов в формате 8-4-4-4-12 шестнадцатеричных цифр, разделённых дефисами. Для контроля можно взять один известный объект, получить его GUID кодом, затем выполнить обратное преобразование через ПолучитьСсылку() и убедиться, что полученная ссылка равна исходной.
При массовой выгрузке полезно проверить отсутствие дублей GUID в выгруженном наборе: идентификаторы уникальны по построению, и повтор означает, что в выборку попала одна и та же ссылка несколько раз — например, из-за соединения таблиц в запросе.
Как проверить результат
36 символов, шаблон 8-4-4-4-12 с дефисами
Другая длина, отсутствие дефисов, посторонние символы
ПолучитьСсылку(УИД) возвращает исходную ссылку
Ссылка не совпадает или объект не найден
Все GUID в наборе различны
Дубли — признак лишних соединений в запросе
Часто задаваемые вопросы
Можно ли получить GUID в обычном запросе без СКД?
Нет, штатной функции языка запросов для этого не существует. Выбирайте ссылку запросом и вызывайте метод УникальныйИдентификатор() в коде при обходе результата.
Чем отличается GUID ссылки от навигационной ссылки?
Навигационная ссылка (e1cib/data/...) — это адрес объекта для открытия в клиенте, она содержит GUID внутри, но предназначена для интерфейса. Для интеграций используется именно GUID — чистый идентификатор без служебного префикса.
Меняется ли GUID при переносе объекта между базами?
Нет, при штатном обмене данными GUID сохраняется, поэтому он и используется для сопоставления объектов в распределённых системах. Новый идентификатор объект получает только при создании новой ссылки.
Как получить GUID предопределённого элемента?
Так же, как для обычной ссылки: получите ссылку через менеджер, например Справочники.Валюты.Рубль, и вызовите УникальныйИдентификатор(). Отдельного механизма для предопределённых элементов не требуется.
Работает ли ПредставлениеСсылки() в динамическом списке?
Да, динамические списки построены на СКД, поэтому функцию можно использовать в вычисляемых полях. В обычном тексте запроса вне СКД она недоступна.
Что вернёт УникальныйИдентификатор() для пустой ссылки?
Идентификатор из одних нулей: 00000000-0000-0000-0000-000000000000. Перед выгрузкой таких значений стоит проверять ссылку функцией Пустая() и обрабатывать их отдельно.
Что важно запомнить
GUID нельзя выбрать напрямую в тексте запроса — выбирайте ссылку и вызывайте УникальныйИдентификатор() в коде. В СКД используйте ПредставлениеСсылки(). Для обратного поиска применяйте ПолучитьСсылку() с проверкой существования объекта. Не обращайтесь к служебным полям СУБД напрямую.