В процессе разработки сложных универсальных обработок, систем миграции данных или инструментов для анализа конфигурации программисты часто сталкиваются с необходимостью получить полный список свойств объекта метаданных. Если с коллекциями, такими как Реквизиты, ТабличныеЧасти или Формы, всё достаточно просто (они представляют собой итерируемые коллекции, которые можно обойти циклом Для каждого), то с одиночными свойствами, вроде ДлинаКода, Иерархический или СпособРедактирования, возникают сложности. Платформа 1С не предоставляет встроенного метода Свойства() для объектов метаданных.
В этой статье мы подробно разберем, какими способами можно обойти это ограничение и программно извлечь значения всех свойств любого объекта метаданных. При необходимости быстро получить текстовое описание элементов объекта можно использовать обработку для анализа и выгрузки структуры метаданных.
Проанализируем структуру метаданных. Когда мы обращаемся к Метаданные.Справочники.Номенклатура, мы получаем объект типа ОбъектМетаданных: Справочник. У этого объекта есть два типа атрибутов:
Метаданные.Справочники.Номенклатура.ДлинаКода.Чтобы получить список всех таких «точечных» свойств без ручного написания имён, нам придется использовать обходные пути.
Рассмотрим наиболее универсальный и технологичный способ — использование XDTO (XML Data Transfer Objects). Платформа 1С позволяет сериализовать описание метаданных. Это открывает нам доступ к структуре объекта как к данным, которые можно перебрать программно.
Выполним следующие шаги для получения свойств через XDTO:
// Получим объект метаданных, свойства которого нужно изучить
ОбъектМетаданных = Метаданные.Справочники.Номенклатура;
// Используем СериализаторXDTO для преобразования метаданных в объект XDTO
Попытка
ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектМетаданных);
// Теперь мы можем обратиться к типу объекта XDTO, который содержит описание всех свойств
ТипXDTO = ОбъектXDTO.Тип();
// Перебираем все свойства, описанные в типе XDTO
Для каждого СвойствоXDTO Из ТипXDTO.Свойства Цикл
ИмяСвойства = СвойствоXDTO.Имя;
// Попытаемся получить значение этого свойства из объекта метаданных
Попытка
ЗначениеСвойства = ОбъектМетаданных[ИмяСвойства];
Сообщить(ИмяСвойства + ": " + ЗначениеСвойства);
Исключение
// Некоторые свойства могут быть коллекциями или недоступны напрямую
Сообщить("Свойство " + ИмяСвойства + " является коллекцией или недоступно.");
КонецПопытки;
КонецЦикла;
Исключение
Сообщить("Не удалось сериализовать объект метаданных в XDTO");
КонецПопытки;
Этот метод хорош тем, что он автоматически подстраивается под версию платформы. Если в новой версии 1С у справочников появится новое свойство, оно автоматически попадет в схему XDTO и будет обработано вашим кодом.
Разберем еще один надежный метод, основанный на чтении XML. Любой объект метаданных можно выгрузить в XML-строку. Имена тегов в полученном файле и будут именами свойств.
Проанализируем ситуацию на примере кода:
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
// Записываем метаданные справочника в формат XML
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Метаданные.Справочники.Номенклатура);
XMLТекст = ЗаписьXML.Закрыть();
// Теперь используем ЧтениеXML для перебора узлов
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLТекст);
Пока ЧтениеXML.Прочитать() Цикл
// Нас интересуют только узлы-элементы первого уровня вложенности
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
ИмяПоля = ЧтениеXML.Имя;
Сообщить("Найдено свойство в XML: " + ИмяПоля);
КонецЕсли;
КонецЦикла;
Важный нюанс: Имена свойств в XML могут незначительно отличаться от имен в программном коде (например, в XML может использоваться английское наименование, которое 1С понимает как синоним). Однако для большинства системных свойств (CodeLength, DescriptionLength) это соответствие прямое.
Если задача стоит в разовом анализе или вы разрабатываете собственную консоль администратора, выясним, как это реализовано в профессиональных инструментах. Проекты, такие как «Инструменты разработчика» (ИР) или bsl_console, используют комбинированный подход. Для наглядного исследования конфигурации можно использовать инструмент для построения дерева метаданных с описанием всех свойств объектов.
Посмотрим, как работает логика в таких инструментах:
Метаданные.Содержит(Объект)).Рассмотрим пример функции, использующей массив имен (упрощенно):
Функция ПолучитьВсеЗначенияСвойств(ОбъектМетаданных)
Результат = Новый Соответствие;
// Список свойств можно сформировать один раз при запуске или хранить в макете
СписокСвойств = "ДлинаКода,ДлинаНаименования,Иерархический,ВидИерархии,КоличествоУровней";
МассивИмен = СтрРазделить(СписокСвойств, ",");
Для каждого ИмяСвойства Из МассивИмен Цикл
Попытка
Результат.Вставить(ИмяСвойства, ОбъектМетаданных[ИмяСвойства]);
Исключение
// Свойство не поддерживается данным типом объекта
КонецПопытки;
КонецЦикла;
Возврат Результат;
КонецФункции
Для максимально глубокого анализа можно обратиться к схемам метаданных, которые хранятся внутри платформы. Каждое свойство объекта описано в соответствующей XSD-схеме. Программный доступ к ним позволяет получить не только имена свойств, но и их типы данных, значения по умолчанию и ограничения.
Это наиболее сложный путь, требующий понимания работы с ФабрикаXDTO и пространством имен http://v8.1c.ru/8.1/data/enterprise/current-config.
Выясним, какой метод выбрать в зависимости от ваших целей:
Помните, что при работе с метаданными важно обрабатывать исключения через блок Попытка...Исключение, так как некоторые свойства могут быть недоступны в зависимости от других настроек объекта (например, свойство КоличествоУровней доступно только если справочник Иерархический).