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

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

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

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

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

Проблема в том, что язык запросов 1С не имеет прямой функции «вернуть ГУИД ссылки» в том виде, в каком его видит разработчик во встроенном языке. В запросе ссылка хранится как значение специального типа, и получить её текстовое представление средствами самого запроса можно только обходными путями. Поэтому на практике применяют несколько подходов: постобработку результата запроса, функции встроенного языка, хранение ГУИДа в отдельном реквизите.

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

Что такое ГУИД в 1С и где он хранится

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

Встроенный язык даёт прямой доступ к идентификатору через метод УникальныйИдентификатор() объекта типа «Ссылка». Метод возвращает значение типа «УникальныйИдентификатор», которое при приведении к строке принимает привычный вид: 8 символов-4-4-4-12, например a3f1c2d4-5b6e-4a7f-9c8d-1e2f3a4b5c6d.

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

Почему в запросе нельзя просто выбрать ГУИД

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

Функция ПОДСТРОКА() и другие строковые операции к ссылке неприменимы: тип «ссылка» не является строкой. Попытка привести ссылку к строке в тексте запроса приведёт к ошибке компиляции запроса.

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

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

Способ 1: постобработка результата запроса

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

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

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

КонецЦикла;

Если результат нужен в виде таблицы с колонкой ГУИДа, удобно выгрузить запрос в таблицу значений, добавить колонку и заполнить её в цикле. Это избавляет от повторного обхода выборки.

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

Способ 2: хранение ГУИДа в отдельном реквизите

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

Процедура ПередЗаписью(Отказ)

Если ПустаяСтрока(ГУИД) Тогда

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

КонецЕсли;

КонецПроцедуры

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

После добавления реквизита потребуется разовое массовое заполнение для существующих объектов — обработкой, которая обходит все элементы и проставляет идентификаторы. Без этого старые записи будут выбираться с пустым ГУИДом.

Способ 3: получить ссылку по известному ГУИДу в запросе

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

ГУИД = Новый УникальныйИдентификатор("a3f1c2d4-5b6e-4a7f-9c8d-1e2f3a4b5c6d");

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

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

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

"ВЫБРАТЬ

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

|ИЗ

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

|ГДЕ

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

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

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

Сравнение подходов и выбор решения

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

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

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

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

Проверка результата и контроль корректности

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

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

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

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

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

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

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

Пустая строка, текст вида «Справочник.Номенклатура» или представление объекта

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

По ГУИДу через ПолучитьСсылку находится тот же объект

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

ПолучитьСсылку возвращает несуществующий объект

Полнота выгрузки
Норма

У всех выгруженных записей ГУИД заполнен

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

Часть записей с пустым идентификатором

Ограничения и частые вопросы производительности

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

Хранение ГУИДа в реквизите ускоряет выборки, но добавляет избыточность и требует контроля целостности: при конвертации данных, загрузке из внешних источников или обмене реквизит может остаться незаполненным, если обработчики записи не сработали (например, при загрузке в режиме обмена данными с отключённой логикой).

Итог

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

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

Часто задаваемые вопросы

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

Штатной функции языка запросов для этого нет. Единственный способ выбрать идентификатор как поле запроса — заранее сохранить его в строковом реквизите объекта и выбирать этот реквизит. Все прочие варианты предполагают постобработку результата средствами встроенного языка.

Чем отличается ПРЕДСТАВЛЕНИЕ(Ссылка) от ГУИДа?

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

Как найти объект, если известен только ГУИД из другой базы?

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

Почему ПолучитьСсылку вернула ссылку, но объекта в базе нет?

Метод ПолучитьСсылку не проверяет существование объекта — он конструирует ссылку из идентификатора. Если объект с таким ГУИДом отсутствует, получается «битая» ссылка. Проверяйте существование через ПолучитьОбъект() или запросом к таблице объекта.

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

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

Можно ли использовать ГУИД в отчёте на СКД?

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