gifts2017

Таблица значений на УФ с динамическим набором колонок

Опубликовал Евгений (Ekovichev) в раздел Программирование - Практика программирования

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

Столкнулся с проблемой, когда мне было необходимо каждый раз менять состав колонок у таблицы на управляемых формах. Собственно, после некоторых тыканий и поисков получилось. Для примера написал простейшую консоль запросов на УФ.

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

Это связано с тем, что мы можем удалять только те элементы формы, которые создали программно.

Также на поле имеется поле ввода "ТекстЗапроса" и кнопка "Выполнить".

По кнопке "Выполнить" происходит  вызов процедуры "ПостроитьЗапрос()" на сервере. Строится запрос и результат отображается в программно созданной Таблице на форме.

&НаКлиенте
Процедура Команда1(Команда)
	ПостроитьЗапрос(); 
КонецПроцедуры

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

Не претендую на уникальность написанного, но вдруг кому пригодится подобный пример.

 

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Простейшая консоль запросов на УФ
.epf 6,70Kb
10.10.13
20
.epf 6,70Kb 20 Скачать

См. также

Вознаграждение за ответ
Сумма: 0 $m
Добавили:
Texnic79 (texnic79) (5.00 $m)
Подписаться Добавить вознаграждение

Комментарии

1. Филипп Сапожников (sapozhnikovfa) 13.06.14 15:09
спасибо! очень помогло :)
2. Павел С (pavel_pss) 08.08.14 15:23
спасибо, хоть стало понятно как вернуть рез запроса в таблицу.
3. Kent_killer (Kent_killer) 17.09.14 12:27
Спасибо, полезная информация!
4. Влад Валерьевич (venvlad) 17.11.14 17:25
5. Texnic79 (texnic79) 16.02.15 00:45
Огромное спасибо за материал. Мучился часа 2.
6. Александр Тигров (tiger_x) 16.02.15 07:12
Я почему-то не вижу никакого материала?
7. DERL (DERL) 18.02.15 09:07
Спасибо, пригодится в будущем )
8. Gimalaj Gimalaev (gimalaj) 20.05.15 14:08
9. Антон Антонов (ong1990) 22.06.15 13:08
А как добавлять колонки к уже имеющейся ТЗ на форме, с "жестко определенным набором" колонок?
10. Сергей Orlov (Norder) 29.06.15 12:06
11. Сергей Сидоров (simplysimply) 13.11.15 13:19
Спасибо. Действительно пригодилось.
12. Константин Куликов (Светлый ум) 07.09.16 10:21
Не хватает быстрого выбора параметров, в поле справа
13. udmitriy udmitriy (udmitriy) 08.09.16 06:49
Полезная статья, только нужно (так как тип хранилищезначений не прокатит) изменитьреквизиты поместить в цикл добавления в массив( в новый массив) значений, с оператором попытки
Чтото вроде
......
для каждого колонка из тз_рез.колонка цикл
Массив= новый массив;
Массив.добавить(новый реквизитформы(...
Попытка
Изменитьреквизиты(массив);
Исключение
Конецпопытки;
Конеццикла;
Конецесли;
Значениевреквизитформы(....,"ТЗ");
Приемник=реквизитформывзначение("ТЗ");
элтз=элементы.тз
Для каждого колонка из приемник.колонки цикл
.....
...Показать Скрыть
14. Владислав Лисовенко (VladC#) 21.11.16 18:24
Хорошая статья, спасибо, пригодилось.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа