Как программно обойти все метаданные в конфигурации 1С?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

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

Причина возникновения ошибки

Ошибка Итератор для значения не определен возникает тогда, когда в цикле Для Каждого ... Из ... Цикл мы пытаемся перебрать свойство, которое не является коллекцией. В дереве метаданных 1С есть как коллекции (например, Справочники, Документы, РегистрыСведений), по которым можно итерироваться, так и обычные скалярные свойства (например, Имя, Версия, АвторскиеПрава). Если вы попытаетесь запустить цикл по свойству Метаданные.Имя, платформа выбросит исключение, так как это просто строка, а не список элементов.

Способ №1: Использование процедурного подхода по коллекциям

Самый надежный способ — это создание отдельных процедур для обхода каждой коллекции метаданных. Мы заранее определяем список необходимых коллекций и передаем их в универсальную процедуру проверки. Это исключает обращение к скалярным свойствам.

Рассмотрим пример реализации:


Процедура ВыполнитьПроверкуМетаданных()
    ПредельнаяДлина = 80;
    
    // Вызываем проверку для каждой нужной коллекции
    ПроверитьКоллекциюМетаданных(Метаданные.Документы, ПредельнаяДлина);
    ПроверитьКоллекциюМетаданных(Метаданные.Справочники, ПредельнаяДлина);
    ПроверитьКоллекциюМетаданных(Метаданные.РегистрыСведений, ПредельнаяДлина);
    // И так далее для всех нужных видов метаданных
КонецПроцедуры

Процедура ПроверитьКоллекциюМетаданных(КоллекцияМетаданных, ПредельнаяДлина)
    Для Каждого ОбъектМетаданных Из КоллекцияМетаданных Цикл
        Если СтрДлина(ОбъектМетаданных.Имя) > ПредельнаяДлина Тогда
            Сообщить("Объект с длинным именем: " + ОбъектМетаданных.Имя);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Способ №2: Безопасный перебор через блок «Попытка»

Если вы не хотите составлять список всех коллекций вручную, можно использовать конструкцию Попытка...Исключение. Это позволит «проскочить» те свойства, которые не поддерживают итерацию.


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

Рекомендации по оптимизации процесса

  1. Выполнение на сервере: Все операции с метаданными выполняйте исключительно в процедурах с директивой &НаСервере. Это значительно повышает скорость работы, так как не требуется передача объектов метаданных между клиентом и сервером.
  2. Избегайте вывода в формы: Если конфигурация большая (как, например, типовая 1С:ERP), не старайтесь выводить результат каждого прохода в элементы формы или таблицы на лету. Сначала соберите данные в массив или таблицу значений, а после завершения цикла выведите результат одним списком. Это спасет интерфейс от зависаний.
  3. Использование отладчика: При написании кода для обхода метаданных всегда используйте точку останова. Если код падает, посмотрите в окне «Табло» тип переменной Элем — это поможет понять, на каком именно свойстве конфигурации спотыкается ваш алгоритм.

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

← На главную