Разработка и Конфигурация · 12 мин
Как получить идентификатор справочника в 1С
Как получить уникальный идентификатор элемента справочника в 1С: GUID через запрос, код, отладчик и обмен данными. Примеры кода, ошибки и проверка результата.
Уникальный идентификатор (GUID) — это внутренний 36-символьный ключ, который платформа 1С присваивает каждому объекту базы: элементу справочника, документу, записи регистра. В отличие от кода или наименования, GUID никогда не меняется и не повторяется, поэтому именно он используется при обмене данными между базами, интеграции с сайтами и внешними системами, а также при поиске «потерянных» объектов по ссылкам вида «Объект не найден».
Получить идентификатор справочника можно несколькими способами: программно через метод УникальныйИдентификатор(), через запрос с функцией УНИКАЛЬНЫЙИДЕНТИФИКАТОР(), через отладчик или универсальные отчёты. Выбор зависит от задачи: разовая проверка, массовая выгрузка или код в модуле обмена.
Что такое GUID в 1С и когда он нужен
Каждая ссылка на объект базы данных в 1С содержит внутри себя уникальный идентификатор — 128-битное значение, которое в текстовом виде выглядит как строка вида 8d3f5c2a-1234-4abc-9def-0123456789ab. Платформа генерирует его автоматически в момент создания объекта, и он остаётся неизменным в течение всего жизненного цикла элемента.
На практике GUID требуется в типовых сценариях: сопоставление элементов при обмене между двумя базами (например, «Управление торговлей» и «Бухгалтерия»), передача ссылок на товары или контрагентов на сайт или в мобильное приложение, восстановление битых ссылок после некорректного обмена, а также отладка — когда нужно понять, о каком именно элементе идёт речь в сообщении об ошибке.
Получение GUID программно в коде модуля
Самый распространённый способ — метод УникальныйИдентификатор(), который есть у любой ссылки на объект базы. Метод возвращает значение типа УникальныйИдентификатор, которое при необходимости преобразуется в строку.
// Получаем ссылку на элемент справочника
ЭлементСсылка = Справочники.Номенклатура.НайтиПоКоду("000000123");
Если Не ЭлементСсылка.Пустая() Тогда
Идентификатор = ЭлементСсылка.УникальныйИдентификатор();
СтрокаGUID = Строка(Идентификатор);
Сообщить("GUID элемента: " + СтрокаGUID);
КонецЕсли;
Обратите внимание: метод вызывается именно у ссылки, а не у объекта. Если у вас есть переменная типа СправочникОбъект, сначала обратитесь к её свойству Ссылка: Объект.Ссылка.УникальныйИдентификатор(). Для нового, ещё не записанного объекта ссылка формируется только после вызова УстановитьСсылкуНового() или записи — до этого момента получить осмысленный GUID нельзя.
СтрокаGUID = Строка(ЭлементСсылка.УникальныйИдентификатор());Получение GUID через запрос
Когда нужно получить идентификаторы сразу для множества элементов — например, выгрузить в обработку сопоставления весь справочник контрагентов — удобнее использовать запрос с функцией языка запросов УНИКАЛЬНЫЙИДЕНТИФИКАТОР().
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Код КАК Код,
| УНИКАЛЬНЫЙИДЕНТИФИКАТОР(Номенклатура.Ссылка) КАК Идентификатор
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Код + " — " + Выборка.Идентификатор);
КонецЦикла;
Такой подход работает быстрее цикла с обращением к каждой ссылке по отдельности, потому что вся выборка выполняется на стороне сервера базы данных одним обращением. Это особенно заметно на справочниках с десятками тысяч элементов.
Как узнать GUID без программирования
Если под рукой нет конфигуратора или прав на выполнение кода, есть обходные пути. Во многих типовых конфигурациях доступен отчёт «Универсальный отчёт» или обработка «Консоль запросов» из состава стандартных подсистем БСП — там можно выполнить запрос из предыдущего раздела прямо в пользовательском режиме.
Ещё один вариант — отладчик. Поставьте точку останова в месте, где обрабатывается нужный элемент, откройте табло (Ctrl+Alt+W) и введите выражение ЭлементСсылка.УникальныйИдентификатор(). Значение можно скопировать в буфер обмена.
Также GUID «просвечивается» в некоторых служебных местах: в журнале регистрации при детальном просмотре событий обмена, в текстах ошибок вида «Объект не найден (8d3f5c2a:...)», в файлах выгрузки XML при обмене через планы обмена и EnterpriseData. Из такого файла идентификатор можно просто прочитать текстовым редактором.
- 1Откройте конфигуратор и включите отладку (Отладка — Начать отладку)
- 2Поставьте точку останова в коде, где доступна ссылка на элемент
- 3Откройте табло: Отладка — Табло (Ctrl+Alt+W)
- 4Введите выражение: ЭлементСсылка.УникальныйИдентификатор()
- 5Скопируйте полученное значение двойным щелчком по ячейке значения
Обратная задача: найти элемент по известному GUID
Часто идентификатор приходит извне — из другой базы, файла обмена или сообщения об ошибке — и нужно найти соответствующий элемент. Для этого служит метод менеджера справочника ПолучитьСсылку(), которому передаётся объект УникальныйИдентификатор, созданный из строки.
СтрокаGUID = "8d3f5c2a-1234-4abc-9def-0123456789ab";
Идентификатор = Новый УникальныйИдентификатор(СтрокаGUID);
ЭлементСсылка = Справочники.Номенклатура.ПолучитьСсылку(Идентификатор);
// Проверяем, существует ли элемент реально
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ 1 ИЗ Справочник.Номенклатура ГДЕ Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ЭлементСсылка);
Если Запрос.Выполнить().Пустой() Тогда
Сообщить("Элемент с таким GUID в базе отсутствует");
КонецЕсли;
Важный нюанс: ПолучитьСсылку() всегда возвращает ссылку, даже если элемента с таким идентификатором в базе нет. Поэтому проверка существования через запрос или попытка обращения к реквизиту обязательна — иначе дальше по коду вы получите «битую» ссылку и ошибку «Объект не найден».
GUID в обменах и внешних интеграциях
При типовом обмене между базами 1С (через планы обмена, правила конвертации или формат EnterpriseData) сопоставление объектов по умолчанию строится именно на GUID: элемент, созданный в одной базе, при выгрузке переносит свой идентификатор в другую. Поэтому при ручном создании «одинаковых» элементов в двух базах они получат разные GUID и в обмене превратятся в дубли.
Для интеграции с сайтом или внешней системой GUID обычно выгружается в явном виде — отдельной колонкой в CSV/Excel или полем в JSON. Веб-сервисы и HTTP-сервисы 1С принимают идентификатор строкой, после чего внутри базы выполняется описанный выше поиск через ПолучитьСсылку(). При проектировании такого API закладывайте обработку ситуации «идентификатор есть, элемента нет» — это нормальный сценарий при удалении данных на одной из сторон.
Как выбрать способ получения GUID
Частые ошибки при работе с идентификаторами
Первая типичная ошибка — попытка сравнивать GUID как строки с учётом регистра или лишних пробелов. Перед сравнением приводите обе строки к одному виду через НРег(СокрЛП(Значение)) или сравнивайте сами значения типа УникальныйИдентификатор, а не их строковые представления.
Вторая ошибка — хранение GUID в реквизите типа «Строка» без контроля формата и последующая передача его в Новый УникальныйИдентификатор(). Если строка повреждена (обрезана, содержит лишние символы), конструктор выбросит исключение и прервёт обмен целиком. Оборачивайте такой код в Попытка...Исключение с записью проблемного значения в журнал.
Третья группа проблем связана с ожиданием, что GUID сохранится при выгрузке-загрузке через «ВыгрузитьЗагрузитьДанныеXML» между неидентичными конфигурациями, или при конвертации, где в правилах явно отключён поиск по идентификатору. В этих случаях элемент в базе-приёмнике получит новый GUID, и внешние ссылки на старый идентификатор станут недействительными.
Как проверить результат
После получения идентификатора убедитесь, что он корректен: строка должна содержать 36 символов, включая четыре дефиса, и состоять только из шестнадцатеричных цифр. Для программной проверки достаточно попытаться создать из строки объект УникальныйИдентификатор — при неверном формате платформа выдаст ошибку.
Для проверки сопоставления между базами выгрузите GUID одного и того же элемента с обеих сторон и сравните. Совпадение означает, что обмен воспринимает элементы как один объект; несовпадение — что в приёмнике существует дубль или элемент был создан вручную.
Как проверить результат
36 символов, 4 дефиса, только 0-9 и a-f
Строка короче/длиннее, есть посторонние символы
Запрос по ПолучитьСсылку() возвращает запись
Запрос пустой, при обращении к реквизиту — «Объект не найден»
GUID элемента совпадает в обеих базах
Идентификаторы разные — признак дубля
Частые вопросы
Чем GUID отличается от кода справочника?
Код — это видимый пользователю реквизит, который может редактироваться, повторяться при определённых настройках и зависит от нумерации. GUID — скрытый системный ключ, который присваивается один раз при создании объекта и никогда не меняется. Для внутренних связей и обменов надёжно только GUID, код подходит лишь как человекочитаемый идентификатор.
Можно ли изменить GUID существующего элемента?
Штатного способа изменить идентификатор записанного объекта нет — он неизменен. Фактически «сменить» GUID можно только создав новый элемент с нужной ссылкой через УстановитьСсылкуНового() и перенеся в него данные, но это рискованная операция, требующая переноса всех связей из документов и регистров.
Как получить GUID предопределённого элемента справочника?
Точно так же, как для обычного: получите ссылку через Справочники.ИмяСправочника.ИмяПредопределенного (обращение по имени из свойства «Имя предопределённых данных») и вызовите УникальныйИдентификатор(). Учтите, что GUID предопределённого элемента в разных базах может отличаться, если он создавался обновлением в разное время.
Почему в ошибке «Объект не найден» идентификатор выглядит иначе?
В тексте ошибки GUID часто отображается во внутреннем формате с переставленными байтами, поэтому его нельзя напрямую вставить в конструктор УникальныйИдентификатор. Для поиска такого элемента используйте обработки восстановления битых ссылок или преобразование формата, либо найдите корректный GUID через отладчик в месте возникновения ошибки.
Можно ли получить GUID в управляемой форме без вызова сервера?
Нет, метод УникальныйИдентификатор() выполняется в серверном контексте. В управляемой форме сделайте серверный вызов (метод с директивой &НаСервере или &НаСервереБезКонтекста), передайте туда ссылку и верните строку идентификатора на клиент.
Что важно запомнить
GUID элемента справочника получают методом Ссылка.УникальныйИдентификатор() или запросом с УНИКАЛЬНЫЙИДЕНТИФИКАТОР(). Обратный поиск выполняется через ПолучитьСсылку() с обязательной проверкой существования элемента. Идентификатор неизменен и является основой сопоставления объектов при обменах, поэтому любые ручные манипуляции с ним делайте только на копии базы.