Работа во встроенном языке с объектами метаданных

Во встроенном языке "1С:Предприятия" предоставляется доступ к структуре метаданных конфигурации. Эта возможность предназначена в основном для создания универсальных алгоритмов, которые могли бы единообразно работать с различными объектами конфигурации. В этом разделе приводится информация об особенностях работы с метаданными во встроенном языке.

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

В документации по встроенному языку не приводится перечень свойств объектов метаданных и коллекций подчиненных объектов. Для ознакомления со структурой объектов и составом свойств необходимо использовать отчет по конфигурации (в режиме Конфигуратор меню Конфигурация – Отчет по конфигурации). Имена, отображаемые в этом отчете, соответствуют именам свойств и коллекций подчиненных объектов.
Структура метаданных в отчете и в программной модели не содержит ветки "Общие". Эта ветка используется только в дереве метаданных для удобства редактирования. В отчете по конфигурации и в программной модели все объекты, входящие в ветку "Общие", подчинены непосредственно корневому объекту.

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

Копировать в буфер обмена
Сообщить(Метаданные.Документы.Счет.Реквизиты.Контрагент);

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

Копировать в буфер обмена
Док = Документы.Счет.СоздатьДокумент();
Сообщить(Док.Метаданные().ПолноеИмя());

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

Копировать в буфер обмена
Выборка = Документы.Счет.Выбрать();
Сообщить(Метаданные.НайтиПоТипу(ТипЗнч(Выборка)));

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

Копировать в буфер обмена
Сообщить(Метаданные.ОсновнаяФормаКонстант = Метаданные.ОбщиеФормы.Основная);

С помощью метода Родитель() можно получить вышестоящий объект метаданных.
Например:

Копировать в буфер обмена
Сообщить(Метаданные.Документы.Счет.Реквизиты.Контрагент.Родитель());

Для представления объекта метаданных пользователю нужно использовать преобразование значения к строке или метод  Представление().
Например:

Копировать в буфер обмена
Сообщить(Метаданные.Справочники.РасчетныеСчета);
Сообщить(Метаданные.Справочники.РасчетныеСчета.Представление());

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

Копировать в буфер обмена
Сообщить(Метаданные.ОбщиеФормы.Основная.ПолноеИмя());

Для поиска объекта метаданных, соответствующего значению перечисления, можно использовать методику, описанную в разделе "Как получить имя значения перечисления, заданное в метаданных?".

Метаданные можно использовать, чтобы проверить, относится ли, например, значение к справочникам. Методика такой проверки описана в разделе "Как проверить, что тип значения относится к справочникам, документам и т. д.?".

Некоторые свойства объектов метаданных имеют перечислимый тип. Это специальные перечисления. Доступ к ним в языке выполняется через коллекцию СвойстваОбъектов, предоставляемую корневым объектом метаданных. Состав этих перечислений описан в документации, в разделе, описывающем работу с объектами метаданных.
Например:

Копировать в буфер обмена
Сообщить(Метаданные.Документы.Счет.ПериодичностьНомера = 
Метаданные.СвойстваОбъектов.ПериодичностьНомераДокумента.Год);

Некоторые свойства объектов метаданных являются коллекциями значений и представляются типом КоллекцияЗначенийСвойстваОбъектаМетаданных.
Например:

Копировать в буфер обмена
Сообщить(Метаданные.Документы.Счет.ВводитсяНаОсновании.Количество());
Сообщить(Метаданные.Документы.Счет.ВводитсяНаОсновании.Содержит(Метаданные.Справочники.Контрагенты));

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

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

Для получения форм и макетов используются специализированные методы.

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

Копировать в буфер обмена
Стиль = БиблиотекаСтилей.СтильФормКомпании;
ЭлементыФормы.Кнопка1.ЦветТекстаКнопки = ЦветаСтиля.ЦветПредупреждения;
ЭлементыФормы.Кнопка1.Картинка = БиблиотекаКартинок.Автозаполнение;

Для проверки прав текущего пользователя используются специализированные методы глобального контекста ПравоДоступа() и ПараметрыДоступа().