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

10.10.13

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Простейшая консоль запросов на УФ
.epf 6,70Kb
65
65 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

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

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

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

 

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

См. также

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

В платформе 8.3.27 появилась возможность использовать WebSocket-клиент. Давайте посмотрим, как это все устроено и чем оно нам полезно.

14.01.2025    5853    dsdred    42    

91

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

Эта небольшая статья - некоторого рода шпаргалка по файловым потокам: как и зачем с ними работать, какие преимущества это дает.

23.06.2024    10053    bayselonarrend    21    

161

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

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    7211    dsdred    18    

81

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

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    23336    YA_418728146    30    

73

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

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    25371    SeiOkami    48    

136
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sapozhnikovfa 1 13.06.14 15:09 Сейчас в теме
спасибо! очень помогло :)
RomanKod; +1 Ответить
17. пользователь 29.05.18 20:28
Сообщение было скрыто модератором.
...
2. pavel_pss 290 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 4 22.06.15 13:08 Сейчас в теме
А как добавлять колонки к уже имеющейся ТЗ на форме, с "жестко определенным набором" колонок?
10. Norder 29.06.15 12:06 Сейчас в теме
11. simplysimply 22 13.11.15 13:19 Сейчас в теме
Спасибо. Действительно пригодилось.
12. Светлый ум 454 07.09.16 10:21 Сейчас в теме
Не хватает быстрого выбора параметров, в поле справа
13. udmitriy 08.09.16 06:49 Сейчас в теме
Полезная статья, только нужно (так как тип хранилищезначений не прокатит) изменитьреквизиты поместить в цикл добавления в массив( в новый массив) значений, с оператором попытки
Чтото вроде
......
для каждого колонка из тз_рез.колонка цикл
Массив= новый массив;
Массив.добавить(новый реквизитформы(...
Попытка
Изменитьреквизиты(массив);
Исключение
Конецпопытки;
Конеццикла;
Конецесли;
Значениевреквизитформы(....,"ТЗ");
Приемник=реквизитформывзначение("ТЗ");
элтз=элементы.тз
Для каждого колонка из приемник.колонки цикл
.....
Показать
14. VladC# 65 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 Сейчас в теме
Спасибо большое за статью! мне помогло.
Оставьте свое сообщение