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

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

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

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

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

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

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

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

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

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

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

 

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

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

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
1. Филипп Сапожников (sapozhnikovfa) 1 13.06.14 15:09 Сейчас в теме
спасибо! очень помогло :)
2. Павел С (pavel_pss) 158 08.08.14 15:23 Сейчас в теме
спасибо, хоть стало понятно как вернуть рез запроса в таблицу.
3. Kent_killer (Kent_killer) 17.09.14 12:27 Сейчас в теме
Спасибо, полезная информация!
4. Влад Валерьевич (venvlad) 10 17.11.14 17:25 Сейчас в теме
5. Texnic79 (texnic79) 42 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) 15 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. Константин Куликов (Светлый ум) 195 07.09.16 10:21 Сейчас в теме
Не хватает быстрого выбора параметров, в поле справа
13. udmitriy udmitriy (udmitriy) 08.09.16 06:49 Сейчас в теме
Полезная статья, только нужно (так как тип хранилищезначений не прокатит) изменитьреквизиты поместить в цикл добавления в массив( в новый массив) значений, с оператором попытки
Чтото вроде
......
для каждого колонка из тз_рез.колонка цикл
Массив= новый массив;
Массив.добавить(новый реквизитформы(...
Попытка
Изменитьреквизиты(массив);
Исключение
Конецпопытки;
Конеццикла;
Конецесли;
Значениевреквизитформы(....,"ТЗ");
Приемник=реквизитформывзначение("ТЗ");
элтз=элементы.тз
Для каждого колонка из приемник.колонки цикл
.....
...Показать Скрыть
14. Владислав Лисовенко (VladC#) 59 21.11.16 18:24 Сейчас в теме
Хорошая статья, спасибо, пригодилось.