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

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

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

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

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

Из-за этого задача «получить GUID в запросе» решается обходными путями: через представление ссылки, через выгрузку результата запроса и обработку его средствами встроенного языка, либо через хранение GUID в отдельном реквизите. Выбор способа зависит от того, где будет использоваться результат — внутри 1С или за её пределами.

Ниже разобраны все рабочие варианты с примерами кода, ограничения каждого подхода и способы проверить, что идентификатор получен корректно.

Почему GUID нельзя выбрать полем запроса

В языке запросов 1С поле ссылки возвращает объект типа «Ссылка», а не строку с идентификатором. Попытка написать что-то вроде ВЫБРАТЬ Ссылка.УникальныйИдентификатор приведёт к ошибке — конструктор запроса не знает такого поля. Метод УникальныйИдентификатор() существует только во встроенном языке и вызывается у конкретного объекта-ссылки.

Это осознанное ограничение платформы: запросы выполняются на уровне СУБД, где ссылка хранится как двоичное значение внутреннего формата. Преобразование в привычный строковый GUID вида «a1b2c3d4-...» выполняется уже на уровне платформы 1С, а не базы данных.

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

Самый распространённый и надёжный вариант: запросом выбираются ссылки, а GUID извлекается при обходе выборки средствами встроенного языка. Запрос остаётся простым, а вся логика преобразования — в модуле.

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

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

"ВЫБРАТЬ

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

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

|ИЗ

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

|ГДЕ

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

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

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

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

СтрокаГУИД = Строка(ГУИД);

Сообщить(Выборка.Наименование + " — " + СтрокаГУИД);

КонецЦикла;

Метод УникальныйИдентификатор() возвращает значение типа «УникальныйИдентификатор». Чтобы передать его во внешнюю систему или записать в текстовый файл, приведите его к строке функцией Строка() или оператором конкатенации.

Обратное преобразование тоже доступно: по строке GUID можно получить ссылку через Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД)). Это основной механизм сопоставления объектов при обмене.

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

Способ 2: представление ссылки в запросе

Если GUID нужен только для отображения пользователю или выгрузки «как есть», можно использовать виртуальное поле представления. В запросе доступна функция ПРЕДСТАВЛЕНИЕССЫЛКИ(), которая возвращает строковое представление ссылки.

ВЫБРАТЬ

ПРЕДСТАВЛЕНИЕССЫЛКИ(Номенклатура.Ссылка) КАК ПредставлениеСсылки

ИЗ

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

Важно понимать ограничение: ПРЕДСТАВЛЕНИЕССЫЛКИ возвращает не GUID, а навигационное представление — обычно наименование или номер документа. Для получения именно идентификатора этот способ не подходит. Он полезен, когда задача — показать пользователю читаемую ссылку без соединений с другими таблицами.

Также в запросе можно вывести тип ссылки через ТИПЗНАЧЕНИЯ(Ссылка) — это помогает в запросах по составным типам, но к GUID отношения не имеет.

Способ 3: хранение GUID в отдельном реквизите

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

// В подписке на событие ПередЗаписью или ПриЗаписи

Если ПустаяСтрока(Объект.GUID) Тогда

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

КонецЕсли;

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

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

Выбор зависит от того, где будет использоваться идентификатор и допустима ли доработка конфигурации.

СпособГде работаетКогда выбиратьОграничение
УникальныйИдентификатор() в кодеВстроенный языкВыгрузки, обмены, APIТребует обхода выборки
ПРЕДСТАВЛЕНИЕССЫЛКИ()Язык запросовОтображение ссылки пользователюВозвращает не GUID, а представление
Отдельный реквизит GUIDЯзык запросовСоединения и отборы по GUIDНужна доработка и заполнение
Получение ссылки из GUIDВстроенный языкЗагрузка данных из внешних системТребует знать тип объекта
Маршрут решения

Как выбрать подход

GUID нужен для выгрузки в файл или веб-сервисВыбирайте ссылку запросом и вызывайте УникальныйИдентификатор() при обходе выборки
Нужно соединять таблицы в запросе по внешнему идентификаторуДобавьте строковый реквизит GUID и заполняйте его при записи объекта
Нужно только показать ссылку пользователю в отчётеИспользуйте ПРЕДСТАВЛЕНИЕССЫЛКИ() — GUID здесь не требуется
Получен GUID из другой базы и нужно найти объектИспользуйте ПолучитьСсылку(Новый УникальныйИдентификатор(Строка))

Поиск объекта по GUID: обратная задача

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

СтрокаГУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";

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

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

// Проверка, что объект реально существует

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

"ВЫБРАТЬ Номенклатура.Ссылка

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

|ГДЕ Номенклатура.Ссылка = &Ссылка");

Запрос.УстановитьПараметр("Ссылка", Ссылка);

Если Запрос.Выполнить().Пустой() Тогда

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

КонецЕсли;

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

Типичные ошибки
01
Попытка написать Ссылка.УникальныйИдентификатор в тексте запроса — конструктор выдаст ошибку, такого поля не существует
02
Использование ПРЕДСТАВЛЕНИЕССЫЛКИ как источника GUID — функция возвращает наименование или номер, а не идентификатор
03
Отсутствие проверки существования объекта после ПолучитьСсылку — в базе остаются битые ссылки
04
Сравнение GUID как строк с разным регистром символов при сопоставлении баз — приводите строки к одному регистру
05
Заполнение реквизита GUID только для новых объектов — старые записи остаются с пустым идентификатором

Проверка корректности полученного GUID

После получения идентификатора полезно убедиться, что он валиден и соответствует реальному объекту. Основные контрольные точки:

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

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

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

36 символов с дефисами: 8-4-4-4-12 шестнадцатеричных знаков

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

Строка другой длины, пустая или содержит наименование объекта

Существование объекта
Норма

Запрос по ссылке возвращает одну строку

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

Запрос пустой — ссылка битая или объект удалён

Сопоставление между базами
Норма

Один и тот же GUID указывает на логически одинаковые объекты

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

GUID совпадает, но объекты разные — нарушен обмен

Заполнение реквизита GUID
Норма

У всех активных объектов реквизит не пуст

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

Часть записей с пустым GUID — не выполнено первичное заполнение

Дополнительная проверка — обратное преобразование: взять полученную строку GUID, создать из неё УникальныйИдентификатор, получить ссылку и сравнить её с исходной. Если ссылки равны, преобразование выполнено корректно и идентификатор можно передавать во внешнюю систему.

FAQ

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

Нет. Язык запросов 1С не имеет функции, возвращающей GUID ссылки в строковом виде. Минимально рабочий путь — выбрать ссылку запросом и вызвать УникальныйИдентификатор() при обходе результата. Альтернатива без кода — заранее хранить GUID в отдельном строковом реквизите объекта.

Чем ПРЕДСТАВЛЕНИЕССЫЛКИ отличается от GUID?

ПРЕДСТАВЛЕНИЕССЫЛКИ возвращает читаемое представление объекта: наименование элемента справочника или номер и дату документа. GUID — это внутренний идентификатор фиксированного формата. Первое предназначено для пользователя, второе — для машинного сопоставления объектов.

Как найти объект в базе, если известен только GUID?

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

Сохраняется ли GUID при обмене между базами?

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

Можно ли отобрать объекты в запросе по списку GUID?

Напрямую по строкам GUID отбор невозможен. Преобразуйте каждую строку в УникальныйИдентификатор, получите ссылки и передайте их в запрос списком через параметр с условием Ссылка В (&СписокСсылок). Либо используйте отдельный строковый реквизит GUID и отбирайте по нему.

Что делать, если GUID нужен в отчёте на СКД?

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

Итог

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

GUID нельзя выбрать полем запроса 1С — у ссылки такого поля нет. Основной рабочий приём: запрос выбирает ссылки, а УникальныйИдентификатор() вызывается в коде при обходе результата. Если идентификатор нужен внутри запроса для соединений и отборов, добавьте строковый реквизит GUID и заполняйте его при записи. После ПолучитьСсылку всегда проверяйте существование объекта, чтобы не работать с битыми ссылками.