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