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

Публикация № 203445

Программирование - Практика программирования

УФ Управляемые формы колонки на управляемых формах

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

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

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

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

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

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

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

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

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

 

66

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

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

См. также

Специальные предложения

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

Далее описание действий в коде (обработчик формы ПриОткрытии, выполняется на сервере):

На форме есть заранее подготовленная ("вручную" средствами конфигуратора) группа, назовем ее "СтраницыТаблиц", ей устанавливаем вид "ВидГруппыФормы.Страницы"

Добавляем элемент, условно названный "СтраницаТаблицы_хх", их может быть много, с родителем = имеющейся группе "СтраницыТаблиц", ему устанавливаем вид "ВидГруппыФормы.Страница"

Далее идет схожий приведенному код, т.е. добавляем реквизит ТЗ в форму, добавляем ему колонки, вызываем ИзменитьРеквизиты, добавляем элемент "ТаблицаФормы" с родителем "СтраницаТаблицы_хх", добавляем ему колонки.

В отладчике все видно, все добавлено, все в своей иерархии, но после завершения кода добавления, база виснет и через 20-30 секунд сообщает, что сервер разорвал связь, нет доступа к ресурсу базы с формами.
"Ошибка при выполнении запроса POST к ресурсу /e1cib/logForm"

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

В чем трабл, не пойму. Может кто с таким сталкивался?
Оставьте свое сообщение