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

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

В процессе разработки часто возникает задача вывода данных, структура которых заранее неизвестна (например, при парсинге JSON или работе с динамическими отчетами). В управляемых формах 1С ТаблицаЗначений не передается с сервера на клиент, так как она не является объектом формы. Вместо этого используется ДанныеФормыКоллекция. Давайте разберем, как правильно реализовать визуализацию произвольных колонок на форме.

Подход к решению: использование метода ИзменитьРеквизиты

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

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

Шаг 1: Подготовка данных и структуры

Для начала преобразуем массив данных в ТаблицаЗначений. Это позволит нам легко пробежаться по колонкам и создать соответствующие реквизиты.


Функция ПреобразованиеМассивВТаблицуЗначений(Массив)
    ТЗ = Новый ТаблицаЗначений;
    Для Каждого СтрокаМассива Из Массив Цикл
        Если ТЗ.Колонки.Количество() = 0 Тогда
            Для Каждого ЭлементМассива Из СтрокаМассива Цикл
                ТЗ.Колонки.Добавить(ЭлементМассива.Ключ);
            КонецЦикла;
        КонецЕсли;
        НоваяСтрока = ТЗ.Добавить();
        Для Каждого ЭлементМассива Из СтрокаМассива Цикл
            НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение;
        КонецЦикла;
    КонецЦикла;
    Возврат ТЗ;
КонецФункции

Шаг 2: Динамическое создание реквизитов и элементов формы

После того как ТаблицаЗначений у нас на руках, необходимо создать реквизиты формы. Используйте Новый РеквизитФормы, указав путь к данным внутри вашей табличной части. После того как массив реквизитов сформирован, применяем ИзменитьРеквизиты.


&НаСервере
Процедура СоздатьИЗаполнитьСтруктуруКолонок(МассивСДанными)
    ТЗ = ПреобразованиеМассивВТаблицуЗначений(МассивСДанными);
    МассивКолонок = Новый Массив;

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

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

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

    // Загружаем данные в реквизит формы
    ТЗ_Отчета.Загрузить(ТЗ);
КонецПроцедуры

Важные рекомендации при реализации

  1. Очистка данных: Если пользователь может нажать кнопку «Сформировать» несколько раз, обязательно предусмотрите удаление старых колонок перед созданием новых. Это можно сделать, вызвав ИзменитьРеквизиты с пустым массивом для добавления и массивом удаляемых реквизитов.
  2. Типизация: В примере выше мы используем КвалификаторыСтроки(150). В реальных задачах желательно анализировать тип данных из JSON (число, дата или строка) и устанавливать соответствующий тип в ОписаниеТипов, чтобы избежать ошибок при выводе.
  3. Альтернатива (Табличный документ): Если редактирование данных в этой таблице не требуется, а нужно просто отобразить результат, рассмотрите использование ТабличныйДокумент. Это значительно проще, не требует манипуляций с реквизитами формы и работает быстрее.
  4. Производительность: Метод ИзменитьРеквизиты является «тяжелым». Старайтесь минимизировать количество вызовов этого метода.

Используя этот алгоритм, вы сможете гибко выводить любые структуры данных на управляемые формы 1С, сохраняя при этом чистоту кода и корректную работу интерфейса.

← На главную