При разработке управляемых форм в 1С:Предприятие 8.3 нередко возникает необходимость динамически формировать пользовательский интерфейс. Например, количество полей ввода может зависеть от выбранных настроек или условий. Однако при повторном перестроении формы или сбросе настроек ранее созданные элементы и реквизиты необходимо корректно удалить.
Рассмотрим по шагам, как правильно выполнять очистку управляемой формы от динамически добавленных элементов и реквизитов, чтобы избежать распространенных ошибок платформы.
Разберем ключевой нюанс работы с управляемыми формами. Процесс удаления состоит из двух строго последовательных шагов:
Элементы.Удалить() или очистить их привязку к данным. Если попытаться удалить реквизит формы до того, как удален связанный с ним элемент управления, платформа генерирует исключение.ИзменитьРеквизиты(), в который передается массив имен удаляемых реквизитов.Для того чтобы в дальнейшем без ошибок отыскать и удалить динамические объекты, при их добавлении рекомендуется сохранять их имена. Удобным решением является создание реквизитов формы с типом СписокЗначений (например, СписокУдаляемыхЭлементов и СписокУдаляемыхРеквизитов).
Проанализируем пример кода, выполняющего удаление запомненных элементов и реквизитов на сервере:
&НаСервере
Процедура УдалитьПрограммноСозданныеРеквизитыИЭлементы()
// 1. Убираем элементы формы
Для каждого ЭлементФ Из СписокУдаляемыхЭлементов Цикл
НайденныйЭлементФормы = ЭтаФорма.Элементы.Найти(ЭлементФ.Значение);
Если НайденныйЭлементФормы <> Неопределено Тогда
ЭтаФорма.Элементы.Удалить(НайденныйЭлементФормы);
КонецЕсли;
КонецЦикла;
// 2. Формируем массив имен удаляемых реквизитов
УдаляемыеРеквизиты = Новый Массив;
Для каждого ЭлементСписка Из СписокУдаляемыхРеквизитов Цикл
УдаляемыеРеквизиты.Добавить(ЭлементСписка.Значение);
КонецЦикла;
// 3. Убираем реквизиты формы (массив удаляемых передается вторым параметром)
ИзменитьРеквизиты(, УдаляемыеРеквизиты);
// 4. Очищаем списки отслеженных имен
СписокУдаляемыхРеквизитов.Очистить();
СписокУдаляемыхЭлементов.Очистить();
КонецПроцедуры
Рассмотрим детали работы метода ИзменитьРеквизиты():
ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты). Для удаления реквизитов первый параметр оставляется пустым (или передается пустой массив), а во второй передается массив строк с именами реквизитов."ф23" или "ОтборКомментарий23"), а не объекты типа РеквизитФормы.ИзменитьРеквизиты() приводит к полному перестроению контекста формы, поэтому рекомендуем объединять создание и удаление нескольких реквизитов в один вызов метода для оптимизации производительности.ИзменитьРеквизиты() можно удалять только те реквизиты, которые были добавлены программно. Реквизиты, созданные в режиме конфигуратора, удалять запрещено.Посмотрим на ситуации, когда динамическое удаление можно заменить более простыми архитектурными подходами:
Видимость элементов на клиенте или сервере.ТаблицаЗначений или динамический список вместо массового создания отдельных полей ввода.