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

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

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

Способы получить метаданные объекта в 1С: функция Метаданные(), метод ПолноеИмя(), работа в конфигураторе и через запросы. Примеры кода и типичные ошибки.

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

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

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

Что такое метаданные и где их посмотреть в конфигураторе

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

В конфигураторе метаданные видны в дереве конфигурации (меню «Конфигурация → Открыть конфигурацию»). Двойной клик по объекту или вызов палитры свойств (правый клик → «Свойства») показывает имя, синоним, длину кода, типы реквизитов и другие настройки. Это удобно для разового анализа, но не подходит для автоматизации.

Как получить метаданные конкретного объекта: метод Метаданные()

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

// Получаем метаданные по ссылке на документ

СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000001", ТекущаяДата());

МетаОбъект = СсылкаНаДокумент.Метаданные();

Сообщить(МетаОбъект.Имя); // "РеализацияТоваровУслуг"

Сообщить(МетаОбъект.Синоним); // "Реализация товаров и услуг"

Сообщить(МетаОбъект.ПолноеИмя()); // "Документ.РеализацияТоваровУслуг"

Метод ПолноеИмя() возвращает строку вида «ВидОбъекта.ИмяОбъекта» — именно в таком формате объекты адресуются в запросах и при программном создании. Обратное преобразование выполняется функцией Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг").

Как определить тип ссылки и вид объекта

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

Мета = Ссылка.Метаданные();

Если Метаданные.Документы.Содержит(Мета) Тогда

// Это документ

ИначеЕсли Метаданные.Справочники.Содержит(Мета) Тогда

// Это справочник

ИначеЕсли Метаданные.Перечисления.Содержит(Мета) Тогда

// Это перечисление

КонецЕсли;

Альтернативный способ — сравнение через ТипЗнч() и Тип(), но он требует перечисления конкретных типов и плохо масштабируется. Проверка через коллекции метаданных универсальна и не ломается при добавлении новых объектов в конфигурацию.

Как обойти все объекты конфигурации

Глобальное свойство Метаданные содержит коллекции всех видов объектов: Справочники, Документы, РегистрыСведений, РегистрыНакопления, ПланыСчетов и другие. Каждую коллекцию можно перебрать в цикле.

Для Каждого МетаДокумент Из Метаданные.Документы Цикл

Сообщить(МетаДокумент.ПолноеИмя() + " — реквизитов: "

+ МетаДокумент.Реквизиты.Количество());

КонецЦикла;

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

Порядок получения состава реквизитов объекта
  1. 1
    Получите объект метаданных: Ссылка.Метаданные() или Метаданные.НайтиПоПолномуИмени()
  2. 2
    Обратитесь к коллекции Реквизиты и переберите её в цикле
  3. 3
    Для каждого реквизита прочитайте Имя, Синоним и Тип
  4. 4
    Если нужны табличные части — переберите коллекцию ТабличныеЧасти, у каждой есть свои Реквизиты
  5. 5
    Проверьте результат выводом в сообщение или табличный документ

Как получить реквизиты, табличные части и движения

Состав объекта описывают вложенные коллекции метаданных. У справочников и документов это Реквизиты и ТабличныеЧасти, у регистров — Измерения, Ресурсы и Реквизиты. У каждого элемента коллекции доступны свойства Имя, Синоним, Тип (объект «ОписаниеТипов»).

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

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

Сообщить(Реквизит.Имя + " : " + Строка(Реквизит.Тип));

КонецЦикла;

Стандартные реквизиты (Код, Наименование, Номер, Дата, Ссылка) не входят в коллекцию Реквизиты — они доступны через СтандартныеРеквизиты. Это частая причина «пропавших» полей при универсальном переборе.

Для документов дополнительно доступна коллекция Движения — список регистров, по которым документ может проводиться. Это позволяет программно определить, какие наборы записей нужно читать или очищать.

Способы получения метаданных

Метод Ссылка.Метаданные()

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

Метаданные.НайтиПоТипу()

Работает по значению типа, безопасен для битых ссылок. Возвращает Неопределено, если тип не является ссылочным объектом.

Метаданные.НайтиПоПолномуИмени()

Удобен, когда имя объекта известно строкой, например из настроек или файла. Требует точного формата Вид.Имя.

Конфигуратор

Для разового ручного анализа структуры. Не подходит для автоматизации и работы в пользовательском режиме.

Права доступа и ограничения

Доступ к метаданным регулируется правами ролей. Если у пользователя нет права на объект, попытка получить его метаданные через НайтиПоПолномуИмени() вернёт Неопределено, а обращение к коллекциям может дать неполный результат. В привилегированном режиме (УстановитьПривилегированныйРежим(Истина)) метаданные доступны полностью.

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

Типичные ошибки при работе с метаданными

Большинство проблем связано с обращением к несуществующим коллекциям и непроверенными значениями. Например, у перечисления нет коллекции Реквизиты в том же смысле, что у справочника, а у регистра сведений нет табличных частей — обращение вызовет ошибку исполнения.

Типичные ошибки
01
Вызов Метаданные() у значения Неопределено или пустой составной ссылки — ошибка исполнения. Проверяйте значение перед вызовом.
02
Ожидание Кода и Наименования в коллекции Реквизиты — стандартные реквизиты лежат отдельно, в СтандартныеРеквизиты.
03
Обращение к Метаданные.Документы.ИмяДокумента без проверки существования — используйте НайтиПоПолномуИмени() и проверку на Неопределено.
04
Игнорирование прав: код, работающий у администратора, падает у рядового пользователя. Тестируйте под целевой ролью.

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

Контрольные точки

Как проверить результат

Полное имя объекта
Норма

Строка вида Документ.РеализацияТоваровУслуг совпадает с именем в конфигураторе

Тревожный признак

Пустая строка или Неопределено — объект не найден, проверьте имя и права

Количество реквизитов
Норма

Совпадает с числом реквизитов на вкладке Данные в конфигураторе

Тревожный признак

Меньше ожидаемого — возможно, вы смотрите только Реквизиты без СтандартныеРеквизиты

Тип реквизита
Норма

Строка(Реквизит.Тип) показывает ожидаемый тип, например СправочникСсылка.Номенклатура

Тревожный признак

Тип не определён — реквизит составной, переберите Тип.Типы()

FAQ

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

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

Можно ли получить метаданные внешней обработки или отчёта?

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

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

Получите метаданные через Метаданные.НайтиПоТипу(ТипЗначения): если функция вернула объект метаданных — тип ссылочный (справочник, документ и т.п.), если Неопределено — примитивный (число, строка, дата) или составной.

Почему НайтиПоПолномуИмени возвращает Неопределено, хотя объект есть в конфигураторе?

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

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

Переберите коллекцию Метаданные.Документы.ИмяДокумента.ТабличныеЧасти. У каждого элемента есть свойства Имя и Синоним, а вложенная коллекция Реквизиты содержит описание колонок табличной части. Стандартные колонки (НомерСтроки) в неё не входят.

Работает ли получение метаданных на тонком клиенте и в веб-клиенте?

Да, объектная модель метаданных доступна на клиенте, но с ограничениями: часть серверных свойств недоступна, а обход больших коллекций на клиенте медленнее. Для массовых операций с метаданными выполняйте код в серверной процедуре.

Итог

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

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