понедельник, 13 октября 2014 г.

Программный вывод отчета и установка настроек

Программный вывод отчета СКД и установка настроек




Вывод отчета в Таблицу значений или Дерево значений:


        Настройки = КомпоновщикНастроек.ПолучитьНастройки();

       
// Отключение вывода общих итогов
       
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ГоризонтальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
       
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);

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

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

       
// Дерево значений, в которую будет получен результат
       
Результат = Новый ДеревоЗначений;

       
// Получение результата
       
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
       
ПроцессорВывода.ОтображатьПроцентВывода = Истина;
       
ПроцессорВывода.УстановитьОбъект(Результат);

       
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

Вывод отчета в табличный документ:

ТабличноеПолеРезультат.Очистить();

   
ЭтотОбъект = РеквизитФормыВЗначение("Объект");
   
СхемаКомпоновкиПродажи = ЭтотОбъект.ПолучитьСхемуПродажи();

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

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

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

   
ПроцессорВывода.УстановитьДокумент(ТабличноеПолеРезультат);

   
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

Функция ПолучитьСхемуПродажи() Экспорт
    Возврат
ПолучитьМакет("Продажи");
КонецФункции

Пример установки параметров:

    ПериодОтчета = Новый СтандартныйПериод;
    ПериодОтчета.ДатаНачала     = НачалоДня(НачалоДня(ТекущаяДата()) - (44*3600*24));
   
ПериодОтчета.ДатаОкончания  = КонецДня(ТекущаяДата());

   
//устанавливаем параметры тербования выгрузки по периоду 45 дней
   
Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодОтчета"), ПериодОтчета);

Пример установки пользовательской настройки: 

Важно, пользовательская настройка доступна только в ПриОткрытии


    ПериодОтчета = Новый СтандартныйПериод;
   
ПериодОтчета.ДатаНачала     = НачалоДня(НачалоДня(ТекущаяДата()) - (44*3600*24));
   
ПериодОтчета.ДатаОкончания  = КонецДня(ТекущаяДата());

   
ИдентификаторПользНастройки = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.ПолучитьИдентификаторПоОбъекту(Отчет.КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодОтчета")));
   
ПараметрПользовНастройки    = Отчет.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(ИдентификаторПользНастройки);

    Если Не
ПараметрПользовНастройки = Неопределено Тогда

       
ПараметрПользовНастройки.Значение = ПериодОтчета;

    КонецЕсли;

Еще один пример (Важно, пользовательская настройка доступна только в ПриОткрытии):

ПриОткрытии - это клиентское событие.
Лучше использовать событие таблицы связанной со списком ПриЗагрузкеПользовательскихНастроекНаСервере или ПередЗагрузкойПользовательскихНастроекНаСервере.

Нашол только такое решение и работает только вот так:

&НаСервере
Процедура СписокПриЗагрузкеПользовательскихНастроекНаСервере(Элемент, Настройки)


    
ПользовательскийОтбор = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы.Найти(Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
    
ПользовательскийОтбор.Элементы.Очистить();

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

   
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ;

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

Если пробовать очистить Настройки.ДополнительныеНастройки.Элементы.Очистить(); получим опять ошибку о связке настроек.

Пример программной подмены макетов СКД при компоновке результата, с сохранением пользовательских настроек:


Процедура УстановитьНовыйШаблонСКД(ИмяМакета)

   
//сохраняем значения предыдущих параметров
   
Настройки               = КомпоновщикНастроек.ПолучитьНастройки();
   
ПериодОтчета            = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодОтчета"));
   
Поставщик               = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Поставщик"));
   
ДополнительныйРеквизит  = Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДополнительныйРеквизит"));

   
//обновляем схему и устанавливаем новые настройки
   
СхемаКомпоновкиДанных = ПолучитьМакет(ИмяМакета);
   
КомпоновщикНастроек.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);
   
КомпоновщикНастроек.Восстановить();

   
//устанавливаем параметры которые были указаны пользователем
   
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ПериодОтчета"), ПериодОтчета.Значение);
   
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Поставщик"), Поставщик.Значение);
   
КомпоновщикНастроек.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ДополнительныйРеквизит"), ДополнительныйРеквизит.Значение);

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

Процедура
ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)

   
СтандартнаяОбработка = Ложь;

   
МассивОтчетов = Новый Массив();
   
МассивОтчетов.Добавить(Новый Структура("ИмяОтчета, ИмяЛиста, ТаблицаВывода", "КаталогТовары",       "FS_Heinz_Products",    Новый ТабличныйДокумент));
   
МассивОтчетов.Добавить(Новый Структура("ИмяОтчета, ИмяЛиста, ТаблицаВывода", "ТРТ",                 "FS_Heinz_Outlets",     Новый ТабличныйДокумент));
   
МассивОтчетов.Добавить(Новый Структура("ИмяОтчета, ИмяЛиста, ТаблицаВывода", "ПродажиОсновные",     "FS_Heinz_Dispatch",    Новый ТабличныйДокумент));
   
МассивОтчетов.Добавить(Новый Структура("ИмяОтчета, ИмяЛиста, ТаблицаВывода", "ОстаткиПоПериодам",   "FS_Heinz_Stock",       Новый ТабличныйДокумент));

    Для Каждого
ВидОтчета Из МассивОтчетов Цикл

       
УстановитьНовыйШаблонСКД(ВидОтчета.ИмяОтчета);

        Если
ОтображатьРезультатНаФорме Тогда

           
//вывод отчета на форму
           
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
           
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
           
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки,,,Тип("ГенераторМакетаКомпоновкиДанных"));

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

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

           
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);

           
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

        КонецЕсли;

       
//обработка вывода в служебные таблицы
       
Настройки = КомпоновщикНастроек.ПолучитьНастройки();

       
// Отключение вывода заголовка, параметров и отборов
       
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьЗаголовок", ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
       
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьПараметрыДанных", ТипВыводаТекстаКомпоновкиДанных.НеВыводить);
       
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьОтбор", ТипВыводаТекстаКомпоновкиДанных.НеВыводить);

       
// Отключение вывода общих итогов
       
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ГоризонтальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);
       
Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкиДанных.Нет);

       
//вывод отчета в Таблицу вывода
       
Если ВидОтчета.ИмяОтчета = "ОстаткиПоПериодам" Тогда

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

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

           
// Дерево значений, в которую будет получен результат
           
Результат = Новый ДеревоЗначений;

           
// Получение результата
           
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
           
ПроцессорВывода.ОтображатьПроцентВывода = Истина;
           
ПроцессорВывода.УстановитьОбъект(Результат);

           
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

           
ТаблицаВывода = ВидОтчета.ТаблицаВывода;
           
ТаблицаВывода.Область("R1C1").Текст         = "Дата";
           
ТаблицаВывода.Область("R1C2").Текст         = "Фирма";
           
ТаблицаВывода.Область("R1C3").Текст         = "Артикул товара";
           
ТаблицаВывода.Область("R1C4").Текст         = "Код склада";
           
ТаблицаВывода.Область("R1C5").Текст         = "Кол.";
           
ТаблицаВывода.Область("R1C1").ШиринаКолонки = 12;
           
ТаблицаВывода.Область("R1C2").ШиринаКолонки = 12;
           
ТаблицаВывода.Область("R1C3").ШиринаКолонки = 14;
           
ТаблицаВывода.Область("R1C4").ШиринаКолонки = 17;
           
ТаблицаВывода.Область("R1C5").ШиринаКолонки = 12;

           
СчетчикСтроки = 1;
            Для Каждого
СтрокиГруппировкиПериоды Из Результат.Строки Цикл //->группировка ""

               
Для Каждого СтрокиДетали Из СтрокиГруппировкиПериоды.Строки Цикл

                   
СчетчикСтроки = СчетчикСтроки + 1;
                   
ТаблицаВывода.Область("R"+Формат(СчетчикСтроки, "ЧГ=")+"C1").Текст = Формат(СтрокиГруппировкиПериоды.Дата, "ДФ=dd.MM.yyyy");
                   
ТаблицаВывода.Область("R"+Формат(СчетчикСтроки, "ЧГ=")+"C2").Текст = СтрокиДетали.Фирма;
                   
ТаблицаВывода.Область("R"+Формат(СчетчикСтроки, "ЧГ=")+"C3").Текст = СтрокиДетали.Код;
                   
ТаблицаВывода.Область("R"+Формат(СчетчикСтроки, "ЧГ=")+"C4").Текст = СтрокиДетали.КодСклада;
                   
ТаблицаВывода.Область("R"+Формат(СчетчикСтроки, "ЧГ=")+"C5").Текст = СтрокиДетали.ВНаличииКонечныйОстаток;

                КонецЦикла;

            КонецЦикла;
//<- data-blogger-escaped-br="">
       
Иначе

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

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

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

           
ПроцессорВывода.УстановитьДокумент(ВидОтчета.ТаблицаВывода);

           
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);

        КонецЕсли;

    КонецЦикла;

   
АдресХранилища = ПоместитьВоВременноеХранилище(МассивОтчетов); //поместить результат для обработки на клиенте

   
МассивОтчетов = Неопределено; //разрушим объект

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




Комментариев нет:

Отправить комментарий