среда, 27 июля 2011 г.

Вывод параметров и результата в разных СКД

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

Процедура СформироватьОтчет()

    НаборДанных = ПолучитьНаборДанных();
    ВывестиНаборДанных(НаборДанных);

КонецПроцедуры
 
Функция ПолучитьНаборДанных()

    // Установка параметров формирования
    УстановитьПараметр("НачалоПериода", НачалоДня(НачалоПериода));
    УстановитьПараметр("КонецПериода", КонецДня(КонецПериода));

    // Вывод результата в таблицу значений
    КомпоновщикНастроек.Настройки.Структура[0].Использование = Истина;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;

    НаборДанных = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(НаборДанных);

    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(ОтчетОбъект.СхемаКомпоновкиДанных,
        ЭтотОбъект.КомпоновщикНастроек.Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

    ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);

    // {{ вывод результата в табличный документ
    КомпоновщикНастроек.Настройки.Структура[0].Использование = Ложь; 
    Настройки = ЭтотОбъект.КомпоновщикНастроек.Настройки;

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки,, ДанныеРасшифровки);

    ЭлементыФормы.ДокументРезультат.Очистить();

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    // }} вывод результата в табличный документ

    Возврат НаборДанных;

КонецФункции


Процедура ВывестиНаборДанных(НаборДанных);

    ВнешниеНаборыДанных = Новый Структура;
    ВнешниеНаборыДанных.Вставить("НаборДанных", НаборДанных);

    СхемаКомпоновкиДанныхДляВывода = ПолучитьМакет("МакетДляВывода");
    Настройки = СхемаКомпоновкиДанныхДляВывода.НастройкиПоУмолчанию;

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    ДанныеРасшифровки.Настройки = Настройки;

    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанныхДляВывода, Настройки, ДанныеРасшифровки);

    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);

    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ЭлементыФормы.ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

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

1 комментарий: