gifts2017

Программный вывод таблицы значений на управляемую форму 8.2

Опубликовал Андрей Коваль (hiduk) в раздел Программирование - Работа с интерфейсом

Обработка демонстрирует пример вывода таблицы значений с произвольной структурой на управляемую форму 8.2. Вывод таблицы реализован в виде отдельной процедуры, в которую таблица значений передается в качестве параметра. Это позволяет встроить её в общий модуль, и удобно использовать при необходимости.

Внешняя обработка. Таблица значений добавлена в реквизиты и элементы формы (для размещения на форме в нужном месте). Структура таблицы не определена (колонок нет). Вывод осуществляется одной процедурой, в качестве параметра в которую передаётся таблица значений. Дополнительно можно для созданной таблицы определить обработчики событий.

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

Наименование Файл Версия Размер
Программный вывод ТЗ на форму 278
.epf 7,33Kb
21.06.13
278
.epf 7,33Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Евгений (Algiz) 22.06.13 23:42
Код в одну процедуру можно было и без обработки выложить...если уж выкладываете
2. al petrov (petrov_al) 24.06.13 09:21
Можно подробнее, алгоритм что вы используете?
3. Андрей Коваль (hiduk) 24.06.13 10:29
(2) petrov_al,

&НаСервере
Процедура ВывестиТаблицуНаФорму(УФ,ИмяТЗНаФорме,ТЗ, ТЗОбработчиковСобытий = Неопределено) Экспорт
	
	// СОЗДАНИЕ РЕКВИЗИТОВ ФОРМЫ
	МассивДобавляемыхРеквизитов = Новый Массив; 
	
	Для Каждого Колонка Из ТЗ.Колонки Цикл
		МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяТЗНаФорме ,Колонка.Заголовок));	
	КонецЦикла; 
	
	МассивУдаляемыхРеквизитов = УФ.ПолучитьРеквизиты(ИмяТЗНаФорме);
	МассивИменУдаляемыхРеквизитов = Новый Массив;
	
	Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
		МассивИменУдаляемыхРеквизитов.Добавить(ИмяТЗНаФорме + "." + Элемент.Имя);
	КонецЦикла; 
	
	УФ.ИзменитьРеквизиты(МассивДобавляемыхРеквизитов,МассивИменУдаляемыхРеквизитов); 
	
	// СОЗДАНИЕ ЭЛЕМЕНТОВ ФОРМЫ
	Для каждого Элемент Из МассивУдаляемыхРеквизитов Цикл
		УдаляемыйЭлемент = УФ.Элементы.Найти(ИмяТЗНаФорме + Элемент.Имя);
		УФ.Элементы.Удалить(УдаляемыйЭлемент);
	КонецЦикла; 
	
	Для Каждого Колонка Из ТЗ.Колонки Цикл
		НоваяКолонка = УФ.Элементы.Добавить(ИмяТЗНаФорме + Колонка.Имя, Тип("ПолеФормы"), УФ.Элементы[ИмяТЗНаФорме]); 
		НоваяКолонка.Заголовок = Колонка.Заголовок; 
		НоваяКолонка.ПутьКДанным = ИмяТЗНаФорме + "." + Колонка.Имя;
		НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; 
		НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;    
	КонецЦикла; 	
	
	УФ[ИмяТЗНаФорме].Загрузить(ТЗ);
	
	// Привязка обработчиков событий
	Если ТЗОбработчиковСобытий = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	
	Для Каждого Строка Из ТЗОбработчиковСобытий Цикл
		УФ.Элементы[Строка.ИмяЭлемента].УстановитьДействие(Строка.ИмяСобытия, Строка.ИмяЭлемента + Строка.ИмяСобытия); 
	КонецЦикла;	
	
КонецПроцедуры
...Показать Скрыть
lost-s0u1; jura_t_vega; Annita; абв-вба; dusha0020; balbesinka; Lena272; gigapevt; tolyan_ekb; Styvi; Ulfhedhinn; KRJ; acanta; ikar-nikolay; dour-dead; Evmil; pchelkatoo; petrov_al; +18 Ответить 1
4. Никита Грызлов (nixel) 26.06.13 13:59
Типовое создание элементов/реквизитов управляемой формы.
В чем уникальность публикации? Или просто как визуализация книжек по упр. интерфейсу?
5. Андрей Коваль (hiduk) 26.06.13 14:39
Уникальности никакой нет, на неё и не претендую. Обработка находится в нужное время, в нужном месте, пользуется спросом. У самого на днях стояла такая задача. Пришлось порыться в интернете, литературы под рукой не было. На инфостарте не нашел.

Особенностью обработки считаю универсальную процедуру, т.к. в инете есть примеры с конкретной структурой.
6. Евгений Тимошенко (morfeus) 07.11.13 05:40
(5) hiduk, Большое спасибо за помощь!!! В 82 из мелочи любят выдумывать сложности. Туда сюда гонять реквизиты и т д. Не понимаю зачем так заморачиваться... Сам не додумался. Большое спасибо! Получилось с вашей помощью !!!!
7. Dima Dima (bayce) 05.01.14 15:01
Код очень универсальный получился.
Очень удобно.
8. Степашка Никулин (Styvi) 06.02.14 12:43
Спасибо за готовое решение...
Скопировал код, буду использовать в ближайшее время - ибо пока обходился без заполнения таблиц на УФ...
9. program program (prodines) 10.02.14 11:38
Я пробовал вышеуказанный код - у меня не работало удаление таблицы значений из управляемой формы. В итоге сделал свою модификацию:

Удаление таблицы значений из управляемой формы

Удалять реквизиты таблицы значений нет нужды - достаточно удалить саму таблицу значений.

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


Ну и до кучи - процедура вывода таблицы значений на управляемую форму:

&НаСервере
Процедура _ПечатьТЗ_УФ(ТЗ, Форма, НомерТЗ="1") Экспорт
//http://bilbo.com.ua/tablitsa-znacheniy-v-upravlyaemoy-forme.html	

УдалитьТЗ(Форма, НомерТЗ); //моё добавление

//Имеем исходную таблицу значений с именем "ТЗ"
//Добавляем реквизит формы
ИмяТЗ = "МояТаблицаЗначений" + НомерТЗ;
МассивРеквизитов = Новый Массив;
МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяТЗ, Новый ОписаниеТипов("ТаблицаЗначений"), "", ИмяТЗ));

Для Каждого Колонка Из ТЗ.Колонки Цикл
	МассивРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, ИмяТЗ, Колонка.Заголовок)); 
КонецЦикла;

Форма.ИзменитьРеквизиты(МассивРеквизитов);

//Помещаем Элементы на форму 
Таблица = Форма.Элементы.Добавить(ИмяТЗ, Тип("ТаблицаФормы")); 
Таблица.ПутьКДанным = ИмяТЗ; 
Таблица.Отображение = ОтображениеТаблицы.Список; 

Для Каждого Колонка Из ТЗ.Колонки Цикл

	НовыйЭлемент = Форма.Элементы.Добавить(ИмяТЗ + "_" + Колонка.Имя, Тип("ПолеФормы"), Таблица); 
	НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; 
	НовыйЭлемент.ПутьКДанным = ИмяТЗ + "." + Колонка.Имя;

КонецЦикла;

//переносим таблицу значений на форму 
Форма.ЗначениеВРеквизитФормы(ТЗ,ИмяТЗ);
	
КонецПроцедуры
...Показать Скрыть
detro; lost-s0u1; Steelvan; Valerich; kostyaomsk; mangy; Styvi; +7 Ответить
10. Анатолий Бычин (tolyan_ekb) 20.03.14 13:58
Можно ли в добавленной таблице вызвать процедуру ПриАктивацииСтроки и т.п.?
11. Aleksandr Filonov (AleksSF) 29.03.14 11:06
Здравствуйте.
А как сделать группы. Ну чтобы при отображении на форме несколько колонов были объединены в Группу колонок.
12. Андрей Коваль (hiduk) 03.04.14 10:42
(10) tolyan_ekb, Можно наверное:) Попробуйте определить переменную ТЗОбработчиковСобытий как ТЗ. Добавить туда строку, колонка ИмяСобытия = "ПриАктивацииСтроки". А в модуле формы определить процедуру с именем "ИмяТаблицы" + "ПриАктивацииСтроки". В общем поройте в этом направлении.
13. Андрей Коваль (hiduk) 03.04.14 10:43
(11) AleksSF, Добрый день! Группы сделать можно, но сложно:)
14. Aleksandr Filonov (AleksSF) 04.04.14 08:02
(13) hiduk,
Повозился немного и сделал. В принципе не так сложно.
Но я делал для своей конфы, поэтому не доводил ее до универсальности.
Если интересно могу прислать.
15. Илья Парамонов (Crush) 22.05.14 10:19
Спасибо! Программно добавил колонки в тз и долго мучился с выводом их на форму. Постоянно была Ошибка при установке значения атрибута контекста (ПутьКДанным) по причине: Недопустимое значение.

Оказалось что перед добавлением элементов формы нужно еще реквизиты формы добавить (ИзменитьРеквизиты).

Если бы в коде (3) была проверка на ПрограммноСозданныйРеквизит да и еще для внешней обработки, то юзал бы Ваш код "as is":)
16. Андрей Коваль (hiduk) 18.07.14 11:46
Раз уж используете данный материал, стоит заглянуть и сюда: http://infostart.ru/public/171514/. Там больше примеров. Но они сложнее для понимания.
18. program program (prodines) 21.04.15 15:54
Я немного подправил код вывода ТЗ: ранее он позволял вывести на управляемую форму только одну таблицу значений. Либо нужно было удалять сначала одноимённую ТЗ. Теперь ничего удалять не надо, и можно выводить на форму сколько угодно ТЗ, причём процедура принимает только один параметр - саму таблицу значений и ничего лишнего:

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


Но ещё интереснее было бы печатать таблицу значений в независимый табличный документ. Как бы это сделать?
Undred; timeforlive; +2 Ответить
19. Осипов Сергей (fixin) 03.02.16 18:46
Спасибо за обработку, очень удобнов вставлять и юзать. Даже внутрь не лазил процедур, юзал как функцию.

Если у таблицы тип содержит массив, не выводится.

Пришлось сделать проверку, ну и потом добавление колонок в попытке-исключении.

	Для Каждого Колонка Из ТЗ.Колонки Цикл
		Если Колонка.ТипЗначения.СодержитТип(Тип("Массив")) Тогда
			Продолжить;
		КонецЕсли;
		МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения,ИмяТЗНаФорме ,Колонка.Заголовок));	
	КонецЦикла; 

...
	Для Каждого Колонка Из ТЗ.Колонки Цикл
		НоваяКолонка = УФ.Элементы.Добавить(ИмяТЗНаФорме + Колонка.Имя, Тип("ПолеФормы"), УФ.Элементы[ИмяТЗНаФорме]); 
		НоваяКолонка.Заголовок = Колонка.Заголовок; 
		Попытка
		НоваяКолонка.ПутьКДанным = ИмяТЗНаФорме + "." + Колонка.Имя;
		Исключение КонецПопытки;
		НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; 
		НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе;    
	КонецЦикла; 
...Показать Скрыть


Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа