К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как получить UID объекта в 1С

Как получить уникальный идентификатор (UID/GUID) объекта в 1С: метод УникальныйИдентификатор(), запросы, консоль кода, обработчики и типичные ошибки.

Уникальный идентификатор (UID, также GUID) — это строка вида «8a3f5c2e-…», которую платформа 1С присваивает каждому объекту базы: элементу справочника, документу, записи регистра. Он нужен для обмена данными между базами, интеграции с внешними системами, поиска конкретного объекта по ссылке и отладки. В отличие от кода или номера, UID не меняется и гарантированно уникален в пределах базы.

Получить UID можно несколькими способами: программно через метод УникальныйИдентификатор(), через запрос с функцией УникальныйИдентификатор(), в консоли кода или через стандартные механизмы поиска по ссылке. Выбор зависит от того, где вы работаете — в конфигураторе, в пользовательском режиме или во внешней обработке.

Важно понимать разницу между UID и навигационной ссылкой. Навигационная ссылка (например, e1cib/data/Справочник.Номенклатура?ref=…) содержит тот же идентификатор, но в другом представлении, и из неё тоже можно извлечь UID при необходимости.

Что такое UID объекта и когда он нужен

UID (уникальный идентификатор) — это 128-битное значение, которое платформа генерирует автоматически при создании объекта. В текстовом виде он выглядит как строка из 36 символов: 8-4-4-4-12 шестнадцатеричных цифр, разделённых дефисами. Идентификатор присваивается один раз и не меняется при редактировании объекта, изменении его кода, наименования или других реквизитов.

Типичные сценарии, где без UID не обойтись: сопоставление объектов при обмене между базами (например, через планы обмена или конвертацию данных), интеграция с сайтом или мобильным приложением, где объект идентифицируется по GUID, поиск «потерянного» объекта по ссылке из логов, а также разбор битых ссылок вида «Объект не найден».

Программное получение UID через метод УникальныйИдентификатор()

Основной способ — метод УникальныйИдентификатор(), доступный у любой ссылки на объект базы данных: справочника, документа, плана видов характеристик, плана счетов и т.д. Метод возвращает значение типа УникальныйИдентификатор.

// Получаем UID существующей ссылки

UIDОбъекта = СсылкаНаОбъект.УникальныйИдентификатор();

// Текстовое представление для вывода или передачи во внешнюю систему

СтрокаUID = Строка(СсылкаНаОбъект.УникальныйИдентификатор());

Сообщить(СтрокаUID); // например: 8a3f5c2e-1b7d-4e9a-a2c1-9f0e5d3b6a84

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

UID = Новый УникальныйИдентификатор("8a3f5c2e-1b7d-4e9a-a2c1-9f0e5d3b6a84");

Ссылка = Справочники.Номенклатура.ПолучитьСсылку(UID);

// Проверка, существует ли объект в базе

Если Ссылка.ПолучитьОбъект() = Неопределено Тогда

Сообщить("Объект с таким UID не найден");

КонецЕсли;

bsl
UIDСтрокой = Строка(СсылкаНаОбъект.УникальныйИдентификатор());
Ссылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(UIDСтрокой));

Получение UID в запросе

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| УникальныйИдентификатор(Номенклатура.Ссылка) КАК UID

|ИЗ

| Справочник.Номенклатура КАК Номенклатура";

Выборка = Запрос.Выполнить().Выбрать();

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

Получение UID в пользовательском режиме без программирования

Если вы не разработчик, а пользователь или администратор, UID можно узнать без написания кода. Самый доступный путь — навигационная ссылка. В режиме «1С:Предприятие» откройте нужный объект, затем в меню (кнопка «Ещё» или через команду интерфейса) выберите «Получить ссылку» / «Вывести ссылку» — платформа покажет строку вида e1cib/data/Справочник.Номенклатура?ref=8a3f5c2e1b7d4e9aa2c19f0e5d3b6a84. Хвост после ref= — это тот же идентификатор, только в служебном шестнадцатеричном представлении с переставленными байтами.

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

Третий вариант — поиск по ссылке через стандартную функцию «Поиск ссылок на объекты» (в типовых конфигурациях: Администрирование → Обслуживание → Поиск и удаление дублей / ссылки). Она не покажет UID напрямую, но поможет убедиться, что объект существует и на него есть ссылки.

Порядок действий
  1. 1
    Откройте объект в режиме 1С:Предприятие
  2. 2
    Через меню получите навигационную ссылку (Получить ссылку)
  3. 3
    Скопируйте фрагмент после ref= — это служебное представление UID
  4. 4
    Если нужен канонический вид с дефисами, выполните в консоли кода Строка(Ссылка.УникальныйИдентификатор())
  5. 5
    Проверьте результат: строка должна содержать 36 символов с 4 дефисами

UID нового объекта до записи

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

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();

// Вариант 1: платформа сама назначит ссылку при записи,

// но мы можем получить её заранее

НовыйЭлемент.УстановитьСсылкуНового(Справочники.Номенклатура.ПолучитьСсылку());

UIDДоЗаписи = НовыйЭлемент.СсылкаНового.УникальныйИдентификатор();

НовыйЭлемент.Наименование = "Тестовый элемент";

НовыйЭлемент.Записать();

Также можно сгенерировать UID самостоятельно через Новый УникальныйИдентификатор() и назначить его новой ссылке — так делают при синхронизации, когда GUID приходит из внешней системы и объект в 1С должен получить именно его.

Извлечение UID из навигационной ссылки и битой ссылки

При разборе ошибок «Объект не найден» в журнале регистрации или в тексте самой битой ссылки (например, <Объект не найден> (123:8a3f...) UID виден прямо в строке, но в служебном формате. Чтобы получить из него ссылку, используется приём с ЗначениеВСтрокуВнутр или формирование строки ссылки вручную:

// Восстановление ссылки из строки вида "Объект не найден (GUID)"

СтрокаСсылки = "8a3f5c2e1b7d4e9aa2c19f0e5d3b6a84"; // 32 символа без дефисов

ТекстСсылки = "[""СправочникСсылка.Номенклатура"",""" + СтрокаСсылки + """]";

Ссылка = ЗначениеИзСтрокиВнутр("{" + ТекстСсылки + "}");

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

Типичные ошибки
01
Вырезание UID из навигационной ссылки ref= и передача его как есть — порядок байтов отличается от канонического GUID, внешняя система не найдёт объект
02
Сравнение UID со строкой в запросе через ГДЕ — типы не совпадают, запрос вернёт пустой результат или ошибку
03
Использование кода или номера документа вместо UID для интеграции — коды не уникальны и могут меняться
04
Получение ссылки по UID без проверки существования объекта — при отсутствии объекта дальнейшая работа со ссылкой даст ошибку обращения к данным

Проверка результата и контрольные точки

После получения UID убедитесь, что он корректен. Каноническое строковое представление содержит ровно 36 символов: 32 шестнадцатеричные цифры и 4 дефиса в позициях 9, 14, 19, 24. Если длина другая — скорее всего, вы взяли служебное представление из навигационной ссылки или обрезали строку.

Финальная проверка — обратное получение ссылки: передайте UID в ПолучитьСсылку() и убедитесь, что Ссылка.ПолучитьОбъект() возвращает объект, а не Неопределено. Это подтверждает, что идентификатор соответствует реально существующему объекту именно в этой базе.

Контрольные точки

Как проверить результат

Формат строки UID
Норма

36 символов, вид 8-4-4-4-12 с дефисами

Тревожный признак

32 символа без дефисов или другая длина — взято служебное представление

Обратное получение ссылки
Норма

ПолучитьСсылку(UID) возвращает существующий объект

Тревожный признак

ПолучитьОбъект() возвращает Неопределено — объекта нет в базе

Совпадение при обмене
Норма

UID объекта в обеих базах одинаков

Тревожный признак

UID различаются — объекты не сопоставлены, нужна синхронизация по GUID

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

Чем UID отличается от кода справочника или номера документа?

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

Можно ли получить UID записи регистра сведений?

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

Как получить UID всех элементов справочника для выгрузки?

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

Изменится ли UID при переносе объекта в другую базу?

Зависит от способа переноса. При обмене через планы обмена, конвертацию данных или выгрузку/загрузку XML с сохранением ссылок UID сохраняется. Если объект создаётся в новой базе «с нуля» (например, вводом вручную или загрузкой без сопоставления ссылок), он получит новый UID.

Почему Строка(UID) и вырезка из навигационной ссылки не совпадают?

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

Как найти объект, если известен только UID из внешней системы?

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

Итог

Что важно запомнить

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