Как получить UUID объекта в 1С — через интерфейс, код и отладчик

· 9 мин

Содержание

Внутренний идентификатор любого объекта 1С — справочника, документа, задачи — это UUID (он же GUID): 128-битное число, которое платформа присваивает элементу при создании. Из кода его получают одной строкой: Строка(Ссылка.УникальныйИдентификатор()). Без программирования — через главное меню и пункт «Получить ссылку».

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

Что такое идентификатор объекта и из чего он состоит

Идентификатор объекта — это UUID (Universally Unique Identifier), в документации 1С он же называется GUID и уникальный идентификатор. Записывается в каноническом виде: 36 символов, пять групп шестнадцатеричных цифр через дефис, например a1f3b2c0-5d41-4e8a-9b07-2c3d4e5f6071.

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

Не путайте внутренний идентификатор с навигационной ссылкой. Навигационная ссылка (e1cib/data/...) — это адрес для перехода внутри программы, он включает UUID как часть. Сам UUID — это только идентификатор, без указания способа открыть объект.

Важно не путать UUID с привычными полями:

  • 🔢 Код и номер — реквизиты для людей. Их видно в списках, они могут повторяться в разных справочниках и их можно поменять вручную.
  • 🧬 UUID — внутренний ключ. Он не показывается по умолчанию, не меняется за всё время жизни объекта и не используется повторно даже после пометки на удаление.

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

Во внутренней структуре СУБД ссылка хранится в бинарном поле фиксированной длины (16 байт). Администратору, который смотрит на таблицы базы напрямую, этот столбец виден как двоичное значение, а не как привычная строка с дефисами — строковое представление формирует уже платформа. Пустой ссылке (Справочники.Контрагенты.ПустаяСсылка()) соответствует нулевой идентификатор 00000000-0000-0000-0000-000000000000.

Как узнать идентификатор через интерфейс без программирования

Самый быстрый способ для обычного пользователя — навигационная ссылка.

  1. Откройте карточку объекта (элемент справочника, документ).
  2. Нажмите кнопку главного меню — пиктограмма в левом верхнем углу окна.
  3. Выберите пункт Получить ссылку.
  4. В открывшемся окне скопируйте строку вида e1cib/data/Справочник.Контрагенты?ref=a1f3b2c05d414e8a9b072c3d4e5f6071.

Часть после ref= — это и есть идентификатор объекта в шестнадцатеричном виде, без дефисов. Сам префикс e1cib/data/ означает конкретный объект; если открыть ссылку в 1С (главное меню → Перейти по ссылке), платформа откроет ту же карточку.

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

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

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

Получение UUID в коде: метод УникальныйИдентификатор()

У любой ссылки есть метод УникальныйИдентификатор(). Он возвращает значение типа УникальныйИдентификатор, а для строки его оборачивают в Строка():

// Ссылка на конкретный объект уже есть в переменной
Идентификатор = Ссылка.УникальныйИдентификатор();
СтрокаUUID = Строка(Идентификатор);

Сообщить(СтрокаUUID); // a1f3b2c0-5d41-4e8a-9b07-2c3d4e5f6071

Метод работает одинаково для элементов справочников, документов, планов видов характеристик и прочих ссылочных типов. Для записей регистров сведений или наборов записей UUID не применяется — у них нет ссылок, их различают по значениям измерений.

Если нужно вывести идентификатор в служебных сообщениях при разборе данных, добавьте в вывод и представление объекта: Сообщить(СтрокаUUID + " — " + Строка(Ссылка)). Так в логе видно и номер, и ключ.

Из запроса получить UUID напрямую нельзя — в языке запросов нет функции-обёртки над идентификатором. Если нужен список «объект → UUID», выберите ссылки запросом, а строку соберите уже в коде, обходя выборку:

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

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

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

Как получить объект по UUID и проверить, что он есть

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

Ид = Новый УникальныйИдентификатор("a1f3b2c0-5d41-4e8a-9b07-2c3d4e5f6071");
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Ид);

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

Проверка через ПолучитьОбъект() обязательна: без неё легко получить «висящую» ссылку на несуществующий элемент.

Преобразование: строка, GUID и обратно в ссылку

Тип УникальныйИдентификатор свободно превращается в строку и обратно. Это пригождается, когда идентификатор хранится в текстовом реквизите, передаётся через файл или приходит из внешней системы.

ЗадачаКак сделать
UUID → строкаСтрока(Идентификатор) или XMLСтрока(Идентификатор)
Строка → UUIDНовый УникальныйИдентификатор(СтрокаUUID)
UUID → ссылка на объектСправочники.Контрагенты.ПолучитьСсылку(Идентификатор)

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

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

Ид = Новый УникальныйИдентификатор("a1f3b2c0-5d41-4e8a-9b07-2c3d4e5f6071");
Ссылка = Справочники.Контрагенты.ПолучитьСсылку(Ид);

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

Просмотр идентификатора в отладчике

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

  • Табло. Остановитесь на точке останова, добавьте в табло выражение Ссылка.УникальныйИдентификатор() — платформа покажет значение.
  • Вычислить выражение. Команда Вычислить выражение (Shift+F9) позволяет на паузе выполнить Строка(Ссылка.УникальныйИдентификатор()) и сразу увидеть каноническую строку.

Отладка серверного кода требует, чтобы отладка по протоколу была включена в параметрах информационной базы и в настройках сервера; тогда идентификатор одинаково доступен и в клиентском, и в серверном контексте.

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

Поиск объекта по идентификатору в распределённых базах

В распределённой информационной базе (РИБ) идентификатор объекта одинаков во всех узлах. Это основа механизма обмена: когда объект уходит в другой узел, его UUID сохраняется, поэтому ссылки между документами не рвутся.

Отсюда простое правило:

  • 🟢 РИБ. Один и тот же элемент в центральной базе и в периферийной имеет один UUID. Ищите объект по идентификатору напрямую через ПолучитьСсылку — он найдётся в любом узле.
  • 🔴 Обычный обмен (через правила конвертации, КД 2.0/3.0, синхронизацию). Идентификаторы в базах-участницах, как правило, разные. Объекты сопоставляются по правилам обмена и реквизитам (ИНН, код, наименование), а не по UUID.

Если переносите данные между двумя базами и нужна сверка «тот же это объект или нет», в РИБ сравнивайте UUID, а в обычном обмене — ключевые реквизиты. Сравнение по UUID между базами, не связанными РИБ, даст неверный результат.

На практике это проявляется так: вы выгрузили элемент из рабочей базы, загрузили в копию через типовой обмен и пытаетесь найти его по старому идентификатору — а поиск возвращает пустую ссылку. Если копия сделана не выгрузкой/загрузкой всей базы (.dt) и не настроена как узел РИБ, идентификатор у загруженного объекта будет свой. В этом случае сопоставляйте объекты по реквизитам или заранее сохраняйте карту «исходный UUID → UUID в приёмнике».

Идентификатор во внешних системах и OData-обмене

Чаще всего UUID нужен не внутри самой 1С, а на стыке с другими программами. Поэтому идентификатор используют там, где код и наименование ненадёжны.

  • 🔌 Интеграции через REST. Если база опубликована как автоматический OData-сервис (Администрирование → Публикация на веб-сервере), каждый объект в ответе сервиса имеет поле Ref_Key — это и есть его UUID в строковом виде. Внешняя система адресует объект именно по Ref_Key, запрашивая, например, запись справочника по этому ключу.
  • 🗂 Сопоставление справочников. При разовом переносе данных таблицу «UUID → объект» хранят как карту соответствия, чтобы при повторной загрузке не плодить дубли.
  • 🛠 Обращения в поддержку и анализ логов. В технологическом журнале и в журнале регистрации объекты фигурируют по идентификатору. Зная UUID, вы точно укажете, о каком именно документе идёт речь.

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

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

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

Отдельно — промахи, из-за которых «тот же» объект вдруг не находится.

  • ❌ Берут код вместо UUID. Код из карточки — это не идентификатор. По нему нельзя надёжно найти объект через ПолучитьСсылку.
  • ❌ Копируют строку из навигационной ссылки и ждут совпадения с кодом из Строка(). В ссылке ref= байты переставлены, прямое текстовое сравнение двух форм даст «не равно». Приводите оба значения к типу УникальныйИдентификатор и сравнивайте их.
  • ❌ Считают, что ПолучитьСсылку гарантирует существование. Метод вернёт ссылку даже на несуществующий UUID. Проверяйте чтением или запросом.
  • ❌ Ищут по UUID между базами обычного обмена. Там идентификаторы разные. Такой поиск работает только в РИБ.

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

Чем отличается UUID от GUID в 1С?
Это одно и то же. В документации и во встроенном языке используется термин «уникальный идентификатор», а UUID и GUID — его общепринятые названия. Тип данных называется УникальныйИдентификатор.
Меняется ли идентификатор при изменении реквизитов объекта?
Нет. UUID присваивается при создании объекта и не меняется, даже если вы поменяли код, наименование или перенесли элемент в другую группу.
Можно ли задать объекту свой UUID вручную?
При создании элемента программно идентификатор можно установить через метод УстановитьНовыйУникальныйИдентификатор у объекта (до записи). Вручную через интерфейс задать произвольный UUID нельзя.
Как по UUID понять, какой это тип объекта?
Сам идентификатор типа не хранит. Чтобы получить ссылку, нужно знать менеджер объекта (Справочники.Контрагенты, Документы.ЗаказПокупателя и т. д.). Один UUID без указания типа однозначно объект не определяет.
Виден ли идентификатор обычному пользователю?
По умолчанию нет — в списках и карточках UUID не выводится. Получить его может любой пользователь через пункт «Получить ссылку», а в каноническом виде — разработчик из кода или отладчика.