GUID в 1С 8.3: четыре способа узнать уникальный идентификатор объекта
Содержание
Самый быстрый путь: открыть объект в режиме «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С:Предприятие»
Это самый доступный вариант — конфигуратор и права разработчика не нужны.
- Откройте форму нужного объекта (карточку контрагента, документ, элемент справочника).
- В командной панели формы нажмите
Ещё → Получить ссылку. - В открывшемся окне скопируйте строку. Она выглядит так:
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 во время отладки — например, разобраться, на какой именно объект ссылается переменная, — удобнее всего отладчик.
- Запустите отладку (
Отладка → Начать отладку, F5) и остановитесь на точке останова в нужном месте кода. - Выделите переменную-ссылку и нажмите
Shift+F9(Отладка → Вычислить выражение). - В окне «Вычислить выражение» введите
Ссылка.УникальныйИдентификатор()и выполните. Результат отобразится строкой.
Второй вариант — добавить выражение Строка(Ссылка.УникальныйИдентификатор()) в окно «Табло» (Отладка → Табло). Тогда идентификатор будет виден при каждой остановке без ручного пересчёта.
В окне «Вычислить выражение» можно сразу проверить и обратное преобразование: ввести Справочники.Контрагенты.НайтиПоУникальномуИдентификатору(Новый УникальныйИдентификатор("...")) и убедиться, что по строке находится нужный объект.
Способ 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 с интерфейсом «Такси» все четыре способа доступны.
Какой способ выбрать под вашу задачу
Ещё → Получить ссылку. Быстро и без конфигуратора.Строка(Ссылка.УникальныйИдентификатор()). Это единственный стабильный формат для хранения.Shift+F9 или окно «Табло», выражение Ссылка.УникальныйИдентификатор()._IDRRef + ПолучитьСтруктуруХраненияБазыДанных(). Только на чтение.Зачем GUID нужен на практике
Идентификатор — это рабочий инструмент, а не отладочная диковинка. Основные сценарии:
- 🔁 Обмены и синхронизация. Планы обмена сопоставляют объекты разных баз по идентификатору. Код и наименование при этом могут отличаться — связь держится на GUID.
- 🔗 Интеграции через веб-сервисы и REST. Во внешней системе (сайт, CRM, маркетплейс) в качестве ключа 1С-объекта хранят именно строку GUID — она не изменится при редактировании карточки.
- 📝 Логирование и аудит. В журнал записывают идентификатор объекта, а не ссылку: по нему объект можно найти позже, даже если наименование поменяли.
- 🧩 Устранение дублей. При загрузке данных проверяют, нет ли объекта с таким идентификатором, прежде чем создавать новый.
- 🔍 Поиск «битых» ссылок. Если в реквизите остался идентификатор несуществующего объекта, сравнение
НайтиПоУникальномуИдентификаторус проверкойПустая()выявляет такие ссылки. - 📦 Адресация в веб-клиенте. Навигационная ссылка с идентификатором открывает конкретный объект по прямой гиперссылке — удобно для рассылок задач и уведомлений пользователям.
Для обмена с внешними системами всегда передавайте и храните каноническую строку из Строка(...), а не значение из навигационной ссылки. Так обе стороны гарантированно работают с одним форматом.
Идентификатор при переносе данных и сериализации
Когда объекты переносят из одной базы в другую вручную (не планом обмена, а скриптом), важно не потерять связи. Для этого новому объекту задают тот же идентификатор, что был у исходного.
НовыйЭлемент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйЭлемент.УстановитьСсылкуНового(Справочники.Контрагенты.ПолучитьСсылку(Гуид));
НовыйЭлемент.Наименование = "ООО Пример";
НовыйЭлемент.Записать();
Метод ПолучитьСсылку(Гуид) менеджера возвращает ссылку с заданным идентификатором, а УстановитьСсылкуНового закрепляет её за создаваемым объектом до записи. После записи все ссылки, которые вели на исходный объект по этому идентификатору, снова сработают.
При сериализации в XML идентификатор тоже участвует: сериализатор платформы пишет его в элемент ссылки, и при десериализации в другой базе объект сопоставляется по нему. Поэтому XDTO-обмены и выгрузки через ЗаписатьXML сохраняют связи «из коробки».
У предопределённых элементов (создаваемых в конфигураторе) в разных базах идентификаторы разные, хотя имя предопределённого одно и то же. Для таких элементов сопоставляйте по имени предопределённого (ПолучитьИмяПредопределенного), а не по GUID.
Типичные ошибки при работе с идентификатором
Большинство проблем возникает из-за того, что идентификатор путают с другими реквизитами или берут в чужом формате.
Строка(Ссылка.УникальныйИдентификатор()).Ссылка.Пустая() или попытку чтения реквизита.Частые вопросы
GUID меняется, если переименовать объект или изменить его код?
Сохраняется ли идентификатор при выгрузке и загрузке базы через `.dt`?
Можно ли задать свой GUID новому объекту?
СоздатьЭлемент/СоздатьДокумент или установить его до записи. Это нужно как раз при переносе данных, чтобы сохранить связи. Вручную в пользовательском режиме идентификатор задать нельзя.