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

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

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

Основной механизм: Метод ИзменитьРеквизиты

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

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


МассивУдаляемыхРеквизитов = Новый Массив;
МассивУдаляемыхРеквизитов.Добавить("ДополнительнаяИнформация");
ЭтаФорма.ИзменитьРеквизиты(, МассивУдаляемыхРеквизитов);

Важный нюанс: метод ИзменитьРеквизиты является крайне ресурсоемким. При каждом его вызове платформа полностью переформировывает структуру формы на стороне сервера и передает обновленный контекст на клиент. Поэтому, если нам нужно удалить 50 реквизитов, ни в коем случае нельзя вызывать этот метод в цикле. Сначала мы должны собрать все имена в один массив и вызвать метод один раз.

Пошаговый алгоритм удаления программных объектов

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

  1. Удаление элементов формы: Перед тем как удалять данные (реквизиты), необходимо удалить визуальные объекты, которые на них ссылаются. Если мы удалим реквизит, а элемент формы останется со старым значением в свойстве ПутьКДанным, это может привести к ошибкам отрисовки интерфейса.
  2. Удаление команд: Если к кнопкам были привязаны программно созданные команды, их также следует удалить из коллекции ЭтаФорма.Команды.
  3. Удаление самих реквизитов: Финальный этап — очистка структуры данных через ИзменитьРеквизиты.

Практический пример: Хранение и удаление созданных объектов

Одной из главных проблем при динамической работе с формой является потеря списка имен созданных объектов. Переменные в модуле формы на сервере не сохраняют свои значения между вызовами. Чтобы знать, что именно удалять, мы можем использовать служебный реквизит формы типа ТаблицаЗначений (например, с именем СписокСозданныхРеквизитов), где будем хранить имена всех добавленных объектов.

Рассмотрим комплексный пример процедуры очистки формы:


&НаСервере
Процедура ОчиститьДинамическиеЭлементы()

    // 1. Подготовим массив имен реквизитов для удаления из нашей служебной таблицы
    // Предположим, имена хранятся в колонке "ИмяОбъекта"
    МассивИмен = УдаляемыеРеквизиты.ВыгрузитьКолонку("ИмяОбъекта");

    // 2. Удаляем элементы формы (визуальные поля)
    Для Каждого ИмяЭлемента Из МассивИмен Цикл
        НайденныйЭлемент = Элементы.Найти(ИмяЭлемента);
        Если НайденныйЭлемент <> Неопределено Тогда
            Элементы.Удалить(НайденныйЭлемент);
        КонецЕсли;
    КонецЦикла;

    // 3. Удаляем связанные команды, если они создавались под теми же именами
    Для Каждого ИмяКоманды Из МассивИмен Цикл
        НайденнаяКоманда = Команды.Найти(ИмяКоманды);
        Если НайденнаяКоманда <> Неопределено Тогда
            Команды.Удалить(НайденнаяКоманда);
        КонецЕсли;
    КонецЦикла;

    // 4. Массовое удаление самих реквизитов формы
    ЭтаФорма.ИзменитьРеквизиты(, МассивИмен);

    // 5. Очищаем нашу служебную таблицу
    УдаляемыеРеквизиты.Очистить();

КонецПроцедуры

Тонкости работы с типизированными структурами

Выясним причину, по которой иногда удаление не срабатывает для колонок таблиц. Если вы создали программную ТаблицаЗначений на форме и добавили в неё колонки, то при удалении этих колонок в массиве необходимо указывать полный путь. Например, если таблица называется ТЗ_Данные, а колонка — Количество, то в массив для удаления нужно передать строку "ТЗ_Данные.Количество".

Посмотрим на пример удаления колонки из программной таблицы:


МассивПутей = Новый Массив;
МассивПутей.Добавить("МояПрограммнаяТаблица.УдаляемаяКолонка");
ЭтаФорма.ИзменитьРеквизиты(, МассивПутей);

Ограничения и рекомендации

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

Заключение

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

← На главную