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

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

Как получить ГУИД запросом в 1С

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

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

Тем не менее рабочие способы существуют. Основные из них: использование функции СКД, которая доступна в тексте запроса при определённых настройках, получение представления ссылки, вычисление идентификатора на стороне встроенного языка после выполнения запроса и обратная задача — поиск ссылки по известному ГУИДу. Каждый вариант имеет свои условия применения и ограничения.

Почему запрос не возвращает ГУИД напрямую

В языке запросов 1С ссылочные поля имеют ссылочный тип, а не строковый. Платформа хранит уникальный идентификатор внутри ссылки, но не предоставляет оператора запроса для его извлечения в виде строки «XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX». Это осознанное ограничение: запрос оптимизирован для соединений и отборов по ссылкам, а не для работы с их внутренним представлением.

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

Способ 1. Функция СКД в тексте запроса

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

Типовой подход для отчёта на СКД: добавить вычисляемое поле с именем, например, «ГУИД», и в выражении ресурса или в событии формирования использовать код, который по ссылке возвращает строку идентификатора. В наборе данных-запросе сам текст запроса остаётся обычным — выбирается ссылка, а преобразование выполняется на уровне компоновки.

Ограничение способа: он работает только там, где запрос исполняется механизмом СКД. Если вы выполняете запрос программно через объект Запрос и метод Выполнить(), функции СКД в тексте запроса недоступны — платформа выдаст ошибку о неизвестном операторе.

Способ 2. Получение ГУИДа в коде после выполнения запроса

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

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

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

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

// Дальше используем ГУИДСтрокой: выгрузка, сопоставление и т.д.

КонецЦикла;

Такой подход не зависит от контекста выполнения, работает и в толстом, и в тонком клиенте, и на сервере. Накладные расходы минимальны: метод УникальныйИдентификатор() не обращается к базе данных, идентификатор извлекается из уже полученной ссылки.

Если результат нужен в виде таблицы значений с колонкой «ГУИД», выгрузите результат запроса через Выгрузить(), добавьте колонку строкового типа и заполните её в цикле. Это удобно для последующей выгрузки в файл или передачи через веб-сервис.

Порядок действий
  1. 1
    Сформируйте запрос, выбирающий поле Ссылка нужного объекта
  2. 2
    Выполните запрос и получите выборку или таблицу значений
  3. 3
    В цикле для каждой ссылки вызовите Ссылка.УникальныйИдентификатор()
  4. 4
    Преобразуйте результат в строку функцией Строка() или подставьте в структуру/JSON
  5. 5
    Проверьте формат: 36 символов с дефисами, без фигурных скобок

Способ 3. Представление ссылки и его ограничения

В запросе доступна функция ПРЕДСТАВЛЕНИЕ(Ссылка), но она возвращает пользовательское представление объекта — наименование, номер и дату документа, а не ГУИД. Путать эти вещи нельзя: представление не является уникальным идентификатором и может совпадать у разных объектов.

Для выгрузки внешнему потребителю представление полезно как человекочитаемое поле рядом с ГУИДом, но использовать его как ключ сопоставления между базами недопустимо. Ключом обмена должен быть именно уникальный идентификатор либо специально ведущий код взаимодействия.

Обратная задача: найти ссылку по ГУИДу

Часто требуется не выгрузить ГУИД, а наоборот — по строке идентификатора, полученной из внешней системы, найти объект в базе. Это делается не запросом, а методом менеджера объекта:

ГУИД = Новый УникальныйИдентификатор("8a3f2c10-1b2d-4e5f-9a8b-7c6d5e4f3a2b");

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

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

// Объект с таким ГУИДом в базе отсутствует

КонецЕсли;

Обратите внимание: ПолучитьСсылку() всегда вернёт ссылку, даже если объекта с таким идентификатором в базе нет. Проверка существования выполняется отдельно — через попытку получить объект или через запрос с условием ГДЕ Ссылка = &Ссылка. Пропуск этой проверки — частая причина «битых ссылок» после обмена.

Запросом искать по ГУИДу напрямую нельзя — нельзя написать условие вида ГДЕ Ссылка = "8a3f2c10...", потому что строка не приводится к ссылке автоматически. Сначала строку нужно преобразовать в УникальныйИдентификатор, затем в ссылку конкретного типа, и только потом использовать как параметр запроса.

Проверка результата и типичные ошибки

После реализации любого из способов проверьте несколько контрольных точек. Строковый ГУИД должен содержать ровно 36 символов: 32 шестнадцатеричные цифры и 4 дефиса. При передаче во внешние системы уточните, требуется ли обрамление фигурными скобками и верхний регистр — разные платформы ожидают разный формат.

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

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

Длина строки ГУИДа
Норма

36 символов, формат 8-4-4-4-12 с дефисами

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

Другая длина, буквы вне диапазона a-f, отсутствие дефисов

Поиск ссылки по ГУИДу
Норма

ПолучитьОбъект() возвращает объект, реквизиты читаются

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

Полученная ссылка «битая» — объекта в базе нет

Перенос между базами
Норма

Один и тот же объект имеет одинаковый ГУИД в обеих базах

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

ГУИДы различаются — объект создавался независимо, а не переносился

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

Выбор подхода под задачу

Для отчётов на СКД, где ГУИД нужен как колонка результата, используйте вычисляемые поля компоновки — это не требует изменения запроса. Для выгрузок, обменов и произвольных обработок выполняйте обычный запрос по ссылкам и получайте идентификатор в коде — это универсально и предсказуемо.

Если ГУИД нужен постоянно как ключ интеграции, подумайте о хранении его в отдельном строковом реквизите, заполняемом при записи объекта. Тогда его можно будет выбирать и фильтровать прямо в запросе без дополнительных преобразований. Минус — дополнительное поле и необходимость контролировать его заполнение для старых данных.

Маршрут решения

Как выбрать действие

Нужен ГУИД в отчёте на СКДДобавьте вычисляемое поле в схеме компоновки, текст запроса не меняйте
Нужна выгрузка ГУИДов из кодаВыполните запрос по ссылкам и вызовите УникальныйИдентификатор() в цикле обхода
Нужно найти объект по строке ГУИДаПреобразуйте строку в УникальныйИдентификатор и вызовите ПолучитьСсылку() у менеджера объекта
ГУИД нужен в запросах постоянноДобавьте строковый реквизит для хранения идентификатора и заполняйте его при записи

Независимо от выбранного способа помните о главном ограничении: язык запросов 1С работает со ссылками, а не с их строковым представлением. Все преобразования выполняются либо механизмом СКД, либо встроенным языком — и попытки «вытащить» ГУИД чистым запросом обречены на поиск обходных путей, описанных выше.

Итог

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

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

Частые вопросы

Можно ли получить ГУИД чистым запросом без кода?

Штатного оператора для этого нет. В контексте СКД задача решается вычисляемыми полями, вне СКД — только обходом выборки в коде с вызовом УникальныйИдентификатор() у ссылки.

Почему условие ГДЕ Ссылка = "строка гуида" не работает?

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

Одинаков ли ГУИД объекта в разных базах?

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

Что вернёт ПолучитьСсылку(), если объекта с таким ГУИДом нет?

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

Замедляет ли запрос получение ГУИДа в цикле?

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