Разбор метаданных объектов 1С: конфигуратор и код
Содержание
Метаданные объекта смотрят двумя путями. Визуально — в дереве конфигурации и палитре свойств конфигуратора (Конфигурация → Открыть конфигурацию, по объекту клавиша F4). Программно — через глобальное свойство Метаданные, а для конкретной ссылки или объекта через метод Метаданные(). Оба способа дают одно и то же: имя, синоним, состав реквизитов и табличных частей, типы полей, формы и команды.
Разница в задаче. Если нужно один раз глянуть, как называется реквизит и какой у него тип, — хватит конфигуратора. Если нужно в коде обойти все реквизиты, собрать их синонимы или типы данных — работаем через встроенный язык. Ниже разберём оба подхода на справочнике Номенклатура и документе РеализацияТоваровУслуг — объекты есть почти в каждой конфигурации на платформе 8.3.
Дерево конфигурации и палитра свойств
Откройте конфигуратор, затем Конфигурация → Открыть конфигурацию. Слева появится дерево: ветки Справочники, Документы, РегистрыСведений, РегистрыНакопления и так далее. Разверните нужную ветку и найдите объект.
Выделите объект и нажмите F4 или в контекстном меню выберите Свойства. Откроется палитра свойств — главный источник метаданных для глаз:
- 📛 Имя — внутренний идентификатор, им объект называется в коде (
Номенклатура). - 🏷️ Синоним — то, как объект виден пользователю в интерфейсе (
Номенклатура,Товары и услуги). - 💬 Комментарий — служебная заметка разработчика, в интерфейс не попадает.
Под объектом в дереве лежат его подчинённые ветки: Реквизиты, ТабличныеЧасти, Формы, Макеты, Команды. Разверните Реквизиты — каждый реквизит тоже имеет свою палитру свойств с именем, синонимом и, главное, полем Тип. Клик по реквизиту → F4 покажет, ссылка это на другой объект, строка, число или составной тип.
Чтобы быстро найти объект в большой конфигурации, нажмите Ctrl+Alt+F (поиск по дереву) или начните печатать имя при активном дереве — курсор перескочит на совпадение.
Палитра свойств удобна для разового просмотра. Но она не даёт выгрузить список реквизитов в текст или обойти их циклом — для этого нужен встроенный язык.
Глобальный объект «Метаданные» во встроенном языке
В любом программном модуле доступно глобальное свойство Метаданные — это корень дерева метаданных всей конфигурации. От него спускаются к нужному объекту через точку, повторяя структуру дерева конфигуратора:
ОбъектМД = Метаданные.Справочники.Номенклатура;
Сообщить(ОбъектМД.Имя); // Номенклатура
Сообщить(ОбъектМД.Синоним); // Номенклатура (как в интерфейсе)
Сообщить(ОбъектМД.ПолноеИмя()); // Справочник.Номенклатура
Имя и Синоним — это свойства, а ПолноеИмя() — метод, он возвращает строку вида Справочник.Номенклатура. Эта строка — ключ к обратному поиску. Если у вас есть полное имя в переменной (например, пришло из настройки), объект метаданных достаётся методом НайтиПоПолномуИмени:
МД = Метаданные.НайтиПоПолномуИмени("Документ.РеализацияТоваровУслуг");
Если МД <> Неопределено Тогда
Сообщить(МД.Синоним);
КонецЕсли;
Метод возвращает Неопределено, если объекта с таким именем нет — проверку на Неопределено оставляйте всегда, иначе обращение к .Синоним вызовет ошибку.
Коллекции внутри Метаданные обходятся циклом Для Каждого. Так собирают, например, список всех документов конфигурации:
Для Каждого Документ Из Метаданные.Документы Цикл
Сообщить(Документ.Имя + " — " + Документ.Синоним);
КонецЦикла;
Тот же приём работает для справочников, регистров, планов видов характеристик и прочих веток. По сути вы ходите по тому же дереву, что видно в конфигураторе, только программно.
Как достать метаданные от конкретной ссылки или объекта
Часто объект метаданных нужен не «вообще по имени», а от значения, которое уже лежит в переменной — ссылки на элемент, объекта документа, значения реквизита. Для этого есть метод Метаданные():
Ссылка = Справочники.Номенклатура.НайтиПоКоду("000000123");
МД = Ссылка.Метаданные();
Сообщить(МД.Имя); // Номенклатура
Сообщить(МД.ПолноеИмя()); // Справочник.Номенклатура
Метод Метаданные() есть у ссылок, у объектов (СправочникОбъект, ДокументОбъект), у наборов записей регистров. Это удобно в универсальном коде, который не знает заранее, с каким типом работает.
Чтобы отличать тип значения без метаданных, применяют функцию ТипЗнч:
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
// это ссылка на номенклатуру
КонецЕсли;
Не путайте: ТипЗнч() возвращает тип значения (ссылка, число, строка), а Метаданные() — описание объекта метаданных. У простых типов (число, строка, дата) метода Метаданные() нет — вызов на них даст ошибку.
Реквизиты, табличные части и их синонимы
Состав полей объекта — это две коллекции: Реквизиты (реквизиты шапки) и ТабличныеЧасти. Обойти реквизиты и вытащить их синонимы — одна из самых частых задач:
Для Каждого Реквизит Из Метаданные.Справочники.Номенклатура.Реквизиты Цикл
Сообщить(Реквизит.Имя + " → " + Реквизит.Синоним);
КонецЦикла;
У каждого реквизита есть свойство Тип — это объект ОписаниеТипов. Через него узнают, какие типы допускает поле (поле может быть составным):
Реквизит = Метаданные.Справочники.Номенклатура.Реквизиты.Артикул;
Для Каждого Тип Из Реквизит.Тип.Типы() Цикл
Сообщить(Строка(Тип));
КонецЦикла;
Табличные части лежат отдельно, и у каждой — своя коллекция Реквизиты. Поэтому обход идёт в два уровня:
Для Каждого ТЧ Из Метаданные.Документы.РеализацияТоваровУслуг.ТабличныеЧасти Цикл
Сообщить("Таблица: " + ТЧ.Имя);
Для Каждого Реквизит Из ТЧ.Реквизиты Цикл
Сообщить(" " + Реквизит.Имя + " (" + Реквизит.Синоним + ")");
КонецЦикла;
КонецЦикла;
Синоним реквизита — именно то, что видит пользователь в колонке списка или в поле формы. Если в коде нужно построить таблицу значений с «человеческими» заголовками колонок, берут Реквизит.Синоним, а не Реквизит.Имя.
У регистров состав полей делится иначе: вместо одной коллекции Реквизиты там Измерения, Ресурсы и Реквизиты по отдельности. Разрезы учёта хранятся в Измерения, числовые итоги — в Ресурсы:
РегМД = Метаданные.РегистрыНакопления.ТоварыНаСкладах;
Для Каждого Измерение Из РегМД.Измерения Цикл
Сообщить("Измерение: " + Измерение.Имя);
КонецЦикла;
Для Каждого Ресурс Из РегМД.Ресурсы Цикл
Сообщить("Ресурс: " + Ресурс.Имя);
КонецЦикла;
Поэтому универсальный код, который обходит «все поля» объекта, для регистра должен перебрать три коллекции, а не одну.
| Что нужно | Свойство | Пример значения |
|---|---|---|
| Идентификатор для кода | Имя | ЦенаВключаетНДС |
| Подпись для пользователя | Синоним | Цена включает НДС |
| Допустимые типы поля | Тип.Типы() | Булево |
| Полное имя объекта | ПолноеИмя() | Документ.РеализацияТоваровУслуг |
Стандартные (системные) реквизиты
Кроме реквизитов, которые разработчик добавил руками, у каждого объекта есть стандартные реквизиты — их создаёт платформа. В дереве конфигурации они лежат в ветке Стандартные реквизиты, а в коде — в коллекции СтандартныеРеквизиты:
Для Каждого СтандРеквизит Из Метаданные.Справочники.Номенклатура.СтандартныеРеквизиты Цикл
Сообщить(СтандРеквизит.Имя + " — " + СтандРеквизит.Синоним);
КонецЦикла;
Набор стандартных реквизитов зависит от вида объекта:
- 📁 Справочник:
Ссылка,Код,Наименование,ПометкаУдаления,Предопределённый, а для подчинённых —Владелец, для иерархических —РодительиЭтоГруппа. - 📄 Документ:
Ссылка,Номер,Дата,Проведён,ПометкаУдаления. - 📊 Регистр накопления:
Регистратор,Период,Активность,НомерСтроки,ВидДвижения.
Эти поля не отображаются среди обычных реквизитов, но доступны и в запросах, и через точку у ссылки (Ссылка.Код, Ссылка.ПометкаУдаления). Если вы обошли коллекцию Реквизиты и не нашли Код или Наименование — ищите их именно в СтандартныеРеквизиты, это частая причина «пропавшего» поля.
В запросе системные поля доступны напрямую: ВЫБРАТЬ Код, Наименование ИЗ Справочник.Номенклатура. Отдельно объявлять их не нужно — платформа знает о них из метаданных.
Формы, макеты и команды объекта
У объекта метаданных есть ещё три коллекции, которые часто нужны при разборе: Формы, Макеты и Команды.
Для Каждого Форма Из Метаданные.Справочники.Номенклатура.Формы Цикл
Сообщить(Форма.Имя + " — " + Форма.Синоним);
КонецЦикла;
Коллекция Формы даёт только имена и синонимы форм. Состав элементов конкретной формы (поля, кнопки, группы) в метаданных объекта не лежит плоским списком — элементы доступны уже в контексте открытой формы, через ЭтаФорма.Элементы в модуле формы. Там у каждого элемента есть Имя, Вид, привязка к данным.
Командный интерфейс объекта описывают коллекция Команды (команды самого объекта) и настройки подсистем. В дереве конфигуратора командный интерфейс подсистемы правят через контекстное меню подсистемы → Открыть командный интерфейс. Программно состав команд объекта обходится так же циклом по Метаданные.Справочники.Номенклатура.Команды.
Макеты (Макеты) — это печатные формы, схемы компоновки, табличные документы. По коллекции узнают имена макетов, а сам макет получают методом объекта менеджера ПолучитьМакет("ИмяМакета").
Отчёт по конфигурации и внешние инструменты
Когда нужен не фрагмент, а полная выгрузка структуры, в конфигураторе есть встроенный отчёт: меню Конфигурация → Отчёт по конфигурации. В диалоге отмечаете, какие объекты и какие их характеристики включить (реквизиты, формы, права, модули), и получаете табличный документ со всей структурой — его можно сохранить и искать по тексту.
Для разбора метаданных «на лету», уже в режиме 1С:Предприятие, применяют внешние обработки-инспекторы (в сообществе их обобщённо называют инструментами разработчика). Такая обработка открывает любой объект, показывает его реквизиты, значения и метаданные без захода в конфигуратор — удобно, когда доступа к конфигуратору нет, а структуру посмотреть надо.
Внешние обработки запускайте только из проверенных источников и в тестовой базе. Обработка выполняет произвольный код с правами запустившего пользователя — на рабочей базе это риск.
Выбор инструмента под задачу:
- 🔍 Разово глянуть реквизит и тип — палитра свойств в конфигураторе (
F4). - 📋 Полная структура в текст —
Конфигурация → Отчёт по конфигурации. - ⚙️ Обойти поля в коде, собрать синонимы/типы — глобальный объект
Метаданные. - 🔧 Посмотреть объект в работающей базе — внешняя обработка-инспектор.
Частые вопросы
Чем отличается `Метаданные` от `Метаданные()`?
Метаданные — глобальное свойство, корень дерева всей конфигурации, от него идут к объекту по имени. Метаданные() — метод конкретного значения (ссылки, объекта), он возвращает описание метаданных именно этого значения. Первое — «по имени сверху», второе — «от значения, которое уже есть».Как получить синоним реквизита, а не его имя?
Синоним у элемента коллекции Реквизиты: Метаданные.Справочники.Номенклатура.Реквизиты.Артикул.Синоним. Имя — для кода, Синоним — подпись для пользователя.Почему у объекта нет реквизита `Код` или `Дата` в коллекции `Реквизиты`?
СтандартныеРеквизиты, а не в Реквизиты. В запросах и через точку они при этом доступны напрямую.Можно ли узнать типы, которые допускает поле?
Тип типа ОписаниеТипов, а у него метод Типы() — он возвращает массив всех допустимых типов. Для составного реквизита типов будет несколько.Как получить метаданные формы и её элементы?
Формы объекта даёт имена и синонимы форм. Состав элементов (поля, кнопки) доступен уже в открытой форме через ЭтаФорма.Элементы в модуле формы — в метаданных объекта плоского списка элементов нет.