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

10.10.13

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

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

Скачать файл

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

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

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

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

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

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

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

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

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

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

 

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

См. также

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

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

23.06.2024    7443    bayselonarrend    20    

154

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

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

13.03.2024    5942    dsdred    16    

80

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

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

24.01.2024    17666    YA_418728146    26    

71

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

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11222    dsdred    44    

130

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

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

06.10.2023    23757    SeiOkami    48    

135

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

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

14.09.2023    18828    human_new    27    

80

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

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

28.08.2023    14729    YA_418728146    7    

166
Вознаграждение за ответ
Показать полностью
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
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. Светлый ум 415 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 Сейчас в теме
Спасибо большое за статью! мне помогло.
Оставьте свое сообщение