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

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

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

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

Способ 1. Обход основных коллекций метаданных

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

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


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

ВсеОбъектыМетаданных = Новый Соответствие;

Для Каждого ИмяКоллекции Из МассивКоллекций Цикл
    Для Каждого ОбъектМетаданных Из Метаданные[ИмяКоллекции] Цикл
        ПолноеИмя = ИмяКоллекции + "." + ОбъектМетаданных.Имя;
        ВсеОбъектыМетаданных.Вставить(ПолноеИмя, ОбъектМетаданных);
    КонецЦикла;
КонецЦикла;

Способ 2. Рекурсивный сопоставительный анализ подсистем

Выясним, какие объекты входят в состав подсистем. Поскольку подсистемы в 1С могут иметь древовидную структуру (вложенные подсистемы), обойти только верхний уровень Метаданные.Подсистемы недостаточно — требуется рекурсивный обход всей иерархии.

Разберем алгоритм поиска объектов, не включенных ни в одну подсистему:

  1. Формируем полный список всех объектов метаданных конфигурации (например, в виде соответствия имен объектов).
  2. Обходим все подсистемы и их вложенные элементы, извлекая состав каждого узла через свойство Состав.
  3. Удаляем из исходного списка те объекты, которые встретились в составе подсистем.
  4. В результате получаем коллекцию объектов, не входящих ни в одну из подсистем.

Посмотрим на пример реализации данного алгоритма:


Процедура ЗаполнитьСоставПодсистемы(Подсистема, ОбъектыВПодсистемах)
    Для Каждого ЭлементСостава Из Подсистема.Состав Цикл
        ОбъектыВПодсистемах.Вставить(ЭлементСостава, Истина);
    КонецЦикла;
    
    Для Каждого ПодчиненнаяПодсистема Из Подсистема.Подсистемы Цикл
        ЗаполнитьСоставПодсистемы(ПодчиненнаяПодсистема, ОбъектыВПодсистемах);
    КонецЦикла;
КонецПроцедуры

// Использование алгоритма:
ОбъектыВПодсистемах = Новый Соответствие;

Для Каждого ТекПодсистема Из Метаданные.Подсистемы Цикл
    ЗаполнитьСоставПодсистемы(ТекПодсистема, ОбъектыВПодсистемах);
КонецЦикла;

// Исключаем из полного списка объекты, входящие в подсистемы:
ОбъектыВнеПодсистем = Новый Массив;

Для Каждого КлючИЗначение Из ВсеОбъектыМетаданных Цикл
    ОбъектМетаданных = КлючИЗначение.Значение;
    Если ОбъектыВПодсистемах[ОбъектМетаданных] = Неопределено Тогда
        ОбъектыВнеПодсистем.Добавить(ОбъектМетаданных);
    КонецЕсли;
КонецЦикла;

Ограничения и важные нюансы

Проанализируем технические особенности, которые необходимо учитывать при решении задачи:

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