Разработка и Конфигурация · 11 мин
Как найти элемент справочника по GUID в 1С
Как найти элемент справочника по GUID в 1С: ПолучитьСсылку, запросы, поиск по уникальному идентификатору в коде и консоли. Примеры и типичные ошибки.
Уникальный идентификатор (GUID) — это внутренний 36-символьный ключ, который платформа 1С присваивает каждому объекту базы при создании. В отличие от кода или наименования, GUID никогда не меняется и не повторяется, поэтому именно он используется при обменах между базами, интеграциях с внешними системами и поиске «потерянных» ссылок.
Задача найти элемент справочника по GUID возникает в нескольких типовых ситуациях: при разборе ошибок обмена, когда в сообщении фигурирует только идентификатор; при сопоставлении данных распределённых баз; при восстановлении битых ссылок после удаления объектов. Ниже разобраны рабочие способы поиска — через встроенный язык, запросы и штатные инструменты, а также ограничения каждого подхода.
Важно понимать разницу между двумя направлениями поиска: у вас может быть строка GUID, по которой нужно получить ссылку на объект, или наоборот — ссылка, из которой нужно извлечь идентификатор. Оба сценария рассмотрены с примерами кода.
Что такое GUID объекта и где его взять
GUID (глобально уникальный идентификатор) в 1С хранится в системном поле «Ссылка» и представлен типом УникальныйИдентификатор. Внешне это строка вида «a1b2c3d4-e5f6-7890-abcd-ef1234567890». Идентификатор формируется платформой в момент записи объекта и остаётся неизменным на протяжении всей жизни элемента, включая переносы при обмене данными.
Получить GUID существующего элемента в коде можно методом УникальныйИдентификатор():
Элемент = Справочники.Номенклатура.НайтиПоКоду("000000123");
Если Не Элемент.Пустая() Тогда
ГУИД = Элемент.УникальныйИдентификатор();
Сообщить(Строка(ГУИД));
КонецЕсли;
В пользовательском режиме GUID не отображается напрямую, но его можно увидеть в адресной строке при открытии объекта по ссылке вида «e1cib/data/Справочник.Номенклатура?ref=...» — хвост после «ref=» и есть идентификатор в другом кодировании. Также GUID фигурирует в журналах обмена, планах обмена и сообщениях об ошибках синхронизации.
Поиск элемента по GUID, когда тип справочника известен
Если вы знаете, к какому справочнику относится идентификатор, задача решается в два шага: создать объект УникальныйИдентификатор из строки и получить по нему ссылку через менеджер справочника.
СтрокаГУИД = "a1b2c3d4-e5f6-7890-abcd-ef1234567890";
ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
СсылкаНаЭлемент = Справочники.Номенклатура.ПолучитьСсылку(ГУИД);
Критически важный момент: метод ПолучитьСсылку() всегда возвращает ссылку, даже если элемента с таким GUID в базе нет. Это не поиск, а конструирование ссылки из идентификатора. Поэтому результат обязательно нужно проверять на существование.
Проверка через запрос — самый надёжный способ:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Т.Ссылка ИЗ Справочник.Номенклатура КАК Т ГДЕ Т.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", СсылкаНаЭлемент);
Если Запрос.Выполнить().Пустой() Тогда
Сообщить("Элемент с таким GUID не найден");
Иначе
Сообщить("Элемент существует");
КонецЕсли;
Поиск по всем справочникам, когда тип неизвестен
В сообщениях об ошибках обмена часто фигурирует только GUID без указания типа объекта. В этом случае нужно перебрать все справочники конфигурации и проверить наличие ссылки в каждом.
Функция НайтиСсылкуПоГУИД(СтрокаГУИД)
ГУИД = Новый УникальныйИдентификатор(СтрокаГУИД);
Для Каждого Менеджер Из Справочники Цикл
ИмяСправочника = Менеджер.ПустаяСсылка().Метаданные().Имя;
Ссылка = Менеджер.ПолучитьСсылку(ГУИД);
Запрос = Новый Запрос("ВЫБРАТЬ Т.Ссылка ИЗ Справочник." + ИмяСправочника + " КАК Т ГДЕ Т.Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если Не Запрос.Выполнить().Пустой() Тогда
Возврат Ссылка;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Такой перебор может занять заметное время на больших конфигурациях с десятками справочников, поскольку выполняется отдельный запрос к каждой таблице. Для разовой диагностики это приемлемо, но встраивать такой код в массовые обработки не стоит.
Если объект мог быть не только элементом справочника, но и документом, перебор расширяют на Документы, ПланыВидовХарактеристик и другие ссылочные типы. Логика проверки полностью аналогична.
- 1Скопируйте строку GUID из сообщения об ошибке или журнала обмена
- 2Проверьте формат: 36 символов с дефисами, только шестнадцатеричные цифры
- 3Создайте УникальныйИдентификатор из строки через конструктор
- 4Переберите менеджеры справочников с проверкой существования ссылки запросом
- 5При отсутствии результата повторите перебор для документов и ПВХ
Поиск через консоль запросов и инструменты разработчика
Если под рукой нет возможности писать код, GUID можно найти штатными средствами. В толстом клиенте или через внешние обработки «Консоль запросов» выполняется запрос к конкретному справочнику с параметром-ссылкой, сформированной из идентификатора.
Распространённая практика — использовать обработки типа «Поиск объекта по уникальному идентификатору», которые делают ровно то, что описано выше: перебирают метаданные и проверяют существование ссылки. Такие инструменты входят в состав стандартных подсистем и свободно доступных наборов для администраторов.
Ещё один вариант — динамический список справочника с отбором. Если открыть список справочника и программно установить отбор по полю «Ссылка» равным сконструированной ссылке, список либо покажет элемент, либо останется пустым. Это наглядный способ проверки без написания полноценной обработки.
Обратная задача: получить GUID из ссылки
Обратное преобразование нужно при настройке обменов и выгрузках, когда во внешнюю систему передаётся идентификатор объекта. Для любой ссылки вызов метода УникальныйИдентификатор() возвращает значение типа УникальныйИдентификатор, а функция Строка() преобразует его в привычный текстовый формат.
ГУИДСтрокой = Строка(ЭлементСправочника.Ссылка.УникальныйИдентификатор());
В запросе GUID напрямую не выводится — поле «Ссылка» имеет ссылочный тип. Для выгрузки идентификаторов запросом результат обходят в коде и вызывают УникальныйИдентификатор() для каждой строки выборки.
Типичные ошибки и битые ссылки
Самая частая ошибка — передача в конструктор УникальныйИдентификатор строки в неверном формате: без дефисов, с лишними пробелами или с символами за пределами шестнадцатеричного диапазона. Платформа в этом случае вызывает исключение, поэтому создание идентификатора из внешних данных стоит оборачивать в Попытка/Исключение.
Вторая типовая ситуация — объект с искомым GUID был удалён. Тогда ПолучитьСсылку вернёт ссылку, но запрос покажет, что объекта нет, а в других объектах могут остаться битые ссылки вида «Объект не найден». Для диагностики таких случаев используют штатную обработку поиска и удаления битых ссылок либо проверку методом НайтиПоСсылкам().
Третья ошибка — поиск GUID из другой базы в базе-приёмнике, где обмен ещё не выполнялся. Идентификатор сохраняется при обмене, но только если объект реально переносился: элемент, созданный независимо в двух базах, будет иметь разные GUID даже при совпадающем коде и наименовании.
Когда поиск по GUID не подходит: альтернативы
GUID — не единственный и не всегда лучший ключ поиска. Внутри одной базы для поиска элемента обычно удобнее использовать НайтиПоКоду() и НайтиПоНаименованию(): они работают быстрее за счёт индексов и не требуют проверки существования, так как сразу возвращают пустую ссылку при отсутствии результата.
Способы поиска элемента справочника
Для обменов и интеграций, когда известен идентификатор. Требует обязательной проверки существования запросом.
Когда код уникален и ведётся автонумерация. Быстро, но код может быть не заполнен или не уникален в пределах подчинения.
Для разовых операций и обработок. Ненадёжно при дублях наименований — вернёт первый найденный элемент.
Для поиска по произвольным реквизитам и сложным условиям. Гибко, но требует написания текста запроса.
При интеграциях, где GUID недоступен, применяют сопоставление по комбинации реквизитов — например, по ИНН и КПП для контрагентов или по артикулу для номенклатуры. Это менее надёжно, чем идентификатор, но позволяет работать с системами, которые не хранят GUID 1С.
Как проверить результат поиска
Запрос по этой ссылке возвращает строку
Запрос пуст — объекта в базе нет
36 символов, 4 дефиса, шестнадцатеричные цифры
Другая длина или посторонние символы — конструктор выдаст ошибку
Читаются без исключений, наименование осмысленное
Ошибка при обращении или «Объект не найден»
Часто задаваемые вопросы
Почему ПолучитьСсылку возвращает ссылку на несуществующий элемент?
Потому что этот метод не выполняет поиск в базе — он конструирует значение ссылки из переданного идентификатора. Существование объекта нужно проверять отдельно запросом к таблице справочника.
Может ли у двух разных элементов совпасть GUID?
Нет, в пределах одной базы идентификаторы уникальны. Совпадение GUID у элементов в разных базах означает, что объект перенесён между ними через обмен, а не создан независимо.
Как найти GUID элемента без программирования?
Откройте объект и посмотрите навигационную ссылку (команда «Получить ссылку» или адрес в строке браузера для веб-клиента) — идентификатор содержится в параметре ref в закодированном виде. Для точного значения используют отчёты и обработки, выводящие УникальныйИдентификатор.
Что делать, если GUID из сообщения об ошибке нигде не находится?
Расширьте перебор со справочников на документы, планы видов характеристик, планы счетов и другие ссылочные типы. Если объект не найден нигде — вероятно, он был удалён, а в сообщении зафиксирована устаревшая ссылка.
Меняется ли GUID при изменении элемента или пометке на удаление?
Нет. Идентификатор присваивается один раз при создании и не меняется ни при редактировании реквизитов, ни при пометке на удаление. GUID перестаёт существовать только после физического удаления объекта из базы.
Как передать GUID во внешнюю систему при обмене?
Получите идентификатор методом Ссылка.УникальныйИдентификатор(), преобразуйте его функцией Строка() и включите в выгружаемые данные как текстовое поле. В принимающей базе строка преобразуется обратно конструктором УникальныйИдентификатор.
Что важно запомнить
GUID — неизменный идентификатор объекта, используемый в обменах. Поиск выполняется через ПолучитьСсылку с обязательной проверкой существования запросом; при неизвестном типе перебираются все менеджеры ссылочных объектов. Строку идентификатора из внешних источников проверяйте на формат и обрабатывайте исключения.