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

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

Разработка - Практика программирования

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

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

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

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

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

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

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

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

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

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

 

70

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

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

См. также

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

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

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

В чем трабл, не пойму. Может кто с таким сталкивался?
19. Heinrich2906 14.05.19 09:32 Сейчас в теме
20. mrx2012 12.09.19 10:09 Сейчас в теме
Привет всем.
А кто-нибудь победил ошибку, которая появляется при поиске в динамической таблице?
"{mngbase/UniversalListFind.lf(90)}: Значение не является значением объектного типа (Types)
	If (FinalValueType.Types().Count() = 1 And FinalValueType.ContainsType(Type("Date"))) Then"
21. SlavaKron 12.09.19 11:36 Сейчас в теме
(20) В конфигураторе в реквизит ТЗ добавить служебную колонку. Тогда код из статьи будет иметь вид:
	ТЗ_рез = РеквизитФормыВЗначение("ТЗ");
	
	УдаляемыеРеквизиты = Новый Массив;
	
	//Удалим ранее созданные колонки в ТЗ    
	Для Каждого Колонка Из ТЗ_рез.Колонки Цикл
		Если Колонка.Имя <> "СлужебнаяКолонка" Тогда
	    	УдаляемыеРеквизиты.Добавить("ТЗ." + Колонка.Имя);
		КонецЕсли;
	КонецЦикла;
	
	//Удалим отображение таблицы на форме и создадим новую
	ЭлементТаблица = Элементы.Найти("ТЗ");
	Если ЭлементТаблица <> Неопределено Тогда
	    Элементы.Удалить(ЭлементТаблица);        
	КонецЕсли;     
	
	ЭлементТаблица = Элементы.Добавить("ТЗ",Тип("ТаблицаФормы"));
	ЭлементТаблица.ПутьКДанным = "ТЗ";
	ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;
	
	//Выполним запрос
	Запрос = Новый Запрос(ТекстЗапроса);
	ТЗ_рез = Запрос.Выполнить().Выгрузить();
	
	//Создадим реквизиты ТЗ
	ДобавляемыеРеквизиты = Новый Массив;
	Для Каждого Колонка ИЗ ТЗ_рез.Колонки Цикл
	    НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТЗ");
	    ДобавляемыеРеквизиты.Добавить(НоваяКолонка);
	КонецЦикла;      
	ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
	
	//Создаем элементы на форме для отображения колонок
	ЭлементТЗ = Элементы.ТЗ;
	Для Каждого Колонка ИЗ ТЗ_рез.Колонки Цикл
		НовыйЭлементФормы = Элементы.Добавить("ТЗ"+Колонка.Имя, Тип("ПолеФормы"), ЭлементТЗ);
		НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлементФормы.ПутьКДанным = "ТЗ." + Колонка.Имя;
	КонецЦикла;
	
	ТЗ_рез.Колонки.Добавить("СлужебнаяКолонка");
	ЗначениеВРеквизитФормы(ТЗ_рез, "ТЗ");
Показать
Позволил себе объединить добавление и удаление реквизитов в один вызов ИзменитьРеквизиты.
Оставьте свое сообщение