Разработка и Конфигурация · 11 мин
Как в запросе 1С получить GUID ссылки
Как получить GUID ссылки в запросе 1С: функция УникальныйИдентификатор, представление ссылки, обмен данными между базами. Примеры кода и типичные ошибки.
GUID (глобально уникальный идентификатор) — внутренний идентификатор любой ссылочной сущности 1С: элемента справочника, документа, плана счетов. Он нужен при обмене между базами, интеграции с внешними системами, построении веб-сервисов и сопоставлении объектов без привязки к коду или наименованию. Однако у языка запросов 1С есть важное ограничение: у ссылки нет поля, которое напрямую вернуло бы GUID в текстовом виде.
Из-за этого задача «получить GUID в запросе» решается обходными путями: через представление ссылки, через выгрузку результата запроса и обработку его средствами встроенного языка, либо через хранение GUID в отдельном реквизите. Выбор способа зависит от того, где будет использоваться результат — внутри 1С или за её пределами.
Ниже разобраны все рабочие варианты с примерами кода, ограничения каждого подхода и способы проверить, что идентификатор получен корректно.
Почему GUID нельзя выбрать полем запроса
В языке запросов 1С поле ссылки возвращает объект типа «Ссылка», а не строку с идентификатором. Попытка написать что-то вроде ВЫБРАТЬ Ссылка.УникальныйИдентификатор приведёт к ошибке — конструктор запроса не знает такого поля. Метод УникальныйИдентификатор() существует только во встроенном языке и вызывается у конкретного объекта-ссылки.
Это осознанное ограничение платформы: запросы выполняются на уровне СУБД, где ссылка хранится как двоичное значение внутреннего формата. Преобразование в привычный строковый GUID вида «a1b2c3d4-...» выполняется уже на уровне платформы 1С, а не базы данных.
Способ 1: запрос выбирает ссылку, GUID получаем в коде
Самый распространённый и надёжный вариант: запросом выбираются ссылки, а GUID извлекается при обходе выборки средствами встроенного языка. Запрос остаётся простым, а вся логика преобразования — в модуле.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ГУИД = Выборка.Ссылка.УникальныйИдентификатор();
СтрокаГУИД = Строка(ГУИД);
Сообщить(Выборка.Наименование + " — " + СтрокаГУИД);
КонецЦикла;
Метод УникальныйИдентификатор() возвращает значение типа «УникальныйИдентификатор». Чтобы передать его во внешнюю систему или записать в текстовый файл, приведите его к строке функцией Строка() или оператором конкатенации.
Обратное преобразование тоже доступно: по строке GUID можно получить ссылку через Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД)). Это основной механизм сопоставления объектов при обмене.
ГУИД = Выборка.Ссылка.УникальныйИдентификатор();
СтрокаГУИД = Строка(ГУИД);Способ 2: представление ссылки в запросе
Если GUID нужен только для отображения пользователю или выгрузки «как есть», можно использовать виртуальное поле представления. В запросе доступна функция ПРЕДСТАВЛЕНИЕССЫЛКИ(), которая возвращает строковое представление ссылки.
ВЫБРАТЬ
ПРЕДСТАВЛЕНИЕССЫЛКИ(Номенклатура.Ссылка) КАК ПредставлениеСсылки
ИЗ
Справочник.Номенклатура КАК Номенклатура
Важно понимать ограничение: ПРЕДСТАВЛЕНИЕССЫЛКИ возвращает не GUID, а навигационное представление — обычно наименование или номер документа. Для получения именно идентификатора этот способ не подходит. Он полезен, когда задача — показать пользователю читаемую ссылку без соединений с другими таблицами.
Также в запросе можно вывести тип ссылки через ТИПЗНАЧЕНИЯ(Ссылка) — это помогает в запросах по составным типам, но к GUID отношения не имеет.
Способ 3: хранение GUID в отдельном реквизите
Когда GUID нужен именно в запросе — например, для соединения таблиц по идентификатору из внешней системы или для отбора — практичное решение: добавить к объекту строковый реквизит «GUID» и заполнять его при записи объекта.
// В подписке на событие ПередЗаписью или ПриЗаписи
Если ПустаяСтрока(Объект.GUID) Тогда
Объект.GUID = Строка(Объект.Ссылка.УникальныйИдентификатор());
КонецЕсли;
После этого идентификатор становится обычным полем запроса: его можно выбирать, по нему можно отбирать и соединять таблицы. Минус подхода — необходимость доработки конфигурации и первичного заполнения реквизита для существующих объектов обработкой.
Сравнение способов получения GUID
Выбор зависит от того, где будет использоваться идентификатор и допустима ли доработка конфигурации.
| Способ | Где работает | Когда выбирать | Ограничение |
|---|---|---|---|
| УникальныйИдентификатор() в коде | Встроенный язык | Выгрузки, обмены, API | Требует обхода выборки |
| ПРЕДСТАВЛЕНИЕССЫЛКИ() | Язык запросов | Отображение ссылки пользователю | Возвращает не GUID, а представление |
| Отдельный реквизит GUID | Язык запросов | Соединения и отборы по GUID | Нужна доработка и заполнение |
| Получение ссылки из GUID | Встроенный язык | Загрузка данных из внешних систем | Требует знать тип объекта |
Как выбрать подход
Поиск объекта по GUID: обратная задача
Часто GUID получают не для выгрузки, а для поиска: из внешней системы приходит строка идентификатора, и нужно найти объект в базе. Стандартный приём — метод ПолучитьСсылку() у менеджера соответствующего типа.
СтрокаГУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
НовыйГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(НовыйГУИД);
// Проверка, что объект реально существует
Запрос = Новый Запрос(
"ВЫБРАТЬ Номенклатура.Ссылка
|ИЗ Справочник.Номенклатура КАК Номенклатура
|ГДЕ Номенклатура.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Запрос.Выполнить().Пустой() Тогда
// Объекта с таким GUID в базе нет
КонецЕсли;
Обратите внимание: ПолучитьСсылку() вернёт ссылку даже для несуществующего объекта — это так называемая «битая ссылка». Проверять существование нужно запросом, как показано выше, либо через Ссылка.ПолучитьОбъект() с проверкой на Неопределено.
Проверка корректности полученного GUID
После получения идентификатора полезно убедиться, что он валиден и соответствует реальному объекту. Основные контрольные точки:
Как проверить результат
36 символов с дефисами: 8-4-4-4-12 шестнадцатеричных знаков
Строка другой длины, пустая или содержит наименование объекта
Запрос по ссылке возвращает одну строку
Запрос пустой — ссылка битая или объект удалён
Один и тот же GUID указывает на логически одинаковые объекты
GUID совпадает, но объекты разные — нарушен обмен
У всех активных объектов реквизит не пуст
Часть записей с пустым GUID — не выполнено первичное заполнение
Дополнительная проверка — обратное преобразование: взять полученную строку GUID, создать из неё УникальныйИдентификатор, получить ссылку и сравнить её с исходной. Если ссылки равны, преобразование выполнено корректно и идентификатор можно передавать во внешнюю систему.
FAQ
Можно ли получить GUID напрямую в запросе без кода?
Нет. Язык запросов 1С не имеет функции, возвращающей GUID ссылки в строковом виде. Минимально рабочий путь — выбрать ссылку запросом и вызвать УникальныйИдентификатор() при обходе результата. Альтернатива без кода — заранее хранить GUID в отдельном строковом реквизите объекта.
Чем ПРЕДСТАВЛЕНИЕССЫЛКИ отличается от GUID?
ПРЕДСТАВЛЕНИЕССЫЛКИ возвращает читаемое представление объекта: наименование элемента справочника или номер и дату документа. GUID — это внутренний идентификатор фиксированного формата. Первое предназначено для пользователя, второе — для машинного сопоставления объектов.
Как найти объект в базе, если известен только GUID?
Создайте значение идентификатора: Новый УникальныйИдентификатор(СтрокаГУИД), затем получите ссылку через менеджер нужного типа, например Справочники.Номенклатура.ПолучитьСсылку(ГУИД). После этого обязательно проверьте существование объекта запросом — ПолучитьСсылку не гарантирует, что объект есть в базе.
Сохраняется ли GUID при обмене между базами?
При обмене через планы обмена и типовые механизмы конвертации GUID, как правило, переносится, что обеспечивает сопоставление объектов. Однако при загрузке через произвольные обработки или создании объектов заново идентификатор может отличаться — это нужно проверять в конкретном механизме обмена.
Можно ли отобрать объекты в запросе по списку GUID?
Напрямую по строкам GUID отбор невозможен. Преобразуйте каждую строку в УникальныйИдентификатор, получите ссылки и передайте их в запрос списком через параметр с условием Ссылка В (&СписокСсылок). Либо используйте отдельный строковый реквизит GUID и отбирайте по нему.
Что делать, если GUID нужен в отчёте на СКД?
В схеме компоновки данных действует то же ограничение языка запросов. Варианты: добавить в конфигурацию строковый реквизит GUID и выводить его, использовать вычисляемое поле с вызовом функции из общего модуля, либо программно формировать отчёт с заполнением GUID в коде.
Что важно запомнить
GUID нельзя выбрать полем запроса 1С — у ссылки такого поля нет. Основной рабочий приём: запрос выбирает ссылки, а УникальныйИдентификатор() вызывается в коде при обходе результата. Если идентификатор нужен внутри запроса для соединений и отборов, добавьте строковый реквизит GUID и заполняйте его при записи. После ПолучитьСсылку всегда проверяйте существование объекта, чтобы не работать с битыми ссылками.