Имя: Пароль:
1C
 
УФ : Визуализировать на форме массив в виде ТЗ
0 bvb
 
28.10.22
17:51
Имею :
МассивСДанными = ПрочитатьJSON(ЧтениеJSON);

Нужно визуализировать данный массив на форме в виде таблицы значений (те заполнить таблицу значений - реквизит формы и визуализировать ее на форме, динамически создав колонки).
Состав колонок ясно дело произвольный

Гуглил примеры. Что нашел - нерабочие;

Таблицу могу создать из массива, функцией на сервере,  но проблема передать ее на клиент в ДанныеФормыКоллекция
1 vicof
 
28.10.22
18:01
Наверное, нужно подумать, почему нерабочий.
2 lodger
 
28.10.22
18:15
Наверное, надо осознать что суть есть ДанныеФормыКоллекция на клиенте, и чем это отличается от ТаблицаЗначений.
там же всего 1.5 шага до конечного результата, раз уж типизированная Таблица уже в руках.
3 Garykom
 
гуру
28.10.22
18:15
(0) Не тупи.
Динамический список на форме, произвольный запрос, свою ТЗ как параметр туда, запрос с ВТ
4 Сергиус
 
28.10.22
21:04
(3)[Состав колонок ясно дело произвольный] Не смущает? Для ДС придется вручную перетаскивать нужные колонки на форму. Автор же хочет, чтобы оно всё автоматом было)
5 Сергиус
 
28.10.22
21:06
(0)Зачем передавать таблицу на клиент? Заполнил на сервере и всё выведет и так.
6 Garykom
 
гуру
28.10.22
22:35
(4) Программно можно
7 bvb
 
29.10.22
15:50
(2) Реквизит формы типа ТаблицаЗначений под отладчиком видится как ДанныеФормыКоллекция
При этом таблица значений на клиенте не живет и на клиент не передается

Сейчас буду искать в направлении динамического создания колонок в таблице значений на форме
Возможно массив в ТЗ преобразовывать не нужно а сразу создать структуру на клиеннте
8 bvb
 
31.10.22
17:14
Вот сделал :

МассивСДанными = ПрочитатьJSON(ЧтениеJSON);
СоздатьИЗаполнитьСтруктуруКолонок(МассивСДанными);


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

&НаСервере
Функция ПреобразованиеМассивВТаблицуЗначений(Массив)

   ТЗ = Новый ТаблицаЗначений;

   Для Каждого СтрокаМассива Из Массив Цикл

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

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

КонецФункции
9 bvb
 
31.10.22
17:16
Одно непонятно :
Как понять при повторной загрузке понять что колонки созданы чтобы не создавать их
Или очисть коллекцию
10 mistеr
 
31.10.22
17:40
(0) В табдоке визуализируй.
11 bvb
 
31.10.22
18:20
Сделал проще :
Если ЭтаФорма.Элементы.Найти(ИмяКолонки) = Неопределено  Тогда
12 ДедМорроз
 
31.10.22
19:05
Если мы хотим динамически создать таблицу:
1. Удалить все элементы на форме с прошлой таблицв.
2. В массив удаления загнать все реквизиты таблицы (дочерние) и саму таблицу значений.
3. Создать новый реквизит ТаблицаЗначений и создать дочерние реквизиты для колонок таблицы.
4. Вызвать ИзменитьРеквизиты,передав массивы из 2 и 3.
5. Создать на форме таблицу и поля для видимых колонок таблицы значений,прописав пути до реквизитов.
6. Заполнить таблицу значений данными.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший