GUID в 1С 8.3: четыре способа узнать уникальный идентификатор объекта

· 9 мин

Содержание

Самый быстрый путь: открыть объект в режиме «1С:Предприятие», нажать Ещё → Получить ссылку — в полученной навигационной ссылке после ref= и будет идентификатор. Если нужна каноническая строка GUID вида b2f4c8a0-1d3e-4f5a-9c7b-0e8d6a2f1c4b, её возвращает код: Строка(Ссылка.УникальныйИдентификатор()).

GUID (от globally unique identifier) — это уникальный идентификатор ссылочного объекта: элемента справочника, документа, плана счетов. Он не меняется при переименовании объекта, не зависит от кода и наименования и остаётся тем же при выгрузке-загрузке базы. Именно по нему строятся обмены, интеграции и ссылки между объектами внутри базы.

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

Что такое уникальный идентификатор ссылки и где он лежит

Каждая запись ссылочного типа при создании получает 16-байтовый идентификатор. В терминах встроенного языка это тип УникальныйИдентификатор, а у любой ссылки есть метод УникальныйИдентификатор(), который его возвращает.

Физически идентификатор хранится в таблице СУБД в поле _IDRRef типа binary(16). Все связи между объектами (реквизиты типа «ссылка», табличные части, регистры) ведут именно на это поле, а не на код или наименование.

GUID уникален в пределах одной информационной базы. При загрузке объекта из другой базы через обмен платформа сопоставляет объекты как раз по идентификатору, поэтому задвоения не возникает, даже если коды элементов совпали.

Отсюда и практическая ценность: код элемента можно поменять, наименование — тоже, а идентификатор останется прежним. Поэтому во внешних системах, логах и таблицах сопоставления в качестве ключа берут именно его.

Не путайте идентификатор со ссылкой. Ссылка (СправочникСсылка.Контрагенты) — это объект встроенного языка, который живёт только внутри сеанса 1С и во внешнюю систему его не передать. Идентификатор же — просто 16 байт, его удобно хранить строкой где угодно: в базе сайта, в текстовом логе, в теле HTTP-запроса. По нему потом всегда можно восстановить ссылку методом НайтиПоУникальномуИдентификатору.

Способ 1. Навигационная ссылка в режиме «1С:Предприятие»

Это самый доступный вариант — конфигуратор и права разработчика не нужны.

  1. Откройте форму нужного объекта (карточку контрагента, документ, элемент справочника).
  2. В командной панели формы нажмите Ещё → Получить ссылку.
  3. В открывшемся окне скопируйте строку. Она выглядит так: e1cib/data/Справочник.Контрагенты?ref=8a3bf4... — 32 шестнадцатеричных символа после ref= и есть идентификатор в байтовом представлении.

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

Шестнадцатеричная строка после ref= — это не та же последовательность символов, что каноническая запись GUID с дефисами. Платформа хранит байты в другом порядке. Поэтому сравнивать идентификатор «на глаз» между ссылкой и строкой из кода нельзя — об этом ниже, в разделе про форматы.

Способ 2. Получение GUID через встроенный язык

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

// Ссылка — любая ссылка на объект
Идентификатор = Ссылка.УникальныйИдентификатор();

// Каноническая строка с дефисами, нижний регистр
ГуидСтрокой = Строка(Идентификатор);
Сообщить(ГуидСтрокой); // b2f4c8a0-1d3e-4f5a-9c7b-0e8d6a2f1c4b

Метод есть у ссылки любого ссылочного типа: СправочникСсылка, ДокументСсылка, ПланСчетовСсылка и так далее. Результат Строка() всегда одинаковый — 36 символов: 32 шестнадцатеричных знака и 4 дефиса.

Обратная задача — получить ссылку по известному идентификатору — решается методом менеджера объекта:

Гуид = Новый УникальныйИдентификатор("b2f4c8a0-1d3e-4f5a-9c7b-0e8d6a2f1c4b");
Ссылка = Справочники.Контрагенты.НайтиПоУникальномуИдентификатору(Гуид);

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

Способ 3. Просмотр идентификатора в отладчике конфигуратора

Если нужно снять GUID во время отладки — например, разобраться, на какой именно объект ссылается переменная, — удобнее всего отладчик.

  1. Запустите отладку (Отладка → Начать отладку, F5) и остановитесь на точке останова в нужном месте кода.
  2. Выделите переменную-ссылку и нажмите Shift+F9 (Отладка → Вычислить выражение).
  3. В окне «Вычислить выражение» введите Ссылка.УникальныйИдентификатор() и выполните. Результат отобразится строкой.

Второй вариант — добавить выражение Строка(Ссылка.УникальныйИдентификатор()) в окно «Табло» (Отладка → Табло). Тогда идентификатор будет виден при каждой остановке без ручного пересчёта.

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

Способ 4. Чтение идентификатора из таблиц СУБД

Иногда объекта уже нет в базе (помечен на удаление и удалён), а идентификатор остался в логе внешней системы. Или нужно массово выгрузить соответствие «объект — GUID» на стороне СУБД. Тогда читают поле _IDRRef напрямую.

Сложность в том, что физические имена таблиц в СУБД (_Reference123, _Document456) не совпадают с именами метаданных. Соответствие возвращает встроенная функция:

Структура = ПолучитьСтруктуруХраненияБазыДанных();
// в таблице значений — метаданные и их физические имена таблиц и полей

Зная физическое имя таблицы, можно обратиться к ней средствами СУБД. Поле _IDRRef имеет тип binary(16).

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

Байтовый порядок в поле _IDRRef не совпадает с канонической строкой GUID — как и в навигационной ссылке. Поэтому сопоставлять значение из СУБД со строкой из кода напрямую нельзя.

Почему форматы GUID не совпадают между собой

Это главная ловушка темы. Один и тот же идентификатор в трёх местах выглядит по-разному:

Где смотримКак выглядитРазделители
Строка(...УникальныйИдентификатор())b2f4c8a0-1d3e-4f5a-9c7b-0e8d6a2f1c4bдефисы, нижний регистр
Навигационная ссылка (ref=)32 hex-символа без дефисовнет
Поле _IDRRef в СУБД16 байт binaryнет

Проблема не только в дефисах и регистре. Платформа хранит байты идентификатора в СУБД и в навигационной ссылке в другом порядке, чем в канонической строке. Поэтому если переставить дефисы в строке из ref=, вы не получите ту же строку, что вернул Строка().

Единственный надёжный способ сопоставить идентификатор из ссылки или СУБД с объектом — отдать его платформе. Например, из навигационной ссылки объект достают так:

Ссылка = ПолучитьЗначениеПоНавигационнойСсылке("e1cib/data/Справочник.Контрагенты?ref=8a3bf4...");

а дальше уже берут Ссылка.УникальныйИдентификатор() и получают каноническую строку. Не пытайтесь конвертировать байтовый порядок вручную — ошибётесь на перестановке и получите чужой объект.

Сам тип УникальныйИдентификатор и метод УникальныйИдентификатор() ведут себя одинаково во всех актуальных релизах платформы 8.3, никаких версионных различий в способах получения идентификатора нет. Отличается лишь то, что в ранних релизах 8.x команды Получить ссылку в пользовательском интерфейсе могло не быть — тогда идентификатор снимают кодом или в отладчике. В 8.3 с интерфейсом «Такси» все четыре способа доступны.

Какой способ выбрать под вашу задачу

Что именно вам нужно сделать с идентификатором?

Зачем GUID нужен на практике

Идентификатор — это рабочий инструмент, а не отладочная диковинка. Основные сценарии:

  • 🔁 Обмены и синхронизация. Планы обмена сопоставляют объекты разных баз по идентификатору. Код и наименование при этом могут отличаться — связь держится на GUID.
  • 🔗 Интеграции через веб-сервисы и REST. Во внешней системе (сайт, CRM, маркетплейс) в качестве ключа 1С-объекта хранят именно строку GUID — она не изменится при редактировании карточки.
  • 📝 Логирование и аудит. В журнал записывают идентификатор объекта, а не ссылку: по нему объект можно найти позже, даже если наименование поменяли.
  • 🧩 Устранение дублей. При загрузке данных проверяют, нет ли объекта с таким идентификатором, прежде чем создавать новый.
  • 🔍 Поиск «битых» ссылок. Если в реквизите остался идентификатор несуществующего объекта, сравнение НайтиПоУникальномуИдентификатору с проверкой Пустая() выявляет такие ссылки.
  • 📦 Адресация в веб-клиенте. Навигационная ссылка с идентификатором открывает конкретный объект по прямой гиперссылке — удобно для рассылок задач и уведомлений пользователям.

Для обмена с внешними системами всегда передавайте и храните каноническую строку из Строка(...), а не значение из навигационной ссылки. Так обе стороны гарантированно работают с одним форматом.

Идентификатор при переносе данных и сериализации

Когда объекты переносят из одной базы в другую вручную (не планом обмена, а скриптом), важно не потерять связи. Для этого новому объекту задают тот же идентификатор, что был у исходного.

НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(Гуид));
НовыйЭлемент.Наименование = "ООО Пример";
НовыйЭлемент.Записать();

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

При сериализации в XML идентификатор тоже участвует: сериализатор платформы пишет его в элемент ссылки, и при десериализации в другой базе объект сопоставляется по нему. Поэтому XDTO-обмены и выгрузки через ЗаписатьXML сохраняют связи «из коробки».

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

Типичные ошибки при работе с идентификатором

Большинство проблем возникает из-за того, что идентификатор путают с другими реквизитами или берут в чужом формате.

Диагностика: выберите симптом

Частые вопросы

GUID меняется, если переименовать объект или изменить его код?
Нет. Идентификатор присваивается один раз при создании записи и остаётся неизменным при любом редактировании реквизитов, включая код и наименование.
Сохраняется ли идентификатор при выгрузке и загрузке базы через `.dt`?
Да. Полная выгрузка-загрузка сохраняет идентификаторы всех объектов. Поэтому ссылки между объектами после загрузки остаются рабочими.
Можно ли задать свой GUID новому объекту?
Да, при программном создании объекта можно указать идентификатор через параметр метода СоздатьЭлемент/СоздатьДокумент или установить его до записи. Это нужно как раз при переносе данных, чтобы сохранить связи. Вручную в пользовательском режиме идентификатор задать нельзя.
Почему строка из навигационной ссылки не совпадает со строкой из кода?
Потому что в ссылке и в СУБД байты хранятся в другом порядке, чем в канонической записи с дефисами. Сопоставляйте идентификаторы только через платформу, а не перестановкой символов вручную.
Есть ли у ведущих и подчинённых объектов отдельные идентификаторы?
Да, у каждого элемента справочника свой идентификатор независимо от иерархии и подчинения. Связь «владелец — подчинённый» хранится отдельным реквизитом, а не через общий GUID.