Как программно удалить динамически созданные элементы и реквизиты на управляемой форме 1С

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

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

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

Главное правило: соблюдение очередности удаления

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

  1. Удаление визуальных элементов формы: сначала необходимо удалить элементы интерфейса с помощью метода Элементы.Удалить() или очистить их привязку к данным. Если попытаться удалить реквизит формы до того, как удален связанный с ним элемент управления, платформа генерирует исключение.
  2. Удаление реквизитов формы: после отвязки или удаления графических элементов вызывается метод ИзменитьРеквизиты(), в который передается массив имен удаляемых реквизитов.

Запоминание созданных объектов

Для того чтобы в дальнейшем без ошибок отыскать и удалить динамические объекты, при их добавлении рекомендуется сохранять их имена. Удобным решением является создание реквизитов формы с типом СписокЗначений (например, СписокУдаляемыхЭлементов и СписокУдаляемыхРеквизитов).

Проанализируем пример кода, выполняющего удаление запомненных элементов и реквизитов на сервере:


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

Важные технические особенности метода ИзменитьРеквизиты

Рассмотрим детали работы метода ИзменитьРеквизиты():

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

Альтернативные варианты решения

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

  1. Управление видимостью: Если количество возможных полей заранее ограничено, проще добавить их на форму в конфигураторе и управлять свойством Видимость элементов на клиенте или сервере.
  2. Использование таблиц: Если данных много или их структура динамическая, удобнее использовать на форме реквизит типа ТаблицаЗначений или динамический список вместо массового создания отдельных полей ввода.
← На главную