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

10.10.13

Разработка - Механизмы платформы 1С

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

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

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

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

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

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

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

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

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

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

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

 

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

См. также

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    6604    human_new    21    

57

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    3247    YA_418728146    3    

87

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    3744    sebekerga    47    

85

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    8877    SeiOkami    24    

88

Методы работы с универсальным отчетом в подсистеме "Варианты отчетов" на БСП

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной статье рассмотрим типовую подсистему "Варианты отчетов" БСП на примере применения в универсальном отчете любой современной конфигурации.

30.05.2023    3522    quazare    4    

81

Расширение глобального поиска 1С, или Глобальный поиск "на максималках"

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Мало кто знает, что поле "Глобального поиска" в 1С можно доработать. Добавить свои варианты поиска, кнопочки в результатах и даже целые пользовательские меню.

27.03.2023    5486    SeiOkami    10    

129

Версионирование объектов VS История данных

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Давайте разберемся в механизме «История данных» и поэкспериментируем для наглядности. Сравним «Версионирование объектов» и «Историю данных».

06.03.2023    10261    dsdred    48    

144

Идентификатор объекта в запросе. Вы этого хотели?

Запросы Механизмы платформы 1С Платформа 1С v8.3 Запросы Бесплатно (free)

В платформе 8.3.22 появилась возможность получать идентификатор в запросе. Лично я ждал этого давно, но по итогу ждал большего. Что не так?

12.01.2023    22626    dsdred    24    

83
Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. sapozhnikovfa 1 13.06.14 15:09 Сейчас в теме
спасибо! очень помогло :)
RomanKod; +1 Ответить
17. пользователь 29.05.18 20:28
Сообщение было скрыто модератором.
...
2. pavel_pss 287 08.08.14 15:23 Сейчас в теме
спасибо, хоть стало понятно как вернуть рез запроса в таблицу.
3. Aleksandr_Ch 17.09.14 12:27 Сейчас в теме
Спасибо, полезная информация!
RomanKod; +1 Ответить
4. venvlad 25 17.11.14 17:25 Сейчас в теме
Спасибо, очень в тему)
5. texnic79 43 16.02.15 00:45 Сейчас в теме
Огромное спасибо за материал. Мучился часа 2.
6. tiger_x 16.02.15 07:12 Сейчас в теме
Я почему-то не вижу никакого материала?
8. gimalaj 17 20.05.15 14:08 Сейчас в теме
(6) Тем не менее, он есть )
7. DERL 18.02.15 09:07 Сейчас в теме
Спасибо, пригодится в будущем )
9. ong1990 3 22.06.15 13:08 Сейчас в теме
А как добавлять колонки к уже имеющейся ТЗ на форме, с "жестко определенным набором" колонок?
10. Norder 29.06.15 12:06 Сейчас в теме
Спасибо...
11. simplysimply 22 13.11.15 13:19 Сейчас в теме
Спасибо. Действительно пригодилось.
12. Светлый ум 351 07.09.16 10:21 Сейчас в теме
Не хватает быстрого выбора параметров, в поле справа
13. udmitriy 08.09.16 06:49 Сейчас в теме
Полезная статья, только нужно (так как тип хранилищезначений не прокатит) изменитьреквизиты поместить в цикл добавления в массив( в новый массив) значений, с оператором попытки
Чтото вроде
......
для каждого колонка из тз_рез.колонка цикл
Массив= новый массив;
Массив.добавить(новый реквизитформы(...
Попытка
Изменитьреквизиты(массив);
Исключение
Конецпопытки;
Конеццикла;
Конецесли;
Значениевреквизитформы(....,"ТЗ");
Приемник=реквизитформывзначение("ТЗ");
элтз=элементы.тз
Для каждого колонка из приемник.колонки цикл
.....
Показать
14. VladC# 64 21.11.16 18:24 Сейчас в теме
Хорошая статья, спасибо, пригодилось.
15. user726666 04.09.17 16:22 Сейчас в теме
Спасибо, полезная статья
16. user942338 29.05.18 20:21 Сейчас в теме
Благодарю!!!
18. anthonyv 8 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"
adhocprog; +1 Ответить
21. SlavaKron 12.09.19 11:36 Сейчас в теме
(20) В конфигураторе в реквизит ТЗ добавить служебную колонку. Тогда код из статьи будет иметь вид:
	ТЗ_рез = РеквизитФормыВЗначение("ТЗ");
	
	УдаляемыеРеквизиты = Новый Массив;
	
	//Удалим ранее созданные колонки в ТЗ    
	Для Каждого Колонка Из ТЗ_рез.Колонки Цикл
		Если Колонка.Имя <> "СлужебнаяКолонка" Тогда
	    	УдаляемыеРеквизиты.Добавить("ТЗ." + Колонка.Имя);
		КонецЕсли;
	КонецЦикла;
	
	//Удалим отображение таблицы на форме и создадим новую
	ЭлементТаблица = Элементы.Найти("ТЗ");
	Если ЭлементТаблица <> Неопределено Тогда
	    Элементы.Удалить(ЭлементТаблица);        
	КонецЕсли;     
	
	ЭлементТаблица = Элементы.Добавить("ТЗ",Тип("ТаблицаФормы"));
	ЭлементТаблица.ПутьКДанным = "ТЗ";
	ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;
	
	//Выполним запрос
	Запрос = Новый Запрос(ТекстЗапроса);
	ТЗ_рез = Запрос.Выполнить().Выгрузить();
	
	//Создадим реквизиты ТЗ
	ДобавляемыеРеквизиты = Новый Массив;
	Для Каждого Колонка ИЗ ТЗ_рез.Колонки Цикл
	    НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "ТЗ");
	    ДобавляемыеРеквизиты.Добавить(НоваяКолонка);
	КонецЦикла;      
	ИзменитьРеквизиты(ДобавляемыеРеквизиты, УдаляемыеРеквизиты);
	
	//Создаем элементы на форме для отображения колонок
	ЭлементТЗ = Элементы.ТЗ;
	Для Каждого Колонка ИЗ ТЗ_рез.Колонки Цикл
		НовыйЭлементФормы = Элементы.Добавить("ТЗ"+Колонка.Имя, Тип("ПолеФормы"), ЭлементТЗ);
		НовыйЭлементФормы.Вид = ВидПоляФормы.ПолеВвода;
		НовыйЭлементФормы.ПутьКДанным = "ТЗ." + Колонка.Имя;
	КонецЦикла;
	
	ТЗ_рез.Колонки.Добавить("СлужебнаяКолонка");
	ЗначениеВРеквизитФормы(ТЗ_рез, "ТЗ");
Показать
Позволил себе объединить добавление и удаление реквизитов в один вызов ИзменитьРеквизиты.
babys; adhocprog; mrx2012; +3 Ответить
22. dp_Sirchik 10.12.19 16:16 Сейчас в теме
(20) Позволю себе вставить свои 5 копеек :)
Решил проблему исключением типа Null. Вот часть кода с изменениями для приведённого алгоритма.
	
    //Создадим реквизиты ТЗ
    МассивРеквизитов.Очистить();
    Для Каждого Колонка ИЗ НоваяТаблица.Колонки Цикл
        МассивТипов = Новый Массив;
		Для Каждого ТипКолонки Из Колонка.ТипЗначения.Типы() Цикл
			Если ТипКолонки <> Тип("Null") Тогда
				МассивТипов.Добавить(ТипКолонки);
			КонецЕсли;
		КонецЦикла;
        НоваяКолонка = Новый РеквизитФормы(Колонка.Имя, Новый ОписаниеТипов(МассивТипов), ИмяТаблицыФормы);
        МассивРеквизитов.Добавить(НоваяКолонка);
    КонецЦикла;      
Показать


(21) В этом случае не матюкается, но поиск не работает...
hasp_x; adhocprog; SlavaKron; +3 Ответить
23. mrx2012 11.12.19 09:51 Сейчас в теме
(22) Спасибо. Мне помогло решение с добавлением служебной колонки.
adhocprog; +1 Ответить
24. afanas 10 19.03.20 09:36 Сейчас в теме
Спасибо. Мне помогло решение
25. hasp_x 156 19.06.20 08:38 Сейчас в теме
Пришлось делать журнал документов на СКД, всё хорошо, но пользователи захотели редактирования колонок. Ваше решение и комментарии здорово помогли.
26. One 27.11.20 11:35 Сейчас в теме
У меня почему-то ругается

ЗначениеВРеквизитФормы(ТЗ_рез, "ТаблицаУстановкаЦен");
по причине:
Недопустимое значение параметра (параметр номер '2')


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

	ТЗ_рез = РеквизитФормыВЗначение("ТаблицаУстановкаЦен");
	
	МассивРеквизитов = Новый Массив;
	
	//Удалим ранее созданные колонки в ТЗ    
	Для Каждого Колонка Из ТЗ_рез.Колонки Цикл
  		МассивРеквизитов.Добавить("ТаблицаУстановкаЦен." + Колонка.Имя);      
    КонецЦикла;
    ИзменитьРеквизиты(,МассивРеквизитов);
	ТЗ_рез.Колонки.Очистить();
	
	//Удалим отображение таблицы на форме и создадим новую
	ЭлементТаблица = Элементы.Найти("ТаблицаУстановкаЦен");
    Если ЭлементТаблица <> Неопределено Тогда
        Элементы.Удалить(ЭлементТаблица);        
	КонецЕсли;     
	
    ЭлементТаблица=Элементы.Добавить("ТаблицаУстановкаЦен",Тип("ТаблицаФормы"));
    ЭлементТаблица.ПутьКДанным = "ТаблицаУстановкаЦен";
    ЭлементТаблица.Отображение = ОтображениеТаблицы.Список;	
	
	
	//создаём реквизиты таблицы значений
	МассивРеквизитов.Очистить();
	
	Массив = Новый Массив;
	Массив.Добавить("СправочникСсылка.Номенклатура");
	ОТ = Новый ОписаниеТипов(Массив);
	НоваяКолонка = Новый РеквизитФормы("Номенклатура",ОТ , "ТаблицаУстановкаЦен");
	МассивРеквизитов.Добавить(НоваяКолонка);
	ТЗ_рез.Колонки.Добавить("Номенклатура");
	
	Массив = Новый Массив;
	Массив.Добавить("СправочникСсылка.ХарактеристикиНоменклатуры");
	ОТ = Новый ОписаниеТипов(Массив);
	НоваяКолонка = Новый РеквизитФормы("Характеристика", ОТ, "ТаблицаУстановкаЦен");
	МассивРеквизитов.Добавить(НоваяКолонка);
	ТЗ_рез.Колонки.Добавить("Характеристика");
	
	КЧ = Новый КвалификаторыЧисла(15,2);
	ОТ = Новый ОписаниеТипов(,,,КЧ);
	НоваяКолонка = Новый РеквизитФормы("ФактическаяСебестоимость", ОТ, "ТаблицаУстановкаЦен","Факт. себестоимость");
	МассивРеквизитов.Добавить(НоваяКолонка);
	ТЗ_рез.Колонки.Добавить("ФактическаяСебестоимость");
	
	Для Каждого ВидЦены Из Объект.ВидыЦен Цикл
		ИмяКолонки = СтрЗаменить(ВидЦены.ВидЦены.Наименование," ","_");
		НоваяКолонка = Новый РеквизитФормы(ИмяКолонки, ОТ, "ТаблицаУстановкаЦен",ВидЦены.ВидЦены.Наименование);
		МассивРеквизитов.Добавить(НоваяКолонка);
		ТЗ_рез.Колонки.Добавить(ИмяКолонки);
	КонецЦикла;
	ИзменитьРеквизиты(МассивРеквизитов);  
	
    ЗначениеВРеквизитФормы(ТЗ_рез, "ТаблицаУстановкаЦен");
	
    // Создаем на форме элементы управления
    // Т.е. выводим таблицу значений и ее колонки
	ЭлементТЗ = Элементы.Найти("ТаблицаУстановкаЦен");   
	Для Каждого Колонка ИЗ ТЗ_рез.Колонки Цикл
		Попытка
			НовыйЭлементФормы 				= Элементы.Добавить("ТаблицаУстановкаЦен"+Колонка.Имя, Тип("ПолеФормы"), ЭлементТЗ);
			НовыйЭлементФормы.Вид 			= ВидПоляФормы.ПолеВвода;
			НовыйЭлементФормы.ПутьКДанным 	= "ТаблицаУстановкаЦен." + Колонка.Имя;
		Исключение
		КонецПопытки;
	КонецЦикла;
Показать
28. ruziya 01.03.21 13:03 Сейчас в теме
Спасибо большое за статью! мне помогло.
Оставьте свое сообщение