Как выполнить отчет на СКД через COM и получить данные отчета?

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

59
Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

Общий подход к созданию объектов через COM рассмотрен здесь

Задача. Нужно получить начисления по сотрудникам заданного подразделения из базы ЗиУП.

Так выглядит получение данных в обычном режиме:  

    МесяцРасчета = Дата(2018,03,01);
    
    //Програмное формирование отчета СКД    
    СхемаОст = Отчеты.АнализНачисленийРаботникамОрганизаций.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    КомпоновщикНастроекНастройки = Новый КомпоновщикНастроекКомпоновкиДанных;
    КомпоновщикНастроекНастройки.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаОст));
    КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаОст.НастройкиПоУмолчанию);
    
    КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(МесяцРасчета));
    КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(МесяцРасчета));
    
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОст, КомпоновщикНастроекНастройки.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
    
    ДанныеТЗ = Новый ТаблицаЗначений;
    ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);   

    ЗП = 0;
    ПодразделениеПроизводство = Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000005");
    Для каждого СтрокаТаблицы из ДанныеТЗ Цикл
        Если не ЗначениеЗаполнено(СтрокаТаблицы.ВидРасчета) Тогда
            Продолжить;
        КонецЕсли;
        
        Если СтрокаТаблицы.ПодразделениеОрганизации = ПодразделениеПроизводство  Тогда
            ЗП = ЗП + СтрокаТаблицы.Начислено;
        КонецЕсли;
    КонецЦикла; 

  

Так выглядит получение данных через COM:   

  //ЗУП - Com - соединение. Как подключиться сказано здесь - //itshnik22.ru/public/164976/
    
    МесяцРасчета = Дата(2018,03,01);   
    
    СхемаКомпоновкиДанных = ЗУП.Отчеты.АнализНачисленийРаботникамОрганизаций.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
    
    КомпоновщикНастроекНастройки = ЗУП.NewObject("КомпоновщикНастроекКомпоновкиДанных");
    ИсточникДоступныхНастроекКомпоновкиДанных =  ЗУП.NewObject("ИсточникДоступныхНастроекКомпоновкиДанных",СхемаКомпоновкиДанных);
    КомпоновщикНастроекНастройки.Инициализировать(ИсточникДоступныхНастроекКомпоновкиДанных);
    КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаКомпоновкиДанных.НастройкиПоУмолчанию);    
    
    
    КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(МесяцРасчета));
    КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(МесяцРасчета));
    
    КомпоновщикМакета = ЗУП.NewObject("КомпоновщикМакетаКомпоновкиДанных");
    МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроекНастройки.Настройки,,,ЗУП.NewObject("ОписаниеТипов", "ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений").Типы().Получить(0));
    ПроцессорКомпоновкиДанных = ЗУП.NewObject("ПроцессорКомпоновкиДанных");
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
    
    ПроцессорВывода = ЗУП.NewObject("ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений");
    
    ДанныеТЗ = ЗУП.NewObject("ТаблицаЗначений");
    
    ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);     
    
    ЗП = 0;
     ПодразделениеУИД =ЗУП.XMlСтрока(ЗУП.Справочники.ПодразделенияОрганизаций.НайтиПоКоду("000000005"));
    Для каждого СтрокаТаблицы из ДанныеТЗ Цикл
        Если не ЗУП.ЗначениеЗаполнено(СтрокаТаблицы.ВидРасчета) Тогда
            Продолжить;
        КонецЕсли;
        
        Если ЗУП.XMlСтрока(СтрокаТаблицы.ПодразделениеОрганизации) = ПодразделениеУИД Тогда // сравнить элементы справочника в СОМ подключении можно только так
            ЗП = ЗП + СтрокаТаблицы.Начислено;
        КонецЕсли;
    КонецЦикла;   

 

59

См. также

Автор запретил комментарии