Разработка и Конфигурация · 10 мин
Как получить идентификатор элемента справочника в 1С
Способы получить уникальный идентификатор элемента справочника в 1С: через встроенный язык, запрос, COM и внешнюю обработку. Примеры кода, проверка результата, типичные ошибки.
Уникальный идентификатор (GUID) элемента справочника в 1С — это внутренний ключ объекта, который платформа присваивает при создании и никогда не меняет. Он нужен для обмена данными между базами, интеграции с внешними системами, сопоставления объектов при синхронизации и отладки. Задача «получить идентификатор» решается несколькими способами: кодом на встроенном языке, запросом, через ссылку на объект или внешние инструменты.
Важно понимать: идентификатор — это не код элемента и не наименование. Код может повторяться в разных базах и меняться пользователем, а GUID уникален в пределах всей информационной базы и сохраняется на всём жизненном цикле объекта. Именно поэтому во всех механизмах обмена (Конвертация данных, EnterpriseData, планы обмена) объекты сопоставляются по GUID.
Что такое GUID объекта и чем он отличается от кода
Каждый объект ссылочного типа (элемент справочника, документ, элемент плана счетов) хранится в базе с внутренним идентификатором формата UUID — строкой вида b8a1c2d3-4e5f-6789-abcd-ef0123456789. Платформа генерирует его автоматически, изменить его штатными средствами нельзя.
Код справочника — это прикладной реквизит, который видит пользователь. Он может быть не уникальным (если в настройках справочника отключён контроль уникальности), может редактироваться и не переносится между базами гарантированно. GUID, напротив, невидим в интерфейсе по умолчанию, но именно он используется в ссылках на объект при обмене.
Практический вывод: если нужно однозначно указать на конкретный элемент справочника — например, передать его в веб-сервис или найти в другой базе — используйте GUID, а не код или наименование.
Получение идентификатора кодом на встроенном языке
Основной способ в программном коде — метод УникальныйИдентификатор(), который есть у любой ссылки. Сначала получают ссылку на элемент (поиском по коду, наименованию, реквизиту или из реквизита другого объекта), затем вызывают метод:
ЭлементСсылка = Справочники.Номенклатура.НайтиПоКоду("000000123");
Если Не ЭлементСсылка.Пустая() Тогда
Ид = ЭлементСсылка.УникальныйИдентификатор();
СтрокаИд = Строка(Ид); // "b8a1c2d3-4e5f-..."
КонецЕсли;
Метод возвращает значение типа УникальныйИдентификатор. Чтобы сохранить его в текстовое поле или передать наружу, преобразуйте в строку явно. Обратное преобразование выполняется конструктором Новый УникальныйИдентификатор("строка").
Типичный сценарий — получить GUID из реквизита документа: Ид = Документ.Контрагент.УникальныйИдентификатор();. Это работает для любого реквизита ссылочного типа без дополнительных запросов к базе.
СсылкаНаЭлемент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если Не СсылкаНаЭлемент.Пустая() Тогда
GUID = СсылкаНаЭлемент.УникальныйИдентификатор();
Сообщить(Строка(GUID));
КонецЕсли;Получение GUID через запрос
В языке запросов нет функции, напрямую возвращающей GUID, но есть приёмы. Первый — получить ссылку запросом и уже в обходе выборки вызвать УникальныйИдентификатор():
Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ Код = &Код");
Запрос.УстановитьПараметр("Код", "000000123");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Ид = Выборка.Ссылка.УникальныйИдентификатор();
КонецЕсли;
Второй приём — использовать представление ссылки. Во многих конфигурациях для журналов и отчётов GUID извлекают из строкового представления ссылки, но это нештатный путь, зависящий от формата. Надёжнее всегда работать через метод ссылки.
Если нужно массово выгрузить GUID всех элементов (например, для интеграции), выгружайте запросом ссылки и в цикле формируйте таблицу «код — GUID». Это быстрее, чем обход через объекты, и не блокирует базу надолго.
Обратная задача: найти элемент по известному GUID
Часто идентификатор приходит извне — из другой базы, файла обмена или внешней системы — и нужно найти соответствующий элемент. Для этого у менеджера справочника есть метод ПолучитьСсылку():
Ид = Новый УникальныйИдентификатор("b8a1c2d3-4e5f-6789-abcd-ef0123456789");
СсылкаНаЭлемент = Справочники.Номенклатура.ПолучитьСсылку(Ид);
Если СсылкаНаЭлемент.ПолучитьОбъект() = Неопределено Тогда
// Элемента с таким GUID в базе нет — ссылка «битая»
КонецЕсли;
Проверка существования обязательна: ПолучитьСсылку() вернёт ссылку даже для несуществующего GUID, и попытка обратиться к реквизитам такой ссылки вызовет ошибку или вернёт «Объект не найден». Проверяйте через ПолучитьОбъект() или запрос по ссылке.
Получение GUID без программирования
Если нет доступа к конфигуратору, идентификатор можно узнать пользовательскими средствами. Самый простой способ — открыть элемент справочника и посмотреть адресную строку браузера в веб-клиенте: в URL присутствует идентификатор ссылки. В тонком клиенте аналогичную информацию даёт команда «Получить ссылку» (кнопка в командной панели формы или пункт меню «Ещё»), которая копирует навигационную ссылку вида e1cib/data/Справочник.Номенклатура?ref=b8a1... — хвост после ref= и есть GUID в шестнадцатеричном виде (с переставленными группами байтов).
Ещё вариант — универсальные отчёты и внешние обработки «показать GUID», которыми пользуются администраторы. В типовых конфигурациях часть этих задач решает обработка «Групповое изменение реквизитов» и консоль кода из подсистемы «Инструменты разработчика».
Учтите нюанс: GUID из навигационной ссылки отличается порядком байтов от «классического» текстового представления. Если вы передаёте его во внешнюю систему, согласуйте формат заранее, иначе сопоставление не сработает.
GUID при обмене и интеграции
В планах обмена и при выгрузке через EnterpriseData объект идентифицируется именно по GUID. Если элемент создан в двух базах независимо, у него будут разные идентификаторы, и при синхронизации появятся дубли. Поэтому при первоначальном наполнении связанных баз элементы либо выгружают из одной базы в другую, либо принудительно назначают одинаковые GUID через УстановитьСсылкуНового():
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку(Ид));
НовыйЭлемент.Наименование = "Позиция из другой базы";
НовыйЭлемент.Записать();
Этот приём стандартен для механизмов конвертации, но требует аккуратности: назначать ссылку нового можно только до записи объекта и только если объект с таким GUID ещё не существует.
Проверка результата и типичные проблемы
После получения идентификатора убедитесь, что он корректен: строка должна содержать 36 символов в формате 8-4-4-4-12 с дефисами. Пустая ссылка вернёт GUID из нулей (00000000-0000-0000-0000-000000000000) — это верный признак того, что поиск элемента не дал результата.
Если НайтиПоКоду() вернул пустую ссылку, проверьте: длину кода с ведущими нулями, признак «ЭтоГруппа» (поиск по умолчанию может находить и группы), вид справочника (иерархический/неиерархический) и наличие прав у текущего пользователя. Ограничение доступа на уровне записей (RLS) тоже приводит к «невидимости» элемента.
Как проверить результат
36 символов, шаблон 8-4-4-4-12 с дефисами
Другая длина, отсутствие дефисов, посторонние символы
Пустая() = Ложь, GUID отличен от нулевого
GUID из нулей — элемент не найден
ПолучитьОбъект() возвращает объект, реквизиты читаются
Неопределено или ошибка «Объект не найден»
FAQ
Можно ли изменить GUID существующего элемента справочника?
Штатными средствами — нет. Идентификатор фиксируется при создании объекта. Единственный обходной путь — создать новый элемент с нужным GUID через УстановитьСсылкуНового, перенести данные и удалить старый, но это ломает все существующие ссылки на объект в других документах и регистрах.
Чем GUID отличается от навигационной ссылки?
Навигационная ссылка — это полный адрес объекта в базе (включает тип объекта и идентификатор), используемый клиентом для перехода. GUID — только сам идентификатор. Из навигационной ссылки GUID можно извлечь, но порядок байтов в нём отличается от строкового представления УникальныйИдентификатор().
Как массово выгрузить GUID всех элементов справочника?
Выполните запрос «ВЫБРАТЬ Ссылка, Код, Наименование ИЗ Справочник.ИмяСправочника», затем в цикле по выборке вызовите Ссылка.УникальныйИдентификатор() и запишите результат в таблицу значений или файл. Для больших справочников выгружайте порциями, чтобы не занимать память.
Почему ПолучитьСсылку вернула ссылку, а объекта в базе нет?
Метод ПолучитьСсылку не обращается к базе для проверки существования — он просто конструирует ссылку из GUID. Существование проверяется отдельно: через ПолучитьОбъект() = Неопределено или запросом по ссылке. Без этой проверки обращение к реквизитам вызовет ошибку.
Сохранится ли GUID при обмене между базами?
Да, если обмен настроен корректно (планы обмена, конвертация данных): при первой выгрузке объект создаётся в базе-приёмнике с тем же GUID. Если же элементы создавались в базах независимо, их GUID различаются, и для сопоставления потребуется таблица соответствий или перенос с принудительной установкой ссылки нового.
Что важно запомнить
GUID элемента справочника получают методом Ссылка.УникальныйИдентификатор(), обратный поиск — через ПолучитьСсылку с обязательной проверкой существования объекта. Для интеграций используйте GUID, а не код, и согласуйте формат идентификатора между системами, учитывая различие порядка байтов в навигационных ссылках.