Зачастую нужно быстро и просто визуализировать на управляемой форме таблицу значений с произвольным перечнем колонок либо, как частный случай, двумерный массив.
Посмотрим, как это можно сделать:
Я покажу оба способа:
- Визуализация двумерного массива
- Визуализация ТЗ
Первый вариант включает в себя второй.
Допустим, мы имеем на клиенте двумерный массив. В данном случае, это массив с данными, прочитанный по API с нашего известного маркетплейса.
&НаКлиенте
МассивСДанными = ПрочитатьJSON(ЧтениеJSON);
Если ТипЗнч(МассивСДанными) = Тип("Массив") Тогда
СоздатьИЗаполнитьСтруктуруКолонок(МассивСДанными); //ВЫзов основной серверной процедуры
Нам нужно его визуализировать на форму, (с последующей естественно обработкой), но в моменте нужно визуально просмотреть: а что там JSON собственно начитал.
- Создадим на форме реквизит «ТЗ_ЧтениеJSON». Без колонок реквизитов.
Нюанс: Реквизит - таблицу можно создавать и динамически (далее я укажу этот вариант в коде). Но я считаю, что реквизит будущей таблицы удобнее разместить сразу в форме там, где нужно и как нужно.
- Если мы работаем с массивом, то имеет смысл преобразовать его в ТЗ с помощью известной функции. Если мы уже имеем ТЗ, то переходим сразу к пункту 3
&НаСервере Функция ПреобразованиеМассивВТаблицуЗначений(Массив) ТЗ = Новый ТаблицаЗначений; Для Каждого СтрокаМассива Из Массив Цикл Если ТЗ.Колонки.Количество() = 0 Тогда Для Каждого ЭлементМассива Из СтрокаМассива Цикл ТЗ.Колонки.Добавить(ЭлементМассива.Ключ); КонецЦикла; КонецЕсли; НоваяСтрока = ТЗ.Добавить(); Для Каждого ЭлементМассива Из СтрокаМассива Цикл НоваяСтрока[ЭлементМассива.Ключ] = ЭлементМассива.Значение; КонецЦикла; КонецЦикла; Возврат ТЗ; КонецФункции
- Ну и собственно серверная процедура, создающая таблицу на форме и заполняющая ее данными из ТЗ.
Процедура СоздатьИЗаполнитьСтруктуруКолонок (МассивСДанными)
//Получаем ТЗ из массив (или откуда угодно)
//Помним что ТЗ живет у нас только на сервере !!!
ТЗ = ПреобразованиеМассивВТаблицуЗначений(МассивСДанными);
МассивКолонок = Новый Массив;
//-------------Если элемент таблица создается динамически на форме--------
//МассивКолонок.Добавить(Новый РеквизитФормы("ТЗ_ЧтениеJSON",Новый ОписаниеТипов("ТаблицаЗначений")));
//- она кстати тоже будет элементом массива
//-------------Если элемент таблица создается динамически на форме-------
//Добавим колонки в существующий реквизит формы
Для Каждого КолонкаТЗ ИЗ ТЗ.колонки Цикл
ИмяКолонки = КолонкаТЗ.Имя;
ТипРеквизита = Новый ОписаниеТипов("Строка", , ,Новый КвалификаторыСтроки(150)); //Тут можно типизировать колонку реквизита явным образом , но в моем случае это строка и делать я этого не буду
нРеквизитФормы = Новый РеквизитФормы(ИмяКолонки, ТипРеквизита, "ТЗ_ЧтениеJSON", ИмяКолонки); //Новый реквизит - элемент массива
Если ЭтаФорма.Элементы.Найти(ИмяКолонки) = Неопределено Тогда //ищем в составе элеменов формы, чтобы при повторном вызове процедуры не было ошибки задвоения реквизитов
МассивКолонок.Добавить(нРеквизитФормы);
КонецЕсли;
КонецЦикла;
// добавим собственно реквизиты на форму
ИзменитьРеквизиты(МассивКолонок);
//-------------Если элемент таблица создается динамически на форме-------
//// добавим элементы формы
//Таб = Элементы.Добавить("ТЗ_ЧтениеJSON", Тип("ТаблицаФормы"));
//Таб.ПутьКДанным = "ТЗ_ЧтениеJSON";
//// запретим менять положение строк и сами строки, отключим командную панель
//Таб.ИзменятьСоставСтрок = Ложь;
//Таб.ИзменятьПорядокСтрок = Ложь;
//Таб.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет;
//-------------Если элемент таблица создается динамически на форме-------
//Добавим поля и пропишем путь к данным
Для Каждого КолонкаТЗ ИЗ ТЗ.колонки Цикл
ИмяКолонки = КолонкаТЗ.Имя;
Если ЭтаФорма.Элементы.Найти(ИмяКолонки) = Неопределено Тогда
нЭлемент = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Элементы.ТЗ_ЧтениеJSON);
нЭлемент.Вид = ВидПоляФормы.ПолеВвода;
нЭлемент.ПутьКДанным = "ТЗ_ЧтениеJSON." + ИмяКолонки;
КонецЕсли;
КонецЦикла;
ТЗ_ЧтениеJSON.Загрузить(ТЗ); //Грузим нашу исходную ТЗ
КонецПроцедуры