Как посмотреть UID объекта 1С разными способами

· 9 мин

Содержание

Код контрагента можно сменить, номер документа — перенумеровать, а UID остаётся с объектом навсегда. Это 128-битный уникальный идентификатор (GUID), по которому платформа отличает одну запись от другой во всех ссылках, обменах и интеграциях. Самый короткий способ увидеть его — выполнить в коде Строка(Ссылка.УникальныйИдентификатор()) и получить строку вида a7b3c1d0-5e4f-11ec-80a2-00155d010a1e.

Готовой кнопки «показать UID» в интерфейсе 1С нет. Рабочих способов посмотреть идентификатор пять — через код, отладчик, внешнюю обработку , файл выгрузки или таблицы СУБД, — и у каждого своя ниша. Отдельно стоит обратная задача: как по UID найти сам объект.

Всё, что ниже, — про платформу 8.3 с интерфейсом «Такси». В 8.2 методы те же, отличаются лишь пункты меню конфигуратора.

Что такое UID и чем он отличается от кода

UID (от unique identifier) — это внутренний ключ объекта. Платформа присваивает его в момент создания записи и больше никогда не меняет, даже если вы переименуете элемент или перепроведёте документ.

Чем UID отличается от привычных реквизитов:

  • 🔑 Код и номер вводит пользователь или нумератор, их можно изменить, они уникальны только внутри своего справочника или документа.
  • 🌐 UID генерирует платформа, он уникален глобально и не зависит от представления объекта.
  • 🔗 Ссылка — это как раз обёртка вокруг UID плюс тип объекта. Когда вы видите в поле «Контрагент» значение «ООО Ромашка», внутри хранится именно идентификатор.

Короткая сводка, чтобы не путать реквизиты между собой:

ПризнакКто задаётМожно менятьУникальность
НаименованиеПользовательДаНе гарантируется
Код / номерПользователь или нумераторДаВ пределах объекта
СсылкаПлатформаНетГлобальная
UIDПлатформаНетГлобальная

Где UID реально нужен:

  1. В обменах и синхронизации — узлы сопоставляют объекты по идентификатору, а не по наименованию.
  2. В интеграциях через OData, HTTP-сервисы и REST — внешняя система адресует объект по UID.
  3. В навигационных ссылках e1cib/data/... — часть после ref= и есть идентификатор в упакованном виде.
  4. При разборе дублей и «потерянных» ссылок, когда код совпадает, а объекты разные.

Строковое представление UID — это 32 шестнадцатеричные цифры, разбитые дефисами на группы 8-4-4-4-12. Регистр значения не имеет.

Самый быстрый способ: получить UID через код

Если нужен идентификатор одного-двух объектов, не поднимайте тяжёлую артиллерию — хватит пары строк в любом месте, где исполняется встроенный язык: модуль обработки, обработчик команды формы, консоль кода из БСП.

// есть ссылка на объект — получаем её UID строкой
Ид = Контрагент.УникальныйИдентификатор();
Сообщить(Строка(Ид)); // a7b3c1d0-5e4f-11ec-80a2-00155d010a1e

Метод УникальныйИдентификатор() есть у любой ссылки — СправочникСсылка, ДокументСсылка, ПланВидовХарактеристикСсылка и так далее. Он возвращает значение типа УникальныйИдентификатор, а функция Строка() переводит его в читаемый вид.

Если под рукой нет готовой консоли, идентификатор текущего объекта формы можно вывести прямо из обработчика команды:

&НаСервере
Процедура ПоказатьИдНаСервере()
    Сообщить(Строка(Объект.Ссылка.УникальныйИдентификатор()));
КонецПроцедуры

У нового, ещё не записанного объекта ссылка пустая — UID появится только после первой записи. Для непроведённого, но записанного документа идентификатор уже есть.

Рядом с UID часто нужна и навигационная ссылка — по ней объект открывается кликом из письма или служебного сообщения. Её собирает отдельная функция:

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

Хвост после ref= — это тот же идентификатор в упакованном виде. Для вставки в текст удобнее навигационная ссылка, а для обмена с внешней системой — чистая строка UID из предыдущего примера.

UID в отладчике конфигуратора

Этот способ выручает, когда объект доступен только внутри работающего кода и отдельную обработку писать лень. Порядок такой:

  1. В конфигураторе откройте нужный модуль и поставьте точку останова клавишей F9 на строке, где уже есть переменная со ссылкой.
  2. Запустите отладку — кнопка «Начать отладку» или F5. Приложение откроется в режиме 1С:Предприятие под отладчиком.
  3. Доведите выполнение до точки останова (откройте тот документ или форму, которые её вызывают).
  4. На останове откройте меню Отладка → Вычислить выражение (Shift+F9) либо перетащите переменную в окно Табло.
  5. Введите выражение ВашаПеременная.УникальныйИдентификатор() и нажмите «Рассчитать».

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

Отладчик удобен тем, что показывает UID в контексте — видно, какая именно ссылка пришла в переменную, если в коде их несколько.

Массовый выгруз UID внешней обработкой

Когда нужен список идентификаторов по всему справочнику — для выверки обмена или загрузки в стороннюю систему, — поможет внешняя обработка с запросом. Консоль запросов здесь бесполезна: язык запросов не умеет возвращать UID как поле, идентификатор достаётся только из ссылки в коде.

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |   Контрагенты.Ссылка КАК Ссылка,
    |   Контрагенты.Код КАК Код,
    |   Контрагенты.Наименование КАК Наименование
    |ИЗ
    |   Справочник.Контрагенты КАК Контрагенты
    |ГДЕ
    |   НЕ Контрагенты.ПометкаУдаления";

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Стр = Выборка.Код + " | " + Выборка.Наименование + " | "
        + Строка(Выборка.Ссылка.УникальныйИдентификатор());
    Сообщить(Стр);
КонецЦикла;

Как запустить обработку:

  1. В конфигураторе создайте внешнюю обработку (Файл → Новый → Внешняя обработка), вынесите код в модуль или команду, сохраните как .epf.
  2. В режиме 1С:Предприятие откройте её через Файл → Открыть и выберите сохранённый файл.
  3. Результат уйдёт в окно служебных сообщений — оттуда его можно скопировать в таблицу.

Открытие произвольных внешних обработок часто закрыто профилем безопасности. Если пункт Файл → Открыть не выполняет .epf, попросите администратора временно дать право или добавьте обработку в справочник дополнительных обработок.

Чтобы выгрузить сразу в файл, замените Сообщить() на запись строк в ТекстовыйДокумент и вызовите его метод Записать().

Где искать UID в XML-выгрузке

Если доступа к конфигуратору нет, а на руках файл выгрузки — идентификаторы читаются прямо в тексте. При полной сериализации объекта через XDTO его ссылка пишется в XML как UID-строка.

Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\temp\obj.xml");
СериализаторXDTO.ЗаписатьXML(Запись, Контрагент.ПолучитьОбъект());
Запись.Закрыть();

Откройте получившийся obj.xml любым текстовым редактором — в атрибуте ссылки объекта вы увидите тот же a7b3c1d0-.... Так же устроены файлы штатной обработки «Выгрузка загрузка данных XML»: каждый объект там помечен своим идентификатором, и по нему узлы сопоставляют записи при загрузке.

Та же логика работает в планах обмена: в сообщении для узла каждая измененная запись выгружается со своим идентификатором, и принимающая база обновляет объект с тем же UID, а не создаёт новый. Именно поэтому распределённые базы (РИБ) держат одинаковые идентификаторы во всех узлах.

В сообщениях формата EnterpriseData объекты связываются не по UID, а по ключевым свойствам (код, ИНН, дата+номер). Не ищите там голый идентификатор — его может не быть.

UID в таблицах СУБД: только для диагностики

Самый низкоуровневый способ — заглянуть в таблицы SQL Server или PostgreSQL. К нему прибегают администраторы баз данных, когда нужно сверить что-то в обход платформы.

Что важно знать о хранении:

  • Справочники лежат в таблицах _Reference<N>, документы — в _Document<N>, где <N> — внутренний номер.
  • UID хранится в поле _IDRRef типа binary(16).
  • Номер таблицы и соответствие метаданным угадывать нельзя — он меняется при реструктуризации.

Имена таблиц и полей одинаковы и для Microsoft SQL Server, и для PostgreSQL, так что запрос переносится между СУБД без правок. Правильную карту «метаданные → имя таблицы и поля» даёт встроенная функция, её запускают из обработки:

Для Каждого Стр Из ПолучитьСтруктуруХраненияБазыДанных() Цикл
    Сообщить(Стр.ИмяТаблицыХранения + " <- " + Строка(Стр.Метаданные));
КонецЦикла;

Байты в _IDRRef хранятся в порядке, отличном от строкового представления, поэтому «на глаз» прочитать привычный a7b3-... из двоичного поля не получится — нужна программная перестановка. Для сверки это терпимо, но как основной способ неудобно.

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

Обратная задача: как найти объект по UID

Чаще нужно не узнать UID, а наоборот — по известному идентификатору получить объект. Например, когда внешняя система прислала строку и надо открыть соответствующий элемент.

Ид = Новый УникальныйИдентификатор("a7b3c1d0-5e4f-11ec-80a2-00155d010a1e");
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Ид);

// проверяем, что объект реально существует
Если Ссылка.ПолучитьОбъект() = Неопределено Тогда
    Сообщить("Объекта с таким UID нет в этом справочнике");
Иначе
    Сообщить("Нашли: " + Ссылка.Наименование);
КонецЕсли;

Два момента, на которых спотыкаются:

  • ПолучитьСсылку() просто собирает ссылку из типа и идентификатора — она не проверяет, есть ли такой объект. Отсюда проверка через ПолучитьОбъект().
  • Тип задаётся менеджером: для документов это Документы.ИмяДокумента.ПолучитьСсылку(Ид). Один и тот же UID в справочнике и в документе — это разные объекты.
Какой способ посмотреть UID выбрать?

Типичные проблемы с UID и их причины

Один и тот же UID в двух базах. После обмена или синхронизации идентификатор намеренно сохраняется — так узлы понимают, что это один объект. Это норма, а не ошибка.

UID изменился после переноса. Если данные грузили не обменом, а, например, через ручное создание объектов, платформа присвоит новые идентификаторы. Ссылки из других баз на такие объекты «повиснут». Поэтому перенос делают штатными механизмами, которые сохраняют UID.

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

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

Предопределённые элементы ведут себя иначе. У предопределённых значений (их заводят в конфигураторе — счета плана счетов, типовые статьи) UID тоже есть, но при переносе между базами платформа сопоставляет их по имени, а не по идентификатору. Поэтому в разных базах у одного предопределённого элемента UID может отличаться, и это нормально. В коде к ним обращаются не по UID, а через ПредопределённоеЗначение("ПланСчетов.Хозрасчетный.Товары").

UID есть не у всего. Идентификатор присваивается ссылочным объектам — справочникам, документам, планам видов характеристик. У записей регистров ссылки, а значит и UID, нет: там запись определяется набором измерений, а не одним ключом.

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

Можно ли узнать UID без конфигуратора и прав разработчика?
Да, если в конфигурации доступна консоль кода из БСП или открытие внешних обработок. Иначе остаётся попросить того, у кого есть доступ, либо прочитать идентификатор из файла выгрузки.
UID и GUID — это одно и то же?
По сути да. UID в 1С — это 128-битный GUID. Разница только в названии: 1С в документации использует термин «уникальный идентификатор».
Меняется ли UID при перепроведении или переименовании объекта?
Нет. Идентификатор присваивается один раз при записи и не меняется ни при каких операциях с объектом, кроме удаления.
Почему запрос не возвращает UID как обычное поле?
Язык запросов работает со ссылками, а не с их внутренним ключом. Идентификатор достаётся только методом УникальныйИдентификатор() в коде, уже после выполнения запроса.
Что хранится в навигационной ссылке после `ref=`?
Тот же идентификатор объекта, но в упакованном шестнадцатеричном виде без дефисов. Канонический вид с дефисами надёжнее получать через Строка(Ссылка.УникальныйИдентификатор()).