Разработка и Конфигурация · 9 мин
Как получить идентификатор объекта метаданных в 1С
Способы получить идентификатор объекта метаданных в 1С: через функцию ОбщегоНазначения, запрос к плану видов характеристик и конфигуратор. Примеры кода и разбор ошибок.
Идентификатор объекта метаданных в 1С — это ссылка на элемент служебного справочника «Идентификаторы объектов метаданных», который платформа ведёт автоматически для каждого объекта конфигурации: справочника, документа, регистра, отчёта и так далее. Он нужен везде, где требуется единообразно ссылаться на тип объекта: в механизмах прав доступа, версионировании, дополнительных отчётах и обработках, обменах данными.
Главная сложность в том, что этот идентификатор нельзя «вычислить» из имени объекта напрямую — его нужно получить из базы данных. При этом способ получения зависит от того, работаете ли вы в конфигурации с Библиотекой стандартных подсистем (БСП) или в самописной конфигурации без неё.
Ниже разобраны рабочие способы: стандартная функция БСП, запрос к справочнику вручную, получение идентификатора через предопределённое имя и поиск по полному имени метаданных. Каждый вариант сопровождается примером кода и указанием, когда он применим.
Что такое идентификатор объекта метаданных и где он хранится
Платформа 1С:Предприятие 8.3 автоматически создаёт в информационной базе служебный справочник «Идентификаторы объектов метаданных». Каждому объекту конфигурации (справочнику, документу, регистру сведений, плану обмена и т.д.) соответствует один элемент этого справочника. Ссылка на такой элемент и есть идентификатор объекта метаданных.
Идентификатор стабилен: он не меняется при переименовании объекта в конфигураторе, потому что платформа сопоставляет элементы справочника с объектами по внутренним ключам, а не по имени. Именно поэтому на идентификаторы безопасно ссылаться из настроек, хранящихся в базе, — например, из наборов прав доступа или привязок дополнительных обработок.
Обратите внимание: элементы справочника создаются и обновляются платформой при обновлении конфигурации базы данных. Если вы разворачиваете новую базу, идентификаторы появятся автоматически после первого запуска обновления. До этого момента запросы к справочнику вернут пустой результат.
Получение идентификатора через БСП (стандартный способ)
В конфигурациях на базе Библиотеки стандартных подсистем (Управление торговлей, ERP, Бухгалтерия предприятия, ЗУП и большинство типовых) есть готовая функция общего модуля ОбщегоНазначения. Это рекомендуемый способ: он использует кэш и работает быстрее прямого запроса.
Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Справочник.Номенклатура");
Функция принимает полное имя объекта метаданных в виде строки либо объект описания метаданных. Возвращает ссылку на элемент справочника «Идентификаторы объектов метаданных». Если объект не найден, поведение зависит от версии БСП: функция может вернуть пустую ссылку или вызвать исключение, поэтому результат стоит проверять.
Есть и обратная задача — получить объект метаданных по идентификатору. Для этого в БСП существует функция ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Идентификатор), которая возвращает объект описания метаданных.
Идентификатор = ОбщегоНазначения.ИдентификаторОбъектаМетаданных("Документ.РеализацияТоваровУслуг");
Если НЕ ЗначениеЗаполнено(Идентификатор) Тогда
ВызватьИсключение "Идентификатор объекта метаданных не найден";
КонецЕсли;Получение идентификатора запросом без БСП
В самописной конфигурации без БСП идентификатор получают прямым запросом к справочнику. У элементов есть реквизит Имя (краткое имя объекта) и ПолноеИмя — надёжнее искать по полному имени, чтобы избежать неоднозначности.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Идентификаторы.Ссылка КАК Ссылка
|ИЗ
| Справочник.ИдентификаторыОбъектовМетаданных КАК Идентификаторы
|ГДЕ
| Идентификаторы.ПолноеИмя = &ПолноеИмя";
Запрос.УстановитьПараметр("ПолноеИмя", "Справочник.Номенклатура");
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Идентификатор = Выборка.Ссылка;
КонецЕсли;
Такой запрос работает в любой конфигурации, где справочник доступен. Учтите, что в некоторых конфигурациях справочник может называться «Идентификаторы объектов расширений» дополнительно — он хранит идентификаторы объектов, добавленных расширениями конфигурации.
Если вы часто обращаетесь к идентификаторам в цикле, не выполняйте запрос на каждой итерации — выберите все нужные идентификаторы одним запросом с условием В (&СписокИмен) и разложите результат в соответствие.
- 1Определите полное имя объекта: вид метаданных + точка + имя, например «РегистрСведений.КурсыВалют»
- 2Сформируйте запрос к Справочник.ИдентификаторыОбъектовМетаданных с отбором по реквизиту ПолноеИмя
- 3Выполните запрос и проверьте, что выборка не пустая
- 4Сохраните полученную ссылку и при повторных обращениях используйте кэш, а не новый запрос
Как узнать полное имя объекта метаданных
Полное имя — ключ для поиска идентификатора. Программно его получают через объект описания метаданных:
ПолноеИмя = Метаданные.Справочники.Номенклатура.ПолноеИмя();
// Результат: "Справочник.Номенклатура"
Если у вас есть ссылка на объект данных (конкретный элемент справочника или документ), полное имя его метаданных получают так: Ссылка.Метаданные().ПолноеИмя(). Это удобно в универсальных алгоритмах, где тип объекта заранее неизвестен.
В конфигураторе полное имя можно составить вручную: вид объекта в единственном числе без пробелов (Справочник, Документ, РегистрСведений, РегистрНакопления, ПланВидовХарактеристик, Отчет, Обработка) плюс точка плюс имя объекта, как оно задано в дереве конфигурации.
Проверка результата и типичные ошибки
После получения идентификатора убедитесь, что это не пустая ссылка и не Неопределено. Простейшая проверка — ЗначениеЗаполнено(Идентификатор). Дополнительно можно проверить, что элемент не помечен на удаление: помеченные элементы иногда остаются в базе после штатной работы механизмов обновления.
Быстрый способ посмотреть идентификатор вручную — открыть в режиме 1С:Предприятие справочник «Идентификаторы объектов метаданных» через «Все функции» (если он выведен в интерфейс) или через универсальный отчёт/консоль запросов и найти нужный объект по имени.
Особенности и ограничения
Справочник «Идентификаторы объектов метаданных» является служебным: редактировать его элементы вручную не следует. Платформа пересоздаёт и синхронизирует их сама при обновлении конфигурации базы данных. Ручное изменение может нарушить работу механизмов прав доступа и подсистем, опирающихся на идентификаторы.
При обмене данными между базами с разными конфигурациями идентификаторы не переносятся «как есть» — в каждой базе они свои. Если в обмене участвуют ссылки на идентификаторы, сопоставление нужно строить по полному имени объекта, а не по GUID ссылки.
В расширениях конфигурации для добавленных расширением объектов используется отдельный справочник «Идентификаторы объектов расширений». Если ваш объект добавлен расширением, ищите его там — в основном справочнике его не будет.
FAQ
Чем идентификатор объекта метаданных отличается от GUID объекта данных?
Идентификатор объекта метаданных указывает на тип объекта конфигурации (например, справочник «Номенклатура» целиком), а GUID — на конкретный элемент данных (конкретную номенклатурную позицию). Это разные уровни: метаданные против данных.
Можно ли получить идентификатор по ссылке на элемент данных?
Да. Сначала получите метаданные ссылки: Ссылка.Метаданные(), затем передайте полное имя в функцию БСП или в запрос: ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Ссылка.Метаданные()).
Почему функция возвращает пустую ссылку?
Чаще всего объект с таким полным именем не существует (ошибка в имени) либо база ещё не прошла обновление конфигурации и служебный справочник не заполнен. Проверьте имя в конфигураторе и выполните обновление конфигурации базы данных.
Работает ли поиск идентификатора во внешнем соединении или через COM?
Да, если у вас есть доступ к запросам через внешнее соединение, запрос к справочнику выполняется так же. Функции БСП при этом вызывать сложнее, поэтому обычно используют прямой запрос по полному имени.
Нужно ли кэшировать идентификаторы?
Да, если обращения частые. В БСП кэширование уже встроено в функцию. В самописном коде сохраняйте полученные ссылки в соответствие на время работы процедуры, чтобы не выполнять запрос повторно.
Что важно запомнить
Идентификатор объекта метаданных — ссылка на служебный справочник, которую платформа ведёт автоматически. В типовых конфигурациях используйте ОбщегоНазначения.ИдентификаторОбъектаМетаданных(), в самописных — запрос по полному имени. Всегда проверяйте результат на пустоту и не изменяйте элементы справочника вручную.