К статье
Практический материал

Разработка и Конфигурация · 9 мин

Как в 1С обойти все элементы формы

Как в 1С обойти все элементы формы: перебор коллекции Элементы, отбор по типу, рекурсия по группам, работа с управляемыми и обычными формами, примеры кода.

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

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

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

Базовый цикл обхода элементов управляемой формы

В управляемой форме коллекция элементов доступна в серверных и клиентских процедурах модуля формы через свойство Элементы. Простейший обход выглядит так:

Для Каждого Элемент Из Элементы Цикл

Сообщить(Элемент.Имя);

КонецЦикла;

Каждый объект в коллекции имеет свойства Имя, Видимость, Доступность, Родитель и набор специфичных свойств в зависимости от вида элемента. Обращаться к специфичному свойству без проверки типа нельзя — у кнопки нет, например, свойства ПутьКДанным, и попытка чтения вызовет ошибку.

Коллекция включает все элементы: поля ввода, кнопки, группы, таблицы, декорации, страницы. Это удобно для массовых операций, но требует фильтрации, когда нужна только часть элементов.

Фильтрация элементов по типу и виду

Чаще всего требуется обработать не все элементы, а, например, только поля ввода или только кнопки. Для этого внутри цикла проверяют тип элемента через ТипЗнч():

Для Каждого Элемент Из Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда

Элемент.ТолькоПросмотр = Истина;

КонецЕсли;

КонецЦикла;

Для полей формы дополнительно доступно свойство Вид, позволяющее отличить поле ввода от поля флажка или поля картинки. Аналогично для кнопок используется тип КнопкаФормы, для таблиц — ТаблицаФормы, для групп — ГруппаФормы.

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

bsl
Для Каждого Элемент Из Элементы Цикл
    Если ТипЗнч(Элемент) = Тип("ПолеФормы") Тогда
        Элемент.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецЦикла;

Обход элементов внутри конкретной группы

Когда нужно обработать элементы только одной группы или вкладки, есть два подхода. Первый — проверять свойство Родитель у каждого элемента коллекции:

Для Каждого Элемент Из Элементы Цикл

Если Элемент.Родитель = Элементы.ГруппаНастройки Тогда

Элемент.Видимость = Ложь;

КонецЕсли;

КонецЦикла;

Ограничение этого способа: он находит только непосредственных потомков группы. Элементы вложенных подгрупп имеют другого родителя и не попадут в выборку. Если нужна полная вложенность, проверку родителя делают рекурсивно — поднимаясь по цепочке Родитель от элемента вверх, пока не встретится искомая группа или не закончится цепочка.

Второй подход — задать элементам осмысленные префиксы имён (например, Настройка_Период, Настройка_Склад) и фильтровать по СтрНачинаетсяС(Элемент.Имя, "Настройка_"). Это проще в сопровождении, но требует дисциплины при именовании.

Обход элементов в обычных формах

В обычных формах (режим обычного приложения) коллекция называется ЭлементыФормы, а типы элементов другие: ПолеВвода, Кнопка, ТабличноеПоле, Надпись. Логика перебора идентична:

Для Каждого Элемент Из ЭлементыФормы Цикл

Если ТипЗнч(Элемент) = Тип("ПолеВвода") Тогда

Элемент.Доступность = Ложь;

КонецЕсли;

КонецЦикла;

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

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

Практические сценарии использования

Массовое изменение видимости и доступности

Классическая задача — скрыть или заблокировать часть интерфейса по условию: роль пользователя, состояние документа, функциональная опция. Обход коллекции позволяет сделать это одним циклом вместо десятков строк обращений к отдельным элементам. При этом критично исключить из обработки служебные кнопки (командную панель, кнопки «Записать», «Закрыть»), иначе форма станет неработоспособной.

Поиск элемента по условию

Обход используют и для поиска: например, найти поле, связанное с конкретным реквизитом данных. У полей формы проверяется свойство ПутьКДанным:

Для Каждого Элемент Из Элементы Цикл

Если ТипЗнч(Элемент) = Тип("ПолеФормы")

И Элемент.ПутьКДанным = "Объект.Комментарий" Тогда

// найден нужный элемент

КонецЕсли;

КонецЦикла;

Если имя элемента известно заранее, обход не нужен — обращайтесь напрямую Элементы.ИмяЭлемента или Элементы.Найти("ИмяЭлемента"). Цикл оправдан только при массовой обработке или поиске по нестандартному условию.

Отладка и анализ структуры формы

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

Типичные ошибки
01
Обращение к специфичному свойству без проверки типа — у кнопки нет ПутьКДанным, код падает с ошибкой
02
Блокировка командной панели и служебных кнопок вместе с полями — пользователь не может закрыть или записать форму
03
Изменение коллекции во время обхода: добавление или удаление элементов внутри цикла ломает перебор
04
Попытка обратиться к Элементы из модуля объекта — коллекция существует только в модуле формы

Ограничения и безопасная работа с коллекцией

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

Учитывайте контекст выполнения. В управляемой форме свойства Видимость и Доступность можно менять и на клиенте, и на сервере, но частые серверные вызовы из цикла замедлят форму. Массовые изменения выполняйте в одной серверной процедуре, а не в цикле клиент-серверных вызовов.

Наконец, помните про условное оформление и функциональные опции: если видимость элемента уже управляется этими механизмами, ручное изменение в коде может конфликтовать с ними и давать непредсказуемый результат. Сначала проверьте, не настроено ли поведение элемента декларативно.

Контрольные точки

Как проверить результат

Состав обработанных элементов
Норма

В отладке видно, что цикл затронул только нужные типы элементов

Тревожный признак

Изменились служебные кнопки и командные панели

Работоспособность формы
Норма

Форма открывается, записывается и закрывается штатно

Тревожный признак

После обхода пропали кнопки записи или форма не отвечает

Производительность
Норма

Обход выполняется один раз при открытии или по событию

Тревожный признак

Цикл вызывается при каждом клиентском событии, форма тормозит

Итог

Что важно запомнить

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

Частые вопросы

Как обойти только видимые элементы формы?

Внутри цикла добавьте проверку Если Элемент.Видимость Тогда. Учтите, что видимость может управляться функциональными опциями и условным оформлением — фактическое значение свойства в коде отражает текущее состояние на момент выполнения.

Можно ли обойти элементы формы извне, из другой формы или общего модуля?

Напрямую — нет, коллекция элементов существует только в контексте модуля формы. Вариант обхода: передать в вызываемую форму параметры, а обработку элементов выполнить внутри неё, например в обработчике ПриСозданииНаСервере.

Как найти элемент формы по имени без цикла?

Используйте Элементы.Найти("ИмяЭлемента") — метод вернёт элемент или Неопределено, если такого имени нет. Прямое обращение Элементы.ИмяЭлемента тоже работает, но при отсутствии элемента вызовет ошибку, поэтому Найти безопаснее.

Почему в цикле не видно элементов таблицы (колонок)?

Колонки таблицы формы входят в общую коллекцию Элементы, но их родителем является таблица. Если вы фильтруете по родителю-группе, колонки не попадут в выборку. Проверяйте тип ПолеФормы и родителя-таблицу отдельно.

Как программно добавленные элементы попадают в обход?

Элементы, созданные через Элементы.Добавить() или Элементы.Вставить(), сразу включаются в коллекцию и будут видны при следующем обходе. Но добавлять их нельзя внутри самого цикла обхода — сначала завершите перебор.

Работает ли обход элементов в тонком и веб-клиенте одинаково?

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