Как программно получить и обойти все свойства объекта метаданных в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки сложных универсальных обработок, систем миграции данных или инструментов для анализа конфигурации программисты часто сталкиваются с необходимостью получить полный список свойств объекта метаданных. Если с коллекциями, такими как Реквизиты, ТабличныеЧасти или Формы, всё достаточно просто (они представляют собой итерируемые коллекции, которые можно обойти циклом Для каждого), то с одиночными свойствами, вроде ДлинаКода, Иерархический или СпособРедактирования, возникают сложности. Платформа 1С не предоставляет встроенного метода Свойства() для объектов метаданных.

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

Анализ проблемы: Коллекции против Одиночных свойств

Проанализируем структуру метаданных. Когда мы обращаемся к Метаданные.Справочники.Номенклатура, мы получаем объект типа ОбъектМетаданных: Справочник. У этого объекта есть два типа атрибутов:

  1. Коллекции метаданных: это списки подчиненных объектов (реквизитов, макетов, табличных частей). Их легко перебрать программно.
  2. Свойства (атрибуты): это фиксированные настройки самого объекта (длина наименования, тип кода, использование полнотекстового поиска). К ним можно обратиться только напрямую через точку, если вы знаете их имя: Метаданные.Справочники.Номенклатура.ДлинаКода.

Чтобы получить список всех таких «точечных» свойств без ручного написания имён, нам придется использовать обходные пути.

Решение 1: Использование механизмов XDTO (Сериализация)

Рассмотрим наиболее универсальный и технологичный способ — использование XDTO (XML Data Transfer Objects). Платформа 1С позволяет сериализовать описание метаданных. Это открывает нам доступ к структуре объекта как к данным, которые можно перебрать программно.

Выполним следующие шаги для получения свойств через XDTO:


// Получим объект метаданных, свойства которого нужно изучить
ОбъектМетаданных = Метаданные.Справочники.Номенклатура;

// Используем СериализаторXDTO для преобразования метаданных в объект XDTO
Попытка
    ОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(ОбъектМетаданных);
    
    // Теперь мы можем обратиться к типу объекта XDTO, который содержит описание всех свойств
    ТипXDTO = ОбъектXDTO.Тип();
    
    // Перебираем все свойства, описанные в типе XDTO
    Для каждого СвойствоXDTO Из ТипXDTO.Свойства Цикл
        ИмяСвойства = СвойствоXDTO.Имя;
        
        // Попытаемся получить значение этого свойства из объекта метаданных
        Попытка
            ЗначениеСвойства = ОбъектМетаданных[ИмяСвойства];
            Сообщить(ИмяСвойства + ": " + ЗначениеСвойства);
        Исключение
            // Некоторые свойства могут быть коллекциями или недоступны напрямую
            Сообщить("Свойство " + ИмяСвойства + " является коллекцией или недоступно.");
        КонецПопытки;
    КонецЦикла;
Исключение
    Сообщить("Не удалось сериализовать объект метаданных в XDTO");
КонецПопытки;

Этот метод хорош тем, что он автоматически подстраивается под версию платформы. Если в новой версии 1С у справочников появится новое свойство, оно автоматически попадет в схему XDTO и будет обработано вашим кодом.

Решение 2: Программный анализ XML-структуры

Разберем еще один надежный метод, основанный на чтении 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) это соответствие прямое.

Решение 3: Использование готовых инструментов (Инструменты Разработчика)

Если задача стоит в разовом анализе или вы разрабатываете собственную консоль администратора, выясним, как это реализовано в профессиональных инструментах. Проекты, такие как «Инструменты разработчика» (ИР) или bsl_console, используют комбинированный подход. Для наглядного исследования конфигурации можно использовать инструмент для построения дерева метаданных с описанием всех свойств объектов.

Посмотрим, как работает логика в таких инструментах:

  1. Рекурсивный обход: Алгоритм проверяет, является ли атрибут коллекцией (через Метаданные.Содержит(Объект)).
  2. Предопределенный список: Поскольку состав свойств метаданных меняется редко, разработчики часто используют заранее подготовленный массив строк с именами всех возможных свойств для каждого типа объекта (Справочник, Документ, Регистр).
  3. Макеты описания: В конфигурацию встраивается макет (текстовый или XML), в котором перечислены все доступные свойства для разных версий платформы.

Рассмотрим пример функции, использующей массив имен (упрощенно):


Функция ПолучитьВсеЗначенияСвойств(ОбъектМетаданных)
    Результат = Новый Соответствие;
    
    // Список свойств можно сформировать один раз при запуске или хранить в макете
    СписокСвойств = "ДлинаКода,ДлинаНаименования,Иерархический,ВидИерархии,КоличествоУровней";
    МассивИмен = СтрРазделить(СписокСвойств, ",");
    
    Для каждого ИмяСвойства Из МассивИмен Цикл
        Попытка
            Результат.Вставить(ИмяСвойства, ОбъектМетаданных[ИмяСвойства]);
        Исключение
            // Свойство не поддерживается данным типом объекта
        КонецПопытки;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Решение 4: Анализ схем метаданных (XSD)

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

Это наиболее сложный путь, требующий понимания работы с ФабрикаXDTO и пространством имен http://v8.1c.ru/8.1/data/enterprise/current-config.

Подведем итоги

Выясним, какой метод выбрать в зависимости от ваших целей:

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

← На главную