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