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