Формирование внешнего отчета

Версия для печатиPDF-версия

Платформа:

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

В серверной процедуре макет получаете?

Делал по примеру другого, работающего по такой схеме, отчета. Но вообще почему-то не переходит с клиентской процедуры дальше
&НаКлиенте
Процедура Сформировать(Команда)
        
    СформироватьОтчетНаСервере();
    
КонецПроцедуры

&НаСервере
Процедура СформироватьОтчетНаСервере() Экспорт
    
    ДокументОбъект = РеквизитФормыВЗначение("Отчет");
    ПараметрыОтчета = ПодготовитьПараметрыОтчета();
    АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
    ДокументОбъект.СформироватьОтчет(ПараметрыОтчета, АдресХранилища);

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

&НаСервере
Функция ПодготовитьПараметрыОтчета()
    
    Выгрузка = ВыгрузитьЗапрос();
    
    ПараметрыОтчета = Новый Структура;
    ПараметрыОтчета.Вставить("Выгрузка"                , Выгрузка);
        
    Возврат ПараметрыОтчета;
    
КонецФункции

&НаСервере
Функция ВыгрузитьЗапрос()

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |     ТабеляСотрудников.Контрагент КАК Контрагент,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 1
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасЯнв,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 2
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасФев,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 3
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасМарт,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 4
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасАпр,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 5
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасМай,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 6
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасИюнь,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 7
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасИюль,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 8
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасАвг,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 9
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасСент,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 10
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасОкт,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 11
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасНояб,
        |    СУММА(ВЫБОР
        |            КОГДА МЕСЯЦ( ТабеляСотрудников.Период) = 12
        |                ТОГДА ЧАС( ТабеляСотрудников.КОплате) + МИНУТА( ТабеляСотрудников.КОплате) / 60
        |            ИНАЧЕ NULL
        |        КОНЕЦ) КАК ЧасДек
        |ИЗ
        |    РегистрНакопления. ТабеляСотрудников КАК  ТабеляСотрудников
        |
        |СГРУППИРОВАТЬ ПО
        |     ТабеляСотрудников.Контрагент
        |
        |УПОРЯДОЧИТЬ ПО
        |    Контрагент";

    РезультатЗапроса = Запрос.Выполнить();
    СпособОбхода = ОбходРезультатаЗапроса.Прямой;
    Выгрузка = РезультатЗапроса.Выгрузить(СпособОбхода);  
    
    Возврат Выгрузка;    
    
КонецФункции
 

А вот модуль объекта

 

Процедура СформироватьОтчет(Знач ПараметрыОтчета, АдресХранилища) Экспорт
    
    Результат = Новый ТабличныйДокумент;
            
    СформироватьОтчет_Часы(Результат, ПараметрыОтчета);
    
    ПоместитьВоВременноеХранилище(Новый Структура("Результат", Результат), АдресХранилища);
    
КонецПроцедуры

Процедура СформироватьОтчет_Часы(ТабличныйДокумент, ПараметрыОтчета)
    
    РезультатЗапроса = СформироватьЗапрос(ПараметрыОтчета);
    Выборка = РезультатЗапроса.Выбрать();
    Выборка.Следующий();     
    
    
    ТабличныйДокумент.Очистить();
    
    Макет = ПолучитьМакет("МакетОсн");
    
    ОбластьЗаголовок = Макет.ПолучитьОбласть("ОбластьЗаголовок");
    ОбластьШапка = Макет.ПолучитьОбласть("ОбластьШапка");
    ОбластьЗначения = Макет.ПолучитьОбласть("ОбластьЗначения");
    ОбластьИтог = Макет.ПолучитьОбласть("ОбластьИтог");
    
    ТабличныйДокумент.Очистить();
    ТабличныйДокумент.Вывести(ОбластьЗаголовок);
    ТабличныйДокумент.Вывести(ОбластьШапка);
    ТабличныйДокумент.НачатьАвтогруппировкуСтрок();
    
    Выборка = РезультатЗапроса.Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        ОбластьЗначения.Параметры.ЧасыЯнв = Выборка.ЧасЯнв;
            ОбластьЗначения.Параметры.ЧасыФев = Выборка.ЧасФев;
        ОбластьЗначения.Параметры.ЧасыМарт = Выборка.ЧасМарт;
        ОбластьЗначения.Параметры.ЧасыАпр = Выборка.ЧасАпр;
        ОбластьЗначения.Параметры.ЧасыМай = Выборка.ЧасМай;
        ОбластьЗначения.Параметры.ЧасыИюнь = Выборка.ЧасИюнь;
        ОбластьЗначения.Параметры.ЧасыИюль = Выборка.ЧасИюль;
        ОбластьЗначения.Параметры.ЧасыАвг = Выборка.ЧасАвг;
        ОбластьЗначения.Параметры.ЧасыСент = Выборка.ЧасСент;
        ОбластьЗначения.Параметры.ЧасыОкт = Выборка.ЧасОкт;
        ОбластьЗначения.Параметры.ЧасыНояб = Выборка.ЧасНояб;
        ОбластьЗначения.Параметры.ЧасыДек = Выборка.ЧасДек;
        ТабличныйДокумент.Вывести(ОбластьЗначения);
        
    КонецЦикла;
        
КонецПроцедуры
 

Зачем мудрить? Формируйте отчёт прямо в модуле формы. Если, конечно, не предполагается формирование отчёта из других об'ектов.
В модуле об'екта определена функция СформироватьЗапрос?
База серверная или файловая?

База Серверная.
В модуле объекта есть функция.

Хотел делать в модуле объекта потому, что не мог подцепить макет.

Как я понял - в таком режиме не получится отладчиком пробежаться по отчету (серверные процедуры) и надо самому понять где затык
 

Можно включить возможность отладки не сервере если есть доступ к реестру Windows.

каким образом?

Спасибо, нашел как в форме таки сделать
 

Единственно, что проблема вышла, что в результате запроса получаются не числовые значения... где-то видимо они преобразуются, а где - не понял. И не знаю, как определить явно, что в результате запроса должны быть ЧИСЛА
 

Попробуй в запросе вместо NULL поставить 0.

Да, тоже обратил на это внимание и всё заработало. У меня не всегда есть значение в таблице
 

Спасибо. Благодаря вашим советам дело пошло. Отчет постоянно дорабатываю, буквально каждую его часть, потом еще надо будет оптимизировать, но без подцепки макета было бы сложнее намного