Установка собственных значений полей при программном выводе отчета СКД по имени поля (по принципу "как в макете")

Программирование - Практика программирования

СКД

8
При программном выводе отчета на СКД возникает задача заполнить поля своими значениями. Но при поэлементном выводе отчета параметры "обезличены" как П1, П2, П3, ... Как узнать в какое "П" содержит нужное поле и куда устанавливать значение? Статья поможет программистам начинающим освоение СКД и перешедшим на СКД с "макета" ответить на эти вопросы на примере готового решения.

При всей мощи и гибкости СКД возникают ситуации когда она бессильна в получении требуемой информации. В то же время, её богатые возможностей вывода нужны, нам бы только заменить значения некоторых полей при выводе на свои. Эта задача компактно решается при выводе макета и при выводе СКД хочется сделать так же, но не тут-то было.

Обычно возникает необходимость присвоить свои значения полям наборов данных и вычисляемым полям при выводе отчета:

Но при выводе через процессор компоновки параметры зашифрованы как "П1", "П2", "П3", ... и информации об именах полей СКД не содержат вовсе:

Информацию о полях можно получить из параметров "Описания области макета области макета компоновки данных" макета компоновки данных. Прекрасно, имена полей там есть в параметрах расшифровки, но разобраться в этой инкапсуляции смерти кащеевой с первого раза быстро не получается.

Для решения этой проблемы создана функция получающая массив имен параметров макета по имени поля СКД.

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

		КонецЦикла;
		
		СтруктураКэшированияПараметров.Вставить(ИмяМакета, ИменаПараметров);
	КонецЕсли;
	
	Возврат ИменаПараметров;
КонецФункции

Пример применения функции при программном выводе отчета: 

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
	СтандартнаяОбработка = Ложь;
		
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки,,);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;		
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных, ,ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	ПроцессорВывода.НачатьВывод();

	ЭлементРезультата = ПроцессорКомпоновки.Следующий();

//==Структура для кэширования имен параметров в макете
	КэшИменПараметровМакетов = Новый Структура;
	
	Пока ЭлементРезультата <> Неопределено Цикл

		Если ЭлементРезультата.ЗначенияПараметров.Количество() > 0 Тогда
//==Установка наших значений параметров
			МассивИменПараметров = ПолучитьИменаПараметровВМакетеКомпоновкиПоИмениПоля("ИмяПоляСКД", ЭлементРезультата.Макет, МакетКомпоновкиДанных, КэшМакетов);

			Для Каждого ИмяПараметра из МассивИменПараметров Цикл
				ЭлементРезультата.ЗначенияПараметров[ИмяПараметра].Значение = "Наше значение поля СКД"
			КонецЦикла
//==Конец
		КонецЕсли;
		
	    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
	    ЭлементРезультата = ПроцессорКомпоновки.Следующий();

	КонецЦикла;

	ПроцессорВывода.ЗакончитьВывод()

КонецПроцедуры

 

8

См. также

Специальные предложения

Избранное Подписка Сортировка: Древо
В этой теме еще нет сообщений.
Оставьте свое сообщение