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