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

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

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

Как в 1С получить имя объекта метаданных: методы НайтиПоТипу, НайтиПоПолномуИмени, свойство Имя, работа со ссылками и табличными частями. Примеры кода и типичные ошибки.

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

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

Ниже разобраны основные приёмы: от простого обращения к свойству Имя до обратного поиска объекта метаданных по ссылке и по типу, а также ограничения каждого подхода и типичные ошибки.

Что такое объект метаданных и его имя в 1С

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

Важно не путать имя с другими свойствами. Синоним — представление для пользователя, может меняться и локализоваться. ПолноеИмя — строка вида «Справочник.Номенклатура», включающая вид метаданных. Имя же — это только «Номенклатура», без указания вида.

Имя используется при обращении через менеджеры объектов: Справочники["Номенклатура"], Документы["РеализацияТоваровУслуг"]. Поэтому корректное получение имени — основа любого универсального кода, который не знает заранее, с каким объектом работает.

Базовый способ: свойство Имя объекта метаданных

Если вы знаете конкретный объект конфигурации, имя получается прямым обращением через коллекцию Метаданные. Это самый простой сценарий, он работает как на сервере, так и на клиенте (в толстом клиенте и в управляемом приложении с учётом доступности контекста).

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

// Результат: "Номенклатура"

ИмяДокумента = Метаданные.Документы.РеализацияТоваровУслуг.Имя;

// Результат: "РеализацияТоваровУслуг"

ПолноеИмя = Метаданные.Документы.РеализацияТоваровУслуг.ПолноеИмя();

// Результат: "Документ.РеализацияТоваровУслуг"

Обратите внимание на различие синтаксиса: Имя — это свойство, а ПолноеИмя() — метод, его нужно вызывать со скобками. Обращение Метаданные.Документы.РеализацияТоваровУслуг.ПолноеИмя без скобок вернёт ошибку или не то, что ожидалось.

Если имя объекта заранее неизвестно и хранится в переменной, используйте обращение по индексу-строке: Метаданные.Справочники["Номенклатура"].Имя. Это удобно в циклах и универсальных обработках.

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

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

Функция ИмяМетаданныхПоСсылке(Ссылка)

Возврат Ссылка.Метаданные().Имя;

КонецФункции

// Пример вызова:

Имя = ИмяМетаданныхПоСсылке(ДокументСсылка);

// Для ссылки на документ реализации вернёт "РеализацияТоваровУслуг"

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

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

Получение имени по ссылке
  1. 1
    Убедитесь, что переменная содержит ссылку или объект базы данных, а не примитивный тип
  2. 2
    Вызовите у значения метод Метаданные() — получите объект описания метаданного
  3. 3
    Прочитайте свойство Имя или вызовите метод ПолноеИмя() в зависимости от задачи
  4. 4
    Проверьте результат в отладчике или через Сообщить()

Поиск объекта метаданных по типу: НайтиПоТипу

Когда есть не ссылка, а значение типа (например, из ТипЗнч() или из описания типов реквизита), применяется метод Метаданные.НайтиПоТипу(). Он возвращает объект описания метаданного, соответствующий переданному типу, либо Неопределено, если тип не связан с объектом метаданных.

ТипЗначения = ТипЗнч(СсылкаНаОбъект);

ОбъектМД = Метаданные.НайтиПоТипу(ТипЗначения);

Если ОбъектМД <> Неопределено Тогда

ИмяОбъекта = ОбъектМД.Имя;

ПолноеИмя = ОбъектМД.ПолноеИмя();

Иначе

// Тип примитивный или не связан с метаданными

КонецЕсли;

Обязательно проверяйте результат на Неопределено. Для типов «Строка», «Число», «Дата», «Булево» и для типов вроде «ХранилищеЗначения» метод вернёт Неопределено, и обращение к свойству Имя вызовет ошибку выполнения.

Метод НайтиПоТипу особенно полезен при разборе составных типов: например, когда реквизит может хранить ссылки на разные справочники, и нужно определить, к какому именно относится конкретное значение.

Обратная задача: найти метаданные по полному имени

Часто имя объекта приходит извне — из настроек, файла обмена, параметра отчёта. Для обратного перехода от строки к объекту метаданных служит метод Метаданные.НайтиПоПолномуИмени().

ОбъектМД = Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура");

Если ОбъектМД <> Неопределено Тогда

Имя = ОбъектМД.Имя; // "Номенклатура"

КонецЕсли;

Метод чувствителен к формату строки: полное имя должно точно соответствовать структуре «ВидМетаданных.ИмяОбъекта», включая регистр букв вида («Справочник», «Документ», «РегистрСведений»). Для вложенных объектов, например табличных частей, используется расширенный формат: «Справочник.Номенклатура.ТабличнаяЧасть.ДополнительныеРеквизиты».

Если строка приходит из пользовательского ввода или внешнего источника, всегда обрабатывайте случай Неопределено — это защитит код от опечаток и от ссылок на объекты, удалённые из конфигурации при обновлении.

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

В универсальных механизмах — обработках выгрузки, сравнения конфигураций, построителях списков — требуется пройти по всем объектам определённого вида и собрать их имена. Для этого коллекции метаданных поддерживают обход в цикле.

Для Каждого ОбъектМД Из Метаданные.Справочники Цикл

Сообщить(ОбъектМД.Имя + " | " + ОбъектМД.ПолноеИмя());

КонецЦикла;

Аналогично перебираются Метаданные.Документы, Метаданные.РегистрыНакопления, Метаданные.Перечисления и другие коллекции. Уровнем выше доступен перебор самих видов через Метаданные напрямую, если нужна полная карта конфигурации.

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

Имена реквизитов, табличных частей и подчинённых объектов

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

ОбъектМД = Метаданные.Справочники.Номенклатура;

Для Каждого Реквизит Из ОбъектМД.Реквизиты Цикл

Сообщить(Реквизит.Имя);

КонецЦикла;

Для Каждого ТЧ Из ОбъектМД.ТабличныеЧасти Цикл

Сообщить(ТЧ.Имя);

КонецЦикла;

Стандартные реквизиты (Ссылка, Код, Наименование, Дата, Номер) доступны через коллекцию СтандартныеРеквизиты. Их имена предопределены платформой и не задаются разработчиком, но читаются тем же способом.

Для перечислений похожим образом получают имена значений: Метаданные.Перечисления.СтавкиНДС.ЗначенияПеречисления — каждый элемент коллекции имеет свойство Имя, которое используется в коде вида Перечисления.СтавкиНДС["НДС20"].

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

Ограничения и нюансы в разных режимах работы

Доступ к метаданным различается в зависимости от контекста исполнения. В тонком клиенте и веб-клиенте объект Метаданные недоступен — весь код, работающий с метаданными, должен выполняться на сервере. Это частая причина ошибок при переносе кода из толстого клиента в управляемые формы.

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

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

Практический пример: универсальная функция

Соберём рассмотренные приёмы в одну функцию, которая безопасно возвращает полное имя метаданных для любого переданного значения — ссылки или типа.

Функция ПолноеИмяМетаданных(Знач Значение) Экспорт

Если Не ЗначениеЗаполнено(Значение) Тогда

Возврат "";

КонецЕсли;

ОбъектМД = Метаданные.НайтиПоТипу(ТипЗнч(Значение));

Если ОбъектМД = Неопределено Тогда

Возврат "";

КонецЕсли;

Возврат ОбъектМД.ПолноеИмя();

КонецФункции;

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

Если нужно именно короткое имя, замените ПолноеИмя() на свойство Имя, а для определения вида метаданных можно дополнительно вернуть родителя объекта описания или разобрать полное имя по точке.

Итог

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

Имя объекта метаданных читается через свойство Имя объекта описания метаданного. От ссылки переходят через Ссылка.Метаданные(), от типа — через Метаданные.НайтиПоТипу(), от строки — через НайтиПоПолномуИмени(). Всегда проверяйте результат на Неопределено и помните, что в тонком клиенте объект Метаданные недоступен.

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

Чем отличается Имя от Синонима у объекта метаданных?

Имя — это уникальный идентификатор объекта, заданный разработчиком в конфигураторе; по нему выполняются программные обращения вида Справочники["Номенклатура"]. Синоним — пользовательское представление, которое выводится в интерфейсе и может быть изменено или локализовано. Для программной логики всегда используйте Имя или ПолноеИмя().

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

Если строка имеет вид «СправочникСсылка.Номенклатура», сначала получите тип функцией Тип("СправочникСсылка.Номенклатура"), затем передайте его в Метаданные.НайтиПоТипу(). Если строка имеет формат «Справочник.Номенклатура», используйте напрямую Метаданные.НайтиПоПолномуИмени(). В обоих случаях проверяйте результат на Неопределено.

Почему НайтиПоТипу возвращает Неопределено?

Метод возвращает Неопределено, если переданный тип не связан с объектом метаданных: это примитивные типы (Строка, Число, Дата, Булево), а также служебные типы вроде ХранилищеЗначения или УникальныйИдентификатор. Перед обращением к свойствам результата всегда делайте проверку на Неопределено.

Можно ли получить имя метаданных в тонком клиенте?

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

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

Через объект описания метаданного документа: Метаданные.Документы.РеализацияТоваровУслуг.ТабличныеЧасти — это коллекция, у каждого элемента которой есть свойство Имя. Полное имя табличной части имеет вид «Документ.РеализацияТоваровУслуг.ТабличнаяЧасть.Товары», и по нему её можно найти через НайтиПоПолномуИмени.

Как узнать, к какому виду метаданных относится ссылка?

Вызовите Ссылка.Метаданные().ПолноеИмя() и разберите строку до первой точки — это и будет вид («Справочник», «Документ», «РегистрСведений» и т.д.). Альтернатива — проверки через Метаданные.Справочники.Содержит(ОбъектМД) и аналогичные методы других коллекций, если нужна строгая типизация без разбора строк.