Разбор метаданных объектов 1С: конфигуратор и код

· 8 мин

Содержание

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

Разница в задаче. Если нужно один раз глянуть, как называется реквизит и какой у него тип, — хватит конфигуратора. Если нужно в коде обойти все реквизиты, собрать их синонимы или типы данных — работаем через встроенный язык. Ниже разберём оба подхода на справочнике Номенклатура и документе РеализацияТоваровУслуг — объекты есть почти в каждой конфигурации на платформе 8.3.

Дерево конфигурации и палитра свойств

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

Выделите объект и нажмите F4 или в контекстном меню выберите Свойства. Откроется палитра свойств — главный источник метаданных для глаз:

  • 📛 Имя — внутренний идентификатор, им объект называется в коде (Номенклатура).
  • 🏷️ Синоним — то, как объект виден пользователю в интерфейсе (Номенклатура, Товары и услуги).
  • 💬 Комментарий — служебная заметка разработчика, в интерфейс не попадает.

Под объектом в дереве лежат его подчинённые ветки: Реквизиты, ТабличныеЧасти, Формы, Макеты, Команды. Разверните Реквизиты — каждый реквизит тоже имеет свою палитру свойств с именем, синонимом и, главное, полем Тип. Клик по реквизиту → F4 покажет, ссылка это на другой объект, строка, число или составной тип.

Чтобы быстро найти объект в большой конфигурации, нажмите Ctrl+Alt+F (поиск по дереву) или начните печатать имя при активном дереве — курсор перескочит на совпадение.

Палитра свойств удобна для разового просмотра. Но она не даёт выгрузить список реквизитов в текст или обойти их циклом — для этого нужен встроенный язык.

Глобальный объект «Метаданные» во встроенном языке

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

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

Сообщить(ОбъектМД.Имя);         // Номенклатура
Сообщить(ОбъектМД.Синоним);     // Номенклатура (как в интерфейсе)
Сообщить(ОбъектМД.ПолноеИмя()); // Справочник.Номенклатура

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

МД = Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг");
Если МД <> Неопределено Тогда
    Сообщить(МД.Синоним);
КонецЕсли;

Метод возвращает Неопределено, если объекта с таким именем нет — проверку на Неопределено оставляйте всегда, иначе обращение к .Синоним вызовет ошибку.

Коллекции внутри Метаданные обходятся циклом Для Каждого. Так собирают, например, список всех документов конфигурации:

Для Каждого Документ Из Метаданные.Документы Цикл
    Сообщить(Документ.Имя + " — " + Документ.Синоним);
КонецЦикла;

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

Как достать метаданные от конкретной ссылки или объекта

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

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

Сообщить(МД.Имя);         // Номенклатура
Сообщить(МД.ПолноеИмя()); // Справочник.Номенклатура

Метод Метаданные() есть у ссылок, у объектов (СправочникОбъект, ДокументОбъект), у наборов записей регистров. Это удобно в универсальном коде, который не знает заранее, с каким типом работает.

Чтобы отличать тип значения без метаданных, применяют функцию ТипЗнч:

Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
    // это ссылка на номенклатуру
КонецЕсли;

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

Реквизиты, табличные части и их синонимы

Состав полей объекта — это две коллекции: Реквизиты (реквизиты шапки) и ТабличныеЧасти. Обойти реквизиты и вытащить их синонимы — одна из самых частых задач:

Для Каждого Реквизит Из Метаданные.Справочники.Номенклатура.Реквизиты Цикл
    Сообщить(Реквизит.Имя + " → " + Реквизит.Синоним);
КонецЦикла;

У каждого реквизита есть свойство Тип — это объект ОписаниеТипов. Через него узнают, какие типы допускает поле (поле может быть составным):

Реквизит = Метаданные.Справочники.Номенклатура.Реквизиты.Артикул;
Для Каждого Тип Из Реквизит.Тип.Типы() Цикл
    Сообщить(Строка(Тип));
КонецЦикла;

Табличные части лежат отдельно, и у каждой — своя коллекция Реквизиты. Поэтому обход идёт в два уровня:

Для Каждого ТЧ Из Метаданные.Документы.РеализацияТоваровУслуг.ТабличныеЧасти Цикл
    Сообщить("Таблица: " + ТЧ.Имя);
    Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
        Сообщить("   " + Реквизит.Имя + " (" + Реквизит.Синоним + ")");
    КонецЦикла;
КонецЦикла;

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

У регистров состав полей делится иначе: вместо одной коллекции Реквизиты там Измерения, Ресурсы и Реквизиты по отдельности. Разрезы учёта хранятся в Измерения, числовые итоги — в Ресурсы:

РегМД = Метаданные.РегистрыНакопления.ТоварыНаСкладах;
Для Каждого Измерение Из РегМД.Измерения Цикл
    Сообщить("Измерение: " + Измерение.Имя);
КонецЦикла;
Для Каждого Ресурс Из РегМД.Ресурсы Цикл
    Сообщить("Ресурс: " + Ресурс.Имя);
КонецЦикла;

Поэтому универсальный код, который обходит «все поля» объекта, для регистра должен перебрать три коллекции, а не одну.

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

Стандартные (системные) реквизиты

Кроме реквизитов, которые разработчик добавил руками, у каждого объекта есть стандартные реквизиты — их создаёт платформа. В дереве конфигурации они лежат в ветке Стандартные реквизиты, а в коде — в коллекции СтандартныеРеквизиты:

Для Каждого СтандРеквизит Из Метаданные.Справочники.Номенклатура.СтандартныеРеквизиты Цикл
    Сообщить(СтандРеквизит.Имя + " — " + СтандРеквизит.Синоним);
КонецЦикла;

Набор стандартных реквизитов зависит от вида объекта:

  • 📁 Справочник: Ссылка, Код, Наименование, ПометкаУдаления, Предопределённый, а для подчинённых — Владелец, для иерархических — Родитель и ЭтоГруппа.
  • 📄 Документ: Ссылка, Номер, Дата, Проведён, ПометкаУдаления.
  • 📊 Регистр накопления: Регистратор, Период, Активность, НомерСтроки, ВидДвижения.

Эти поля не отображаются среди обычных реквизитов, но доступны и в запросах, и через точку у ссылки (Ссылка.Код, Ссылка.ПометкаУдаления). Если вы обошли коллекцию Реквизиты и не нашли Код или Наименование — ищите их именно в СтандартныеРеквизиты, это частая причина «пропавшего» поля.

В запросе системные поля доступны напрямую: ВЫБРАТЬ Код, Наименование ИЗ Справочник.Номенклатура. Отдельно объявлять их не нужно — платформа знает о них из метаданных.

Формы, макеты и команды объекта

У объекта метаданных есть ещё три коллекции, которые часто нужны при разборе: Формы, Макеты и Команды.

Для Каждого Форма Из Метаданные.Справочники.Номенклатура.Формы Цикл
    Сообщить(Форма.Имя + " — " + Форма.Синоним);
КонецЦикла;

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

Командный интерфейс объекта описывают коллекция Команды (команды самого объекта) и настройки подсистем. В дереве конфигуратора командный интерфейс подсистемы правят через контекстное меню подсистемы → Открыть командный интерфейс. Программно состав команд объекта обходится так же циклом по Метаданные.Справочники.Номенклатура.Команды.

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

Отчёт по конфигурации и внешние инструменты

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

Для разбора метаданных «на лету», уже в режиме 1С:Предприятие, применяют внешние обработки-инспекторы (в сообществе их обобщённо называют инструментами разработчика). Такая обработка открывает любой объект, показывает его реквизиты, значения и метаданные без захода в конфигуратор — удобно, когда доступа к конфигуратору нет, а структуру посмотреть надо.

Внешние обработки запускайте только из проверенных источников и в тестовой базе. Обработка выполняет произвольный код с правами запустившего пользователя — на рабочей базе это риск.

Выбор инструмента под задачу:

  • 🔍 Разово глянуть реквизит и тип — палитра свойств в конфигураторе (F4).
  • 📋 Полная структура в текст — Конфигурация → Отчёт по конфигурации.
  • ⚙️ Обойти поля в коде, собрать синонимы/типы — глобальный объект Метаданные.
  • 🔧 Посмотреть объект в работающей базе — внешняя обработка-инспектор.
Проверьте себя
Что вернёт `Метаданные.Справочники.Номенклатура.ПолноеИмя()`?
Где искать стандартный реквизит `Код`, если его нет в коллекции `Реквизиты`?
Что вернёт `НайтиПоПолномуИмени`, если объекта с таким именем нет?

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

Чем отличается `Метаданные` от `Метаданные()`?
Метаданные — глобальное свойство, корень дерева всей конфигурации, от него идут к объекту по имени. Метаданные() — метод конкретного значения (ссылки, объекта), он возвращает описание метаданных именно этого значения. Первое — «по имени сверху», второе — «от значения, которое уже есть».
Как получить синоним реквизита, а не его имя?
Через свойство Синоним у элемента коллекции Реквизиты: Метаданные.Справочники.Номенклатура.Реквизиты.Артикул.Синоним. Имя — для кода, Синоним — подпись для пользователя.
Почему у объекта нет реквизита `Код` или `Дата` в коллекции `Реквизиты`?
Потому что это стандартные реквизиты — их создаёт платформа, и лежат они в отдельной коллекции СтандартныеРеквизиты, а не в Реквизиты. В запросах и через точку они при этом доступны напрямую.
Можно ли узнать типы, которые допускает поле?
Да. У реквизита есть свойство Тип типа ОписаниеТипов, а у него метод Типы() — он возвращает массив всех допустимых типов. Для составного реквизита типов будет несколько.
Как получить метаданные формы и её элементы?
Коллекция Формы объекта даёт имена и синонимы форм. Состав элементов (поля, кнопки) доступен уже в открытой форме через ЭтаФорма.Элементы в модуле формы — в метаданных объекта плоского списка элементов нет.