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