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

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

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

В наличии

Функционал данного механизма служит для программного вывода «Таблицы значений» в реквизит управляемой  формы с типом «ДанныеФормыКоллекция». Может быть полезен в задачах, где состав колонок выгружаемой таблицы значений может меняться.

Категория:

Описание

Механизм предусматривает работу как с реквизитом объекта, так и с реквизитом формы.

 

И по сути является аналогом метода обычных форм:

СоздатьКолонки()

Также реализована возможность быстрого добавления колонки «Отметка» и настройки доступности кнопок полей. Процедура должна быть размещена в модуле формы.

 

Пример вызова:

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

 

has been added to your cart:
Оформление заказа