Как вывести на форму таблицу с динамически определяемыми столбцами в 1С

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

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

Принцип работы с динамическими таблицами на управляемой форме

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

  1. Добавить реквизит структуры: программно расширить структуру реквизита формы (например, реквизита с типом ТаблицаЗначений) с помощью специального метода ИзменитьРеквизиты.
  2. Создать элемент интерфейса: добавить элемент формы (поле формы) через коллекцию Элементы и связать его с созданным реквизитом через свойство ПутьКДанным.

Шаг 1. Динамическое добавление реквизитов формы

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

Рассмотрим следующий пример:


// Массив для хранения новых реквизитов формы
МассивДобавляемыхРеквизитов = Новый Массив;

// Имя реквизита формы типа ТаблицаЗначений (например, "СводнаяТаблицаАренды")
ИмяТаблицыФормы = "СводнаяТаблицаАренды"; 

// Проверяем наличие колонки и формируем описание нового реквизита
ИмяКолонки = "ДинамическаяКолонка1";
ЗаголовокКолонки = "Период 1";

// Формируем реквизит формы: Имя, Тип, ПутьКРодителю, Заголовок
ОписаниеТипаСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150));
РеквизитКолонка = Новый РеквизитФормы(ИмяКолонки, ОписаниеТипаСтрока, ИмяТаблицыФормы, ЗаголовокКолонки);
МассивДобавляемыхРеквизитов.Добавить(РеквизитКолонка);

// Применяем изменения к структуре формы
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

Шаг 2. Создание элементов управления на форме

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


ИмяЭлемента = ИмяТаблицыФормы + ИмяКолонки;

// Проверяем, не создан ли элемент ранее
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
    // Добавляем поле ввода в элемент-таблицу на форме
    ТаблицаФормыЭлемент = Элементы[ИмяТаблицыФормы];
    НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), ТаблицаФормыЭлемент);
    
    // Настраиваем свойства элемента
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    НовыйЭлемент.ПутьКДанным = ИмяТаблицыФормы + "." + ИмяКолонки;
    НовыйЭлемент.Заголовок = ЗаголовокКолонки;
КонецЕсли;

Важные особенности и правила работы с динамическими колонками

Разберем нюансы, о которых важно помнить при реализации данного механизма:

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

Альтернативные способы решения задачи

Выясним, какие еще варианты отображения динамических данных существуют, если задача не требует непосредственного редактирования строк пользователем:

  1. Поле табличного документа: если данные выводятся для просмотра или отчета, целесообразно использовать реквизит с типом ТабличныйДокумент. Это избавляет от необходимости вызывать ИзменитьРеквизиты и позволяет свободно оформлять ячейки.
  2. Заранее созданный пул колонок: если максимальное количество колонок ограничено, их можно создать в конфигураторе заранее, а в коде менять только их свойство Видимость и заголовки.
  3. Поле HTML-документа: подходит для вывода сложных аналитических таблиц и дашбордов с произвольным форматированием.
← На главную