Разработка и Конфигурация · 10 мин
Как получить ГУИД запросом в 1С
Как получить ГУИД (уникальный идентификатор) ссылки запросом в 1С: функция UUID из СКД, представление ссылки, поиск по ГУИДу, типичные ошибки и ограничения.
Задача получить уникальный идентификатор (GUID, ГУИД) объекта прямо в запросе возникает у разработчиков 1С регулярно: при обмене данными с внешними системами, при выгрузке в Excel или JSON, при сопоставлении записей между базами. Проблема в том, что язык запросов 1С не имеет встроенной функции, которая возвращала бы ГУИД ссылки в виде строки — поле ссылки выводится как ссылка, а не как её текстовое представление.
Тем не менее рабочие способы существуют. Основные из них: использование функции СКД, которая доступна в тексте запроса при определённых настройках, получение представления ссылки, вычисление идентификатора на стороне встроенного языка после выполнения запроса и обратная задача — поиск ссылки по известному ГУИДу. Каждый вариант имеет свои условия применения и ограничения.
Почему запрос не возвращает ГУИД напрямую
В языке запросов 1С ссылочные поля имеют ссылочный тип, а не строковый. Платформа хранит уникальный идентификатор внутри ссылки, но не предоставляет оператора запроса для его извлечения в виде строки «XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX». Это осознанное ограничение: запрос оптимизирован для соединений и отборов по ссылкам, а не для работы с их внутренним представлением.
Поэтому все решения делятся на две группы. Первая — получить идентификатор на этапе выполнения запроса с помощью механизма СКД. Вторая — выполнить обычный запрос, получить ссылки и затем в коде встроенного языка вызвать у каждой ссылки метод УникальныйИдентификатор(). Выбор зависит от того, где используется результат: в отчёте СКД, в произвольной выгрузке или в обработке обмена.
Способ 1. Функция СКД в тексте запроса
Если запрос выполняется в контексте системы компоновки данных (отчёт на СКД, динамический список, набор данных), можно использовать вычисляемые выражения СКД. На практике чаще всего применяют приём с функцией получения представления ссылки либо создают вычисляемое поле, в котором на языке выражений СКД вызывают метод получения идентификатора.
Типовой подход для отчёта на СКД: добавить вычисляемое поле с именем, например, «ГУИД», и в выражении ресурса или в событии формирования использовать код, который по ссылке возвращает строку идентификатора. В наборе данных-запросе сам текст запроса остаётся обычным — выбирается ссылка, а преобразование выполняется на уровне компоновки.
Ограничение способа: он работает только там, где запрос исполняется механизмом СКД. Если вы выполняете запрос программно через объект Запрос и метод Выполнить(), функции СКД в тексте запроса недоступны — платформа выдаст ошибку о неизвестном операторе.
Способ 2. Получение ГУИДа в коде после выполнения запроса
Самый надёжный и универсальный вариант — выбрать ссылки запросом, а затем в цикле обхода выборки получить идентификатор каждой ссылки. У любой ссылки есть метод УникальныйИдентификатор(), возвращающий значение типа УникальныйИдентификатор, которое легко преобразуется в строку.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ГУИДСтрокой = Строка(Выборка.Ссылка.УникальныйИдентификатор());
// Дальше используем ГУИДСтрокой: выгрузка, сопоставление и т.д.
КонецЦикла;
Такой подход не зависит от контекста выполнения, работает и в толстом, и в тонком клиенте, и на сервере. Накладные расходы минимальны: метод УникальныйИдентификатор() не обращается к базе данных, идентификатор извлекается из уже полученной ссылки.
Если результат нужен в виде таблицы значений с колонкой «ГУИД», выгрузите результат запроса через Выгрузить(), добавьте колонку строкового типа и заполните её в цикле. Это удобно для последующей выгрузки в файл или передачи через веб-сервис.
- 1Сформируйте запрос, выбирающий поле Ссылка нужного объекта
- 2Выполните запрос и получите выборку или таблицу значений
- 3В цикле для каждой ссылки вызовите Ссылка.УникальныйИдентификатор()
- 4Преобразуйте результат в строку функцией Строка() или подставьте в структуру/JSON
- 5Проверьте формат: 36 символов с дефисами, без фигурных скобок
Способ 3. Представление ссылки и его ограничения
В запросе доступна функция ПРЕДСТАВЛЕНИЕ(Ссылка), но она возвращает пользовательское представление объекта — наименование, номер и дату документа, а не ГУИД. Путать эти вещи нельзя: представление не является уникальным идентификатором и может совпадать у разных объектов.
Для выгрузки внешнему потребителю представление полезно как человекочитаемое поле рядом с ГУИДом, но использовать его как ключ сопоставления между базами недопустимо. Ключом обмена должен быть именно уникальный идентификатор либо специально ведущий код взаимодействия.
Обратная задача: найти ссылку по ГУИДу
Часто требуется не выгрузить ГУИД, а наоборот — по строке идентификатора, полученной из внешней системы, найти объект в базе. Это делается не запросом, а методом менеджера объекта:
ГУИД = Новый УникальныйИдентификатор("8a3f2c10-1b2d-4e5f-9a8b-7c6d5e4f3a2b");
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
// Объект с таким ГУИДом в базе отсутствует
КонецЕсли;
Обратите внимание: ПолучитьСсылку() всегда вернёт ссылку, даже если объекта с таким идентификатором в базе нет. Проверка существования выполняется отдельно — через попытку получить объект или через запрос с условием ГДЕ Ссылка = &Ссылка. Пропуск этой проверки — частая причина «битых ссылок» после обмена.
Запросом искать по ГУИДу напрямую нельзя — нельзя написать условие вида ГДЕ Ссылка = "8a3f2c10...", потому что строка не приводится к ссылке автоматически. Сначала строку нужно преобразовать в УникальныйИдентификатор, затем в ссылку конкретного типа, и только потом использовать как параметр запроса.
Проверка результата и типичные ошибки
После реализации любого из способов проверьте несколько контрольных точек. Строковый ГУИД должен содержать ровно 36 символов: 32 шестнадцатеричные цифры и 4 дефиса. При передаче во внешние системы уточните, требуется ли обрамление фигурными скобками и верхний регистр — разные платформы ожидают разный формат.
Как проверить результат
36 символов, формат 8-4-4-4-12 с дефисами
Другая длина, буквы вне диапазона a-f, отсутствие дефисов
ПолучитьОбъект() возвращает объект, реквизиты читаются
Полученная ссылка «битая» — объекта в базе нет
Один и тот же объект имеет одинаковый ГУИД в обеих базах
ГУИДы различаются — объект создавался независимо, а не переносился
Выбор подхода под задачу
Для отчётов на СКД, где ГУИД нужен как колонка результата, используйте вычисляемые поля компоновки — это не требует изменения запроса. Для выгрузок, обменов и произвольных обработок выполняйте обычный запрос по ссылкам и получайте идентификатор в коде — это универсально и предсказуемо.
Если ГУИД нужен постоянно как ключ интеграции, подумайте о хранении его в отдельном строковом реквизите, заполняемом при записи объекта. Тогда его можно будет выбирать и фильтровать прямо в запросе без дополнительных преобразований. Минус — дополнительное поле и необходимость контролировать его заполнение для старых данных.
Как выбрать действие
Независимо от выбранного способа помните о главном ограничении: язык запросов 1С работает со ссылками, а не с их строковым представлением. Все преобразования выполняются либо механизмом СКД, либо встроенным языком — и попытки «вытащить» ГУИД чистым запросом обречены на поиск обходных путей, описанных выше.
Что важно запомнить
Встроенной функции получения ГУИДа в языке запросов 1С нет. Используйте вычисляемые поля СКД в отчётах или метод УникальныйИдентификатор() у ссылки в коде после выполнения запроса. Для обратного поиска преобразуйте строку в УникальныйИдентификатор и вызовите ПолучитьСсылку(), обязательно проверяя существование объекта.
Частые вопросы
Можно ли получить ГУИД чистым запросом без кода?
Штатного оператора для этого нет. В контексте СКД задача решается вычисляемыми полями, вне СКД — только обходом выборки в коде с вызовом УникальныйИдентификатор() у ссылки.
Почему условие ГДЕ Ссылка = "строка гуида" не работает?
Строка не приводится к ссылке автоматически — это разные типы. Строку нужно сначала преобразовать в УникальныйИдентификатор, затем получить ссылку методом ПолучитьСсылку() и передать её в запрос параметром.
Одинаков ли ГУИД объекта в разных базах?
Только если объект переносился между базами с сохранением ссылки (например, типовым обменом или выгрузкой). Если объект создан независимо в каждой базе, идентификаторы будут разными даже при совпадающем наименовании и коде.
Что вернёт ПолучитьСсылку(), если объекта с таким ГУИДом нет?
Метод вернёт корректную ссылку с указанным идентификатором, но объекта за ней не будет. Обращение к реквизитам такой ссылки даст пустые значения, а ПолучитьОбъект() вернёт Неопределено — это и есть признак «битой» ссылки.
Замедляет ли запрос получение ГУИДа в цикле?
Нет. Метод УникальныйИдентификатор() не обращается к базе данных — идентификатор извлекается из уже полученной ссылки, поэтому накладные расходы минимальны даже на больших выборках.