Разработка и Конфигурация · 11 мин
Как получить ГУИД в запросе 1С
Как получить ГУИД (уникальный идентификатор) в запросе 1С: УникальныйИдентификатор(), ЗначениеВСтрокуВнутр, представление ссылки, типовые ошибки и примеры кода.
ГУИД (GUID, глобальный уникальный идентификатор) в 1С — это 128-битное значение, которое платформа присваивает каждой ссылке на объект базы: документу, элементу справочника, записи регистрации. Он нужен, когда данные обмениваются между базами, выгружаются во внешние системы или когда требуется однозначно найти объект без привязки к коду и наименованию.
Проблема в том, что язык запросов 1С не имеет прямой функции «вернуть ГУИД ссылки» в том виде, в каком его видит разработчик во встроенном языке. В запросе ссылка хранится как значение специального типа, и получить её текстовое представление средствами самого запроса можно только обходными путями. Поэтому на практике применяют несколько подходов: постобработку результата запроса, функции встроенного языка, хранение ГУИДа в отдельном реквизите.
Ниже разобраны рабочие способы получить уникальный идентификатор объекта при выполнении запроса, их ограничения, типовые ошибки и критерии выбора подходящего варианта.
Что такое ГУИД в 1С и где он хранится
Уникальный идентификатор — это свойство любой ссылки на объект базы данных. Он формируется платформой в момент создания объекта и не меняется на протяжении всей его жизни, даже при изменении кода, номера или наименования. Именно поэтому ГУИД используют как ключ при синхронизации разных информационных баз.
Встроенный язык даёт прямой доступ к идентификатору через метод УникальныйИдентификатор() объекта типа «Ссылка». Метод возвращает значение типа «УникальныйИдентификатор», которое при приведении к строке принимает привычный вид: 8 символов-4-4-4-12, например a3f1c2d4-5b6e-4a7f-9c8d-1e2f3a4b5c6d.
Обратная операция тоже существует: по строке с ГУИДом можно получить ссылку через метод менеджера объекта ПолучитьСсылку(Новый УникальныйИдентификатор(СтрокаГУИД)). Это основа большинства механизмов обмена.
Почему в запросе нельзя просто выбрать ГУИД
Язык запросов 1С работает с полями таблиц базы данных. Ссылка хранится в поле типа «ссылка» как внутреннее двоичное значение, и у запроса нет инструмента преобразовать его в строку ГУИДа. Функция ПРЕДСТАВЛЕНИЕ() возвращает отображаемое представление объекта (например, «Реализация товаров 0000123 от 12.05»), а не идентификатор — это частая причина путаницы.
Функция ПОДСТРОКА() и другие строковые операции к ссылке неприменимы: тип «ссылка» не является строкой. Попытка привести ссылку к строке в тексте запроса приведёт к ошибке компиляции запроса.
Поэтому все рабочие приёмы делятся на две группы: те, где ГУИД вычисляется после выполнения запроса средствами встроенного языка, и те, где идентификатор заранее сохранён в базе как обычный строковый реквизит.
Способ 1: постобработка результата запроса
Самый универсальный вариант: выбрать ссылки запросом, а затем в цикле по выборке получить идентификатор каждой ссылки методом УникальныйИдентификатор(). Подходит для разовых выгрузок, формирования файлов обмена и отчётов, где объём данных умеренный.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ГУИДСтрокой = Строка(Выборка.Ссылка.УникальныйИдентификатор());
// Дальше ГУИДСтрокой используется: записывается в файл, таблицу значений и т.д.
КонецЦикла;
Если результат нужен в виде таблицы с колонкой ГУИДа, удобно выгрузить запрос в таблицу значений, добавить колонку и заполнить её в цикле. Это избавляет от повторного обхода выборки.
Ограничение способа — производительность на больших объёмах: обращение к свойству ссылки в цикле само по себе быстрое, но если вместе с ГУИДом нужно читать много реквизитов через точку, лучше выбирать их в запросе, а в цикле брать только идентификатор.
Способ 2: хранение ГУИДа в отдельном реквизите
Если ГУИД нужен регулярно — например, база участвует в постоянном обмене с внешней системой — рационально добавить в справочник или документ строковый реквизит длиной 36 символов и заполнять его при записи объекта. Тогда запрос выбирает ГУИД как обычное поле, без постобработки.
Процедура ПередЗаписью(Отказ)
Если ПустаяСтрока(ГУИД) Тогда
ГУИД = Строка(Ссылка.УникальныйИдентификатор());
КонецЕсли;
КонецПроцедуры
Нюанс: у нового объекта ссылка появляется только после записи, поэтому для новых объектов идентификатор надёжнее брать через ПолучитьСсылкуНового() или заполнять реквизит в обработчике ПриЗаписи, когда ссылка уже существует. Заполнение в ПередЗаписью корректно работает для уже записанных объектов.
После добавления реквизита потребуется разовое массовое заполнение для существующих объектов — обработкой, которая обходит все элементы и проставляет идентификаторы. Без этого старые записи будут выбираться с пустым ГУИДом.
Способ 3: получить ссылку по известному ГУИДу в запросе
Обратная задача встречается чаще: из внешней системы пришёл ГУИД, и нужно найти объект в запросе. Здесь всё делается штатно — строка преобразуется в значение типа «УникальныйИдентификатор», из него строится ссылка, которая передаётся в запрос параметром.
ГУИД = Новый УникальныйИдентификатор("a3f1c2d4-5b6e-4a7f-9c8d-1e2f3a4b5c6d");
СсылкаНаОбъект = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
Если объекта с таким идентификатором в базе нет, ПолучитьСсылку() всё равно вернёт ссылку — «битую». Проверить существование можно через СсылкаНаОбъект.ПолучитьОбъект() (вернёт Неопределено для несуществующего) или запросом с группировкой по ссылке и проверкой результата на пустоту.
Сравнение подходов и выбор решения
Выбор способа зависит от частоты задачи, объёма данных и возможности менять конфигурацию. Для типовых конфигураций на поддержке добавление реквизита может быть нежелательно — тогда остаётся постобработка или расширение конфигурации.
| Критерий | Постобработка в цикле | Отдельный реквизит с ГУИДом |
|---|---|---|
| Изменение конфигурации | Не требуется | Требуется (или расширение) |
| Скорость выборки | Запрос быстрый, цикл добавляет время | ГУИД выбирается прямо в запросе |
| Использование в СКД и отчётах | Невозможно без обработки | Поле доступно как обычный реквизит |
| Разовая задача | Оптимально | Избыточно |
| Постоянный обмен | Допустимо, но медленнее | Оптимально |
Как выбрать действие
Проверка результата и контроль корректности
После реализации любого из способов стоит убедиться, что идентификаторы получены и соответствуют объектам. Самая простая проверка — взять один объект, получить его ГУИД через Ссылка.УникальныйИдентификатор() в консоли кода и сравнить со значением, которое вернула разработанная процедура.
Для массовых выгрузок полезно контролировать количество пустых или дублирующихся идентификаторов: пустые строки указывают на незаполненный реквизит, а дубли ГУИДов в одной базе — признак ошибки логики выборки (например, соединения таблиц, размножившего строки).
Как проверить результат
36 символов: 8-4-4-4-12 шестнадцатеричных цифр через дефисы
Пустая строка, текст вида «Справочник.Номенклатура» или представление объекта
По ГУИДу через ПолучитьСсылку находится тот же объект
ПолучитьСсылку возвращает несуществующий объект
У всех выгруженных записей ГУИД заполнен
Часть записей с пустым идентификатором
Ограничения и частые вопросы производительности
Постобработка в цикле масштабируется линейно: обращение Выборка.Ссылка.УникальныйИдентификатор() не выполняет обращения к базе, идентификатор извлекается из самой ссылки, поэтому даже сотни тысяч строк обрабатываются приемлемо быстро. Узким местом становится не получение ГУИДа, а дочитывание реквизитов через точку — этого следует избегать, выбирая данные в запросе.
Хранение ГУИДа в реквизите ускоряет выборки, но добавляет избыточность и требует контроля целостности: при конвертации данных, загрузке из внешних источников или обмене реквизит может остаться незаполненным, если обработчики записи не сработали (например, при загрузке в режиме обмена данными с отключённой логикой).
Что важно запомнить
Прямой функции получения ГУИДа в языке запросов 1С нет. Для разовых задач выбирайте ссылки запросом и получайте идентификатор через УникальныйИдентификатор() в цикле; для постоянных обменов и отчётов храните ГУИД в отдельном строковом реквизите. Обратный поиск объекта по ГУИДу выполняется через ПолучитьСсылку с передачей ссылки параметром запроса.
Часто задаваемые вопросы
Можно ли получить ГУИД ссылки прямо в тексте запроса без цикла?
Штатной функции языка запросов для этого нет. Единственный способ выбрать идентификатор как поле запроса — заранее сохранить его в строковом реквизите объекта и выбирать этот реквизит. Все прочие варианты предполагают постобработку результата средствами встроенного языка.
Чем отличается ПРЕДСТАВЛЕНИЕ(Ссылка) от ГУИДа?
ПРЕДСТАВЛЕНИЕ возвращает отображаемый текст объекта — например, наименование элемента или номер и дату документа. Этот текст может меняться при редактировании объекта и не подходит как ключ обмена. ГУИД — неизменный внутренний идентификатор, не связанный с отображаемыми данными.
Как найти объект, если известен только ГУИД из другой базы?
Преобразуйте строку в значение типа УникальныйИдентификатор, затем вызовите метод ПолучитьСсылку у менеджера нужного типа объекта. Полученную ссылку используйте как параметр запроса. Учтите, что тип объекта (справочник, документ и какой именно) должен быть известен заранее — по одному ГУИДу без типа объект не найти.
Почему ПолучитьСсылку вернула ссылку, но объекта в базе нет?
Метод ПолучитьСсылку не проверяет существование объекта — он конструирует ссылку из идентификатора. Если объект с таким ГУИДом отсутствует, получается «битая» ссылка. Проверяйте существование через ПолучитьОбъект() или запросом к таблице объекта.
Меняется ли ГУИД при переносе объекта между базами?
При штатных механизмах обмена объект переносится вместе со своим идентификатором — именно так обеспечивается соответствие объектов в разных базах. ГУИД меняется только если объект создаётся заново как новый, без привязки к исходному.
Можно ли использовать ГУИД в отчёте на СКД?
Только если идентификатор хранится в отдельном реквизите объекта — тогда он доступен в схеме компоновки как обычное поле. Вычислить ГУИД средствами СКД из ссылки нельзя, как и в обычном запросе.