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