Проект

Общее

Профиль

Фоновое формирование отчета СКД на УФ средствами БСП

Иточник

http://1c.ruboard.ru/public/622567/

Итак. Сам алгоритм, исполняемый в фоновом задании, размещается в модуле менеджера целевого отчета. Тут все просто и никакой магии:

Процедура ВыполнитьКомпоновкуВФоне(СтруктураНастроек, АдресРезультатаВоВременномХранилище) Экспорт

    ТабличныйДокументРезультат = Новый ТабличныйДокумент;
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;

    Отчет = Отчеты[СтруктураНастроек.ИмяОтчета].Создать();
    Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.СхемаКомпоновкиДанных));
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(СтруктураНастроек.НастройкиКомпоновщика);
    Отчет.СкомпоноватьРезультат(ТабличныйДокументРезультат, ДанныеРасшифровки);

    ПоместитьВоВременноеХранилище(ДанныеРасшифровки, СтруктураНастроек.АдресДанныхРасшифровки);
    ПоместитьВоВременноеХранилище(ТабличныйДокументРезультат, АдресРезультатаВоВременномХранилище);

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

Нужно перехватить событие компоновки на клиенте. К сожалению, человеческого способа это сделать нет. Придется подсовывать свою команду вместо стандартной. Отключаем в доступных командах отчета штатное "Сформировать", выводим на форму кнопку со своей командой. Оформляем, чтобы выглядела аналогично.

&НаКлиенте
Процедура Сформировать(Команда)

    ФоновоеФормированияОтчета = ЗапускФормированияОтчетаСервер();
    Если ФоновоеФормированияОтчета <> Неопределено Тогда
        НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
        ОбработчикЗавершения = Новый ОписаниеОповещения("ЗавершениеФоновогоФормированияОтчетаКлиент", ЭтотОбъект);
        ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеФормированияОтчета, ОбработчикЗавершения, НастройкиОжидания);
    КонецЕсли;    

КонецПроцедуры
&НаСервере
Функция ЗапускФормированияОтчетаСервер()

    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    МетаданныеОтчета = ОтчетОбъект.Метаданные();
    ИмяОтчета = МетаданныеОтчета.Имя;

    Если НЕ Метаданные.Отчеты.Содержит(МетаданныеОтчета) Тогда // если отчет внешний, то выполняем компоновку стандартно
        СкомпоноватьРезультат();
        Возврат Неопределено;
    КонецЕсли;

    Если ПустаяСтрока(ДанныеРасшифровки) Тогда
        ДанныеРасшифровки = ПоместитьВоВременноеХранилище(Новый ДанныеРасшифровкиКомпоновкиДанных, УникальныйИдентификатор);
    КонецЕсли;

    ПараметрыФормирования = Новый Структура;
    ПараметрыФормирования.Вставить("ИмяОтчета", ИмяОтчета);
    ПараметрыФормирования.Вставить("АдресДанныхРасшифровки", ДанныеРасшифровки);
    ПараметрыФормирования.Вставить("НастройкиКомпоновщика", Отчет.КомпоновщикНастроек.ПолучитьНастройки());

    НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);

    Возврат ДлительныеОперации.ВыполнитьВФоне(СтрШаблон("Отчеты.%1.ВыполнитьКомпоновкуВФоне", ИмяОтчета), ПараметрыФормирования, НастройкиЗапуска);

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

обработчик результата фонового задания (замечу, что данные расшифровки уже были положены по нужному адресу еще в фоновом задании, поэтому осталось получить только табличный документ):

&НаКлиенте
Процедура ЗавершениеФоновогоФормированияОтчетаКлиент(РезультатФоновойЗадачи, ДополнительныеПараметры) Экспорт

    Если РезультатФоновойЗадачи <> Неопределено И РезультатФоновойЗадачи.Статус = "Выполнено" Тогда
        Результат = ПолучитьИзВременногоХранилища(РезультатФоновойЗадачи.АдресРезультата);
        Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
        Элементы.Результат.ОтображениеСостояния.Текст = "";
    КонецЕсли;

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