Идентификатор объекта в 1С: UUID, ссылка и имя метаданных
Содержание
Чаще всего под «идентификатором объекта» в 1С понимают UUID ссылки — тот самый GUID вида 550e8400-e29b-41d4-a716-446655440000. Получить его в коде можно одной строкой: Ссылка.УникальныйИдентификатор(). Но узнать идентификатор объекта бывает нужно и без программирования — скопировать навигационную ссылку прямо из формы, а ещё отличить его от имени объекта метаданных и от внутреннего кода справочника.
Разберём все способы: как вытащить UUID и ссылку в режиме «Предприятие», где посмотреть объект в конфигураторе, как увидеть идентификатор в отладчике, как работать со ссылками в запросах и чем особенны распределённые базы. Примеры кода — рабочие, их можно скопировать кнопкой.
Какие бывают идентификаторы объекта в 1С
Слово «идентификатор» в 1С относится сразу к нескольким разным вещам. Прежде чем искать, определитесь, что именно вам нужно.
- 🔑 UUID ссылки (GUID) — уникальный идентификатор элемента данных: конкретной номенклатуры, документа, контрагента. Хранится в базе, не меняется при переименовании и остаётся тем же во всех узлах РИБ.
- 🏷️ Имя объекта метаданных — строковое имя из конфигурации:
Номенклатура,РеализацияТоваровУслуг. Полное имя добавляет вид объекта:Справочник.Номенклатура. - 🧩 Внутренний UUID метаданных — GUID самого объекта конфигурации (не данных). Виден при выгрузке конфигурации в XML, нужен для сравнения и анализа конфигураций.
- #️⃣ Код или номер — реквизит
Кодсправочника либоНомердокумента. Это бизнес-идентификатор, его видит пользователь, и он может повторяться или меняться.
Чтобы не путать их между собой, держите в голове короткую сводку:
| Идентификатор | Где берут | Меняется? | Для чего |
|---|---|---|---|
| UUID ссылки | Ссылка.УникальныйИдентификатор() | нет | связи между базами, внешние системы |
| Полное имя метаданных | Ссылка.Метаданные().ПолноеИмя() | при переименовании в конфигураторе | универсальный код, анализ типа |
| Внутренний UUID метаданных | выгрузка конфигурации в XML | нет | сравнение конфигураций, расширения |
| Код / Номер | реквизит объекта | да, вручную | бизнес-идентификатор для людей |
Дальше речь в основном про UUID ссылки и имя метаданных — именно их имеют в виду разработчики, когда спрашивают, как узнать идентификатор объекта.
UUID и код — не одно и то же. Код можно поменять вручную, UUID — нет. Для связей между базами и внешними системами всегда опирайтесь на UUID.
Отдельно стоит понимать уровень уникальности. UUID уникален в пределах одного вида объектов и, на практике, по всей базе — вероятность совпадения двух случайных GUID пренебрежимо мала. Поэтому для надёжного поиска объекта по идентификатору всегда указывают и UUID, и тип: один и тот же UUID теоретически может встретиться у ссылки другого вида, хотя в реальной работе это почти не случается.
Как получить UUID ссылки программно
В режиме «Предприятие» UUID достаётся из любой ссылки методом УникальныйИдентификатор(). Он возвращает значение типа УникальныйИдентификатор, которое легко превратить в строку.
// Получаем UUID ссылки
Идентификатор = Ссылка.УникальныйИдентификатор();
Текст = Строка(Идентификатор); // "550e8400-e29b-41d4-a716-446655440000"
Обратная операция — восстановить ссылку по известному UUID. Для этого у каждого менеджера объекта есть метод ПолучитьСсылку():
Ид = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
СсылкаНоменклатуры = Справочники.Номенклатура.ПолучитьСсылку(Ид);
Важная деталь: ПолучитьСсылку() создаёт ссылку даже если объекта с таким UUID в базе нет. Метод не обращается к базе и не проверяет существование. Поэтому результат почти всегда стоит проверить:
Если СсылкаНоменклатуры.Пустая() ИЛИ НЕ ЗначениеЗаполнено(СсылкаНоменклатуры)
ИЛИ СсылкаНоменклатуры.ПолучитьОбъект() = Неопределено Тогда
Сообщить("Объект не найден");
КонецЕсли;
Ещё один рабочий способ получить строковое представление ссылки — функция XMLСтрока(). Для ссылочных типов она возвращает тот же UUID в виде строки, что удобно при обмене данными:
СтрокаUUID = XMLСтрока(Ссылка); // UUID строкой, формат XML
Если нужно пройтись по множеству объектов и собрать их идентификаторы, подойдёт простой цикл по выборке из менеджера:
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
UUID = Выборка.Ссылка.УникальныйИдентификатор();
Сообщить(Выборка.Наименование + ": " + Строка(UUID));
КонецЦикла;
Для больших объёмов лучше брать данные запросом и получать UUID уже при обходе результата — так платформа не читает каждый объект целиком.
Не путайте UUID ссылки с результатом Строка(Ссылка). Второе возвращает представление объекта (например, наименование номенклатуры), а не идентификатор. Для технических задач берите именно УникальныйИдентификатор().
Имя и полное имя объекта метаданных
Если нужен не UUID данных, а имя самого объекта конфигурации, работайте через Метаданные(). Метод есть у любой ссылки и объекта.
Имя = Ссылка.Метаданные().Имя; // "Номенклатура"
ПолноеИмя = Ссылка.Метаданные().ПолноеИмя(); // "Справочник.Номенклатура"
Синоним = Ссылка.Метаданные().Синоним; // "Номенклатура" (как видит пользователь)
Полное имя удобно, когда тип объекта заранее неизвестен — например, в универсальной обработке, которая получает произвольную ссылку. По строке Справочник.Номенклатура или Документ.РеализацияТоваровУслуг вы однозначно понимаете, с чем имеете дело.
Обратный путь — получить менеджер объекта по его полному имени:
Менеджер = МенеджерПоПолномуИмени("Справочник.Номенклатура");
// Если такого метода нет под рукой — используйте типовой общий модуль
В разных конфигурациях вспомогательные функции называются по-разному. Сам метод Метаданные() платформенный и есть всегда, а обёртки вроде «получить менеджер по имени» ищите в общих модулях своей конфигурации.
Ссылка на объект без программирования
Разработчику код не нужен, чтобы быстро вытащить идентификатор конкретного элемента. В «Предприятии» для этого есть стандартная команда.
- Откройте элемент справочника или документ.
- Нажмите кнопку «Ещё» в правом верхнем углу формы.
- Выберите пункт «Получить ссылку» (в тонком клиенте он есть почти у всех форм).
- Платформа покажет навигационную ссылку вида
e1cib/data/Справочник.Номенклатура?ref=8a7b6c....
В этой строке после ref= — внутреннее представление ссылки, включающее UUID объекта. Такую ссылку можно отправить коллеге: он вставит её в адресную строку клиента и попадёт прямо на нужный объект.
Программный аналог этой команды — функция ПолучитьНавигационнуюСсылку():
Нав = ПолучитьНавигационнуюСсылку(Ссылка);
// "e1cib/data/Справочник.Номенклатура?ref=..."
Навигационная ссылка — самый быстрый способ «показать пальцем» на объект в переписке или в задаче. UUID из неё можно вытащить, но для программной обработки чаще берут УникальныйИдентификатор() напрямую.
Где найти объект в конфигураторе
В конфигураторе объекты видны по именам — в дереве метаданных слева. Чтобы быстро найти нужный:
- откройте дерево конфигурации (
Конфигурация → Открыть конфигурацию); - разверните ветку нужного вида —
Справочники,Документы,Регистры сведенийи так далее; - для поиска по всей конфигурации удобна команда поиска по дереву — начните набирать имя объекта.
Свойство Имя объекта метаданных и есть его идентификатор на уровне конфигурации. Платформа различает объекты именно по имени, а не по синониму.
Внутренний GUID объекта метаданных в палитре свойств не показывается. Увидеть его можно, выгрузив конфигурацию в XML-файлы: Конфигурация → Выгрузить конфигурацию в файлы. В полученных .xml у каждого объекта есть атрибут uuid — это и есть внутренний идентификатор метаданных. Он нужен в основном для сравнения конфигураций и анализа расширений, в прикладном коде им почти не пользуются.
Внутренний UUID метаданных и UUID ссылки на данные — это разные идентификаторы. Первый описывает объект конфигурации (саму «таблицу»), второй — конкретную запись в ней.
Идентификатор в отладчике и табло значений
Когда программа остановлена на точке останова, UUID переменной-ссылки можно посмотреть не выходя из отладчика.
- 🔍 Вычислить выражение (
Отладка → Вычислить выражение, либо горячая клавиша). ВведитеСсылка.УникальныйИдентификатор()— платформа покажет GUID. - 📊 Табло. Добавьте в табло выражение
Строка(Ссылка.УникальныйИдентификатор())— значение будет пересчитываться на каждом шаге. - 🖱️ Всплывающая подсказка. Если навести курсор на переменную-ссылку, платформа показывает её представление (наименование), но не UUID. Чтобы увидеть именно идентификатор, добавьте в табло вызов метода.
Такой приём выручает, когда нужно поймать, какой именно объект пришёл в процедуру — например, при разборе проблемы с проведением одного конкретного документа из сотен похожих.
Отдельно пригодится связка с журналом регистрации. Если в логе записана ошибка по объекту, его навигационную ссылку видно прямо в данных события — по ней вы открываете объект и сверяете UUID с тем, что поймали в отладчике. Так удобно подтверждать, что ошибка касается именно того документа, о котором идёт речь, а не его копии.
Идентификаторы в запросах
В языке запросов 1С отдельной функции «получить UUID» нет. Со ссылкой в запросе работают иначе — отбирают по ней, проверяют тип и приводят к нужному типу.
Отбор по ссылке. Передайте ссылку параметром и сравните поле с ней:
ВЫБРАТЬ
Товары.Номенклатура,
Товары.Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Ссылка = &Ссылка
Проверка типа ссылки. Оператор ССЫЛКА отвечает, относится ли значение к нужному типу — полезно для составных полей вроде Регистратор:
ГДЕ
ДвиженияВзаиморасчётов.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
Приведение типа. Оператор ВЫРАЗИТЬ превращает составное поле в конкретный тип, после чего доступны его реквизиты:
ВЫБРАТЬ
ВЫРАЗИТЬ(Движения.Регистратор КАК Документ.РеализацияТоваровУслуг).Контрагент
ИЗ
РегистрНакопления.Продажи КАК Движения
А сам UUID достают уже в коде: выбираете поле Ссылка, обходите результат и вызываете Выборка.Ссылка.УникальныйИдентификатор(). В запросе хранится и сравнивается именно ссылка целиком, а GUID — её свойство на уровне встроенного языка.
Если на входе есть строка UUID, а объект нужно найти запросом, сначала соберите ссылку в коде через ПолучитьСсылку(), а затем передайте её параметром &Ссылка. Искать по текстовому представлению GUID прямо в запросе нельзя — поля ссылки не хранят UUID как строку, и сравнение с текстом работать не будет.
Особенности распределённых баз (РИБ)
Главное правило РИБ: UUID ссылки одинаков во всех узлах. Один и тот же элемент номенклатуры в центральной базе и в периферийной имеет один и тот же идентификатор — платформа переносит его вместе с данными. Благодаря этому ссылки не «ломаются» при обмене и объекты не задваиваются.
Из этого следуют практические выводы:
- Код, который ищет объект по UUID, работает в любом узле без изменений.
- Для связи с внешними системами (сайт, маркетплейс, другая учётная система) опирайтесь на UUID, а не на код — код в узлах может расходиться, UUID нет.
- У самого узла плана обмена тоже есть идентификатор — реквизит
Кодузла. Не путайте его с UUID данных: код узла задаёт администратор, он короткий и человекочитаемый.
Если в двух базах, которые изначально создавались отдельно (а не из одной через РИБ), у «одинаковых» справочников разные UUID — это нормально. Совпадение идентификаторов гарантировано только внутри одной распределённой базы.
Частые вопросы
Отдельно соберём ошибки и вопросы, которые возникают чаще всего.
Чем UUID отличается от кода справочника?
Как получить ссылку по строке UUID?
Новый УникальныйИдентификатор("...") и передайте в Справочники.ИмяСправочника.ПолучитьСсылку(). Для документов и других типов — аналогичный менеджер.Меняется ли UUID при переименовании объекта или смене кода?
Как узнать имя объекта метаданных по произвольной ссылке?
Ссылка.Метаданные().ПолноеИмя() — получите строку вида Справочник.Номенклатура. Свойство .Имя вернёт только короткое имя.Можно ли увидеть UUID прямо в интерфейсе?
ref=. В отладчике UUID смотрят через «Вычислить выражение».