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

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

При разработке сложных систем на платформе 1С:Предприятие 8.3 часто возникает необходимость автоматизированного получения списка всех объектов конфигурации. Это может потребоваться для проведения аудита системы с помощью таких инструментов, как статический анализатор кода, или автоматизированного создания технической документации и ТЗ на основе актуальной структуры метаданных. Основная сложность заключается в том, что объектов может быть сотни, и каждый из них обладает набором уникальных свойств, таких как Имя, Синоним и Комментарий.

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

Использование глобального объекта Метаданные

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

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


Для Каждого ОбъектМетаданных Из Метаданные.Справочники Цикл
    Сообщить("Имя: " + ОбъектМетаданных.Имя + " | Синоним: " + ОбъектМетаданных.Синоним);
КонецЦикла;

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

Универсальный обход всех коллекций метаданных

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

Разберем по шагам создание процедуры, которая собирает данные о справочниках, документах и регистрах в одну таблицу значений. Это позволит нам в дальнейшем легко выгрузить данные, например, в табличный документ или файл Excel.


// Создадим таблицу для хранения результатов
ТаблицаОбъектов = Новый ТаблицаЗначений;
ТаблицаОбъектов.Колонки.Добавить("ТипОбъекта");
ТаблицаОбъектов.Колонки.Добавить("Имя");
ТаблицаОбъектов.Колонки.Добавить("Синоним");
ТаблицаОбъектов.Колонки.Добавить("Описание");

// Определим массив имен коллекций, которые нам интересны
КоллекцииДляОбхода = Новый Массив;
КоллекцииДляОбхода.Добавить("Константы");
КоллекцииДляОбхода.Добавить("Справочники");
КоллекцииДляОбхода.Добавить("Документы");
КоллекцииДляОбхода.Добавить("ЖурналыДокументов");
КоллекцииДляОбхода.Добавить("Перечисления");
КоллекцииДляОбхода.Добавить("Отчеты");
КоллекцииДляОбхода.Добавить("Обработки");
КоллекцииДляОбхода.Добавить("ПланыВидовХарактеристик");
КоллекцииДляОбхода.Добавить("РегистрыСведений");
КоллекцииДляОбхода.Добавить("РегистрыБухгалтерии");
КоллекцииДляОбхода.Добавить("РегистрыНакопления");

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

В этом коде мы используем обращение к свойству объекта Метаданные через квадратные скобки Метаданные[ИмяКоллекции]. Это позволяет динамически подставлять имя коллекции и получать доступ к её элементам. Такой подход значительно сокращает объем кода и позволяет создавать универсальные механизмы обработки, на базе которых можно построить, например, MCP сервер для работы с метаданными — поможет инструмент поиска и выгрузки метаданных в XML.

Детальное описание реквизитов и табличных частей

Зачастую простого списка имен объектов недостаточно. Для полноценного технического задания требуется проанализировать и внутреннюю структуру: реквизиты, табличные части и их колонки. Рассмотрим подробнее, как программно "заглянуть" внутрь конкретного справочника или документа.

Каждый объект метаданных (например, конкретный справочник) сам обладает коллекциями Реквизиты и ТабличныеЧасти. Выясним причину, по которой важно проверять наличие этих коллекций: не все объекты метаданных их имеют (например, у Константы нет табличных частей).

Рассмотри пример получения состава реквизитов для всех документов системы:


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

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

Выгрузка данных в отчет или таблицу

После того как мы собрали всю необходимую информацию, нам нужно представить её в читаемом виде. Если вам не требуется разрабатывать сложную логику с нуля, можно применить готовый универсальный отчет по метаданным, а для кастомных решений лучшим инструментом в 1С является ПостроительОтчета или программное формирование объекта ТабличныйДокумент.

Проанализируем алгоритм вывода данных:

  1. Создаем новый ТабличныйДокумент.
  2. Формируем "шапку" таблицы с заголовками колонок.
  3. В цикле обходим метаданные и заполняем строки.
  4. Применяем форматирование (жирный шрифт для заголовков, границы ячеек).
  5. Выводим результат пользователю.

ТабДок = Новый ТабличныйДокумент;
СекцияШапка = ТабДок.ПолучитьОбласть("R1C1:R1C4"); // Условная область
// Заполняем заголовки...
// Для Каждого СтрокаДанных Из ТаблицаОбъектов Цикл
//    ... заполнение ячеек ...
// КонецЦикла;
ТабДок.Показать("Список объектов метаданных");

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

Использование стандартных инструментов БСП

Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), стоит обратить внимание на встроенные возможности. В составе БСП есть подсистема "Печать", а также вспомогательные отчеты, которые могут выводить описание метаданных.

Выясним еще одну деталь: начиная с платформы 8.3.6, появилась возможность более тонкой работы с метаданными через методы Метаданные.НайтиПоТипу() и Метаданные.НайтиПоПолномуИмени(). Эти функции крайне полезны, когда у вас на входе есть ссылка на объект или строка с его техническим наименованием, и вам нужно получить его описание (Синоним или структуру реквизитов).

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

← На главную