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

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

Как получить идентификатор объекта метаданных в 1С

Способы получить идентификатор объекта метаданных в 1С: через функцию ОбщегоНазначения, запрос к плану видов характеристик и конфигуратор. Примеры кода и разбор ошибок.

Идентификатор объекта метаданных в 1С — это ссылка на элемент служебного справочника «Идентификаторы объектов метаданных», который платформа ведёт автоматически для каждого объекта конфигурации: справочника, документа, регистра, отчёта и так далее. Он нужен везде, где требуется единообразно ссылаться на тип объекта: в механизмах прав доступа, версионировании, дополнительных отчётах и обработках, обменах данными.

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

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

Что такое идентификатор объекта метаданных и где он хранится

Платформа 1С:Предприятие 8.3 автоматически создаёт в информационной базе служебный справочник «Идентификаторы объектов метаданных». Каждому объекту конфигурации (справочнику, документу, регистру сведений, плану обмена и т.д.) соответствует один элемент этого справочника. Ссылка на такой элемент и есть идентификатор объекта метаданных.

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

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

Получение идентификатора через БСП (стандартный способ)

В конфигурациях на базе Библиотеки стандартных подсистем (Управление торговлей, ERP, Бухгалтерия предприятия, ЗУП и большинство типовых) есть готовая функция общего модуля ОбщегоНазначения. Это рекомендуемый способ: он использует кэш и работает быстрее прямого запроса.

Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Справочник.Номенклатура");

Функция принимает полное имя объекта метаданных в виде строки либо объект описания метаданных. Возвращает ссылку на элемент справочника «Идентификаторы объектов метаданных». Если объект не найден, поведение зависит от версии БСП: функция может вернуть пустую ссылку или вызвать исключение, поэтому результат стоит проверять.

Есть и обратная задача — получить объект метаданных по идентификатору. Для этого в БСП существует функция ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Идентификатор), которая возвращает объект описания метаданных.

bsl
Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Документ.РеализацияТоваровУслуг");
Если НЕ ЗначениеЗаполнено(Идентификатор) Тогда
    ВызватьИсключение "Идентификатор объекта метаданных не найден";
КонецЕсли;

Получение идентификатора запросом без БСП

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

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

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

"ВЫБРАТЬ

| Идентификаторы.Ссылка КАК Ссылка

|ИЗ

| Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы

|ГДЕ

| Идентификаторы.ПолноеИмя = &ПолноеИмя";

Запрос.УстановитьПараметр("ПолноеИмя", "Справочник.Номенклатура");

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

Если Выборка.Следующий() Тогда

Идентификатор = Выборка.Ссылка;

КонецЕсли;

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

Если вы часто обращаетесь к идентификаторам в цикле, не выполняйте запрос на каждой итерации — выберите все нужные идентификаторы одним запросом с условием В (&СписокИмен) и разложите результат в соответствие.

Порядок действий без БСП
  1. 1
    Определите полное имя объекта: вид метаданных + точка + имя, например «РегистрСведений.КурсыВалют»
  2. 2
    Сформируйте запрос к Справочник.ИдентификаторыОбъектовМетаданных с отбором по реквизиту ПолноеИмя
  3. 3
    Выполните запрос и проверьте, что выборка не пустая
  4. 4
    Сохраните полученную ссылку и при повторных обращениях используйте кэш, а не новый запрос

Как узнать полное имя объекта метаданных

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

ПолноеИмя = Метаданные.Справочники.Номенклатура.ПолноеИмя();

// Результат: "Справочник.Номенклатура"

Если у вас есть ссылка на объект данных (конкретный элемент справочника или документ), полное имя его метаданных получают так: Ссылка.Метаданные().ПолноеИмя(). Это удобно в универсальных алгоритмах, где тип объекта заранее неизвестен.

В конфигураторе полное имя можно составить вручную: вид объекта в единственном числе без пробелов (Справочник, Документ, РегистрСведений, РегистрНакопления, ПланВидовХарактеристик, Отчет, Обработка) плюс точка плюс имя объекта, как оно задано в дереве конфигурации.

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

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

Быстрый способ посмотреть идентификатор вручную — открыть в режиме 1С:Предприятие справочник «Идентификаторы объектов метаданных» через «Все функции» (если он выведен в интерфейс) или через универсальный отчёт/консоль запросов и найти нужный объект по имени.

Типичные ошибки
01
Поиск по реквизиту Имя вместо ПолноеИмя — разные объекты могут иметь одинаковое краткое имя, и запрос вернёт не тот элемент
02
Обращение к справочнику до обновления конфигурации базы — в свежеразвёрнутой базе элементы ещё не созданы, запрос возвращает пустоту
03
Запрос идентификатора внутри цикла по каждой строке — резкое падение производительности при больших объёмах
04
Хранение идентификатора как строки GUID вместо ссылки — при переносе данных между базами GUID может не совпасть

Особенности и ограничения

Справочник «Идентификаторы объектов метаданных» является служебным: редактировать его элементы вручную не следует. Платформа пересоздаёт и синхронизирует их сама при обновлении конфигурации базы данных. Ручное изменение может нарушить работу механизмов прав доступа и подсистем, опирающихся на идентификаторы.

При обмене данными между базами с разными конфигурациями идентификаторы не переносятся «как есть» — в каждой базе они свои. Если в обмене участвуют ссылки на идентификаторы, сопоставление нужно строить по полному имени объекта, а не по GUID ссылки.

В расширениях конфигурации для добавленных расширением объектов используется отдельный справочник «Идентификаторы объектов расширений». Если ваш объект добавлен расширением, ищите его там — в основном справочнике его не будет.

FAQ

Чем идентификатор объекта метаданных отличается от GUID объекта данных?

Идентификатор объекта метаданных указывает на тип объекта конфигурации (например, справочник «Номенклатура» целиком), а GUID — на конкретный элемент данных (конкретную номенклатурную позицию). Это разные уровни: метаданные против данных.

Можно ли получить идентификатор по ссылке на элемент данных?

Да. Сначала получите метаданные ссылки: Ссылка.Метаданные(), затем передайте полное имя в функцию БСП или в запрос: ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Ссылка.Метаданные()).

Почему функция возвращает пустую ссылку?

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

Работает ли поиск идентификатора во внешнем соединении или через COM?

Да, если у вас есть доступ к запросам через внешнее соединение, запрос к справочнику выполняется так же. Функции БСП при этом вызывать сложнее, поэтому обычно используют прямой запрос по полному имени.

Нужно ли кэшировать идентификаторы?

Да, если обращения частые. В БСП кэширование уже встроено в функцию. В самописном коде сохраняйте полученные ссылки в соответствие на время работы процедуры, чтобы не выполнять запрос повторно.

Итог

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

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