Как программно вывести таблицу значений с динамическими колонками на управляемую форму?

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

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

Основные этапы решения задачи

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

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

Шаг 1: Формирование динамических реквизитов

Прежде чем что-то отобразить, мы должны «объяснить» системе, что у нашей формы появились новые данные. Для этого мы создаем массив объектов типа РеквизитФормы. Каждый реквизит описывает отдельную колонку нашей будущей таблицы.

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

Шаг 2: Реализация на практике

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


// Предположим, таблицаЗначений уже заполнена данными
Для Каждого Колонка ИЗ таблицаЗначений.Колонки Цикл 
    Заг = СокрЛП(Колонка.Заголовок);
    Заг = ?(Заг = "", Колонка.Имя, Заг); 
    
    // Проверяем, не создан ли уже такой элемент
    Если Не Элементы.Найти(Заг) = Неопределено Тогда 
        Продолжить; 
    КонецЕсли; 
    
    МассивДобавляемыхРеквизитов = Новый Массив; 
    // Создаем новый реквизит для каждой колонки
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Заг, Колонка.ТипЗначения, "Таблица", Заг)); 
    
    // Применяем изменения структуры формы
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); 
    
    // Создаем визуальное представление колонки
    НоваяКолонка = Элементы.Добавить(Заг, Тип("ПолеФормы"), Элементы.Таблица); 
    НоваяКолонка.Заголовок = Заг; 
    НоваяКолонка.ПутьКДанным = "Таблица." + Заг; 
    НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; 
КонецЦикла; 

// Загружаем данные из объекта в реквизит формы
ЗначениеВРеквизитФормы(таблицаЗначений, "Таблица");

Важные замечания и советы

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

Теперь, когда вы разобрались с механизмом связки ТаблицыЗначений и формы, вы сможете легко создавать гибкие отчеты, которые подстраиваются под любой состав входных данных!

← На главную