Фоновое формирование отчета СКД на УФ средствами БСП¶
Иточник
http://1c.ruboard.ru/public/622567/
Итак. Сам алгоритм, исполняемый в фоновом задании, размещается в модуле менеджера целевого отчета. Тут все просто и никакой магии:
Процедура ВыполнитьКомпоновкуВФоне(СтруктураНастроек, АдресРезультатаВоВременномХранилище) Экспорт
ТабличныйДокументРезультат = Новый ТабличныйДокумент;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
Отчет = Отчеты[СтруктураНастроек.ИмяОтчета].Создать();
Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.СхемаКомпоновкиДанных));
Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(СтруктураНастроек.НастройкиКомпоновщика);
Отчет.СкомпоноватьРезультат(ТабличныйДокументРезультат, ДанныеРасшифровки);
ПоместитьВоВременноеХранилище(ДанныеРасшифровки, СтруктураНастроек.АдресДанныхРасшифровки);
ПоместитьВоВременноеХранилище(ТабличныйДокументРезультат, АдресРезультатаВоВременномХранилище);
КонецПроцедуры
Нужно перехватить событие компоновки на клиенте. К сожалению, человеческого способа это сделать нет. Придется подсовывать свою команду вместо стандартной. Отключаем в доступных командах отчета штатное "Сформировать", выводим на форму кнопку со своей командой. Оформляем, чтобы выглядела аналогично.
&НаКлиенте
Процедура Сформировать(Команда)
ФоновоеФормированияОтчета = ЗапускФормированияОтчетаСервер();
Если ФоновоеФормированияОтчета <> Неопределено Тогда
НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
ОбработчикЗавершения = Новый ОписаниеОповещения("ЗавершениеФоновогоФормированияОтчетаКлиент", ЭтотОбъект);
ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеФормированияОтчета, ОбработчикЗавершения, НастройкиОжидания);
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ЗапускФормированияОтчетаСервер()
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
МетаданныеОтчета = ОтчетОбъект.Метаданные();
ИмяОтчета = МетаданныеОтчета.Имя;
Если НЕ Метаданные.Отчеты.Содержит(МетаданныеОтчета) Тогда // если отчет внешний, то выполняем компоновку стандартно
СкомпоноватьРезультат();
Возврат Неопределено;
КонецЕсли;
Если ПустаяСтрока(ДанныеРасшифровки) Тогда
ДанныеРасшифровки = ПоместитьВоВременноеХранилище(Новый ДанныеРасшифровкиКомпоновкиДанных, УникальныйИдентификатор);
КонецЕсли;
ПараметрыФормирования = Новый Структура;
ПараметрыФормирования.Вставить("ИмяОтчета", ИмяОтчета);
ПараметрыФормирования.Вставить("АдресДанныхРасшифровки", ДанныеРасшифровки);
ПараметрыФормирования.Вставить("НастройкиКомпоновщика", Отчет.КомпоновщикНастроек.ПолучитьНастройки());
НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
Возврат ДлительныеОперации.ВыполнитьВФоне(СтрШаблон("Отчеты.%1.ВыполнитьКомпоновкуВФоне", ИмяОтчета), ПараметрыФормирования, НастройкиЗапуска);
КонецФункции
обработчик результата фонового задания (замечу, что данные расшифровки уже были положены по нужному адресу еще в фоновом задании, поэтому осталось получить только табличный документ):
&НаКлиенте
Процедура ЗавершениеФоновогоФормированияОтчетаКлиент(РезультатФоновойЗадачи, ДополнительныеПараметры) Экспорт
Если РезультатФоновойЗадачи <> Неопределено И РезультатФоновойЗадачи.Статус = "Выполнено" Тогда
Результат = ПолучитьИзВременногоХранилища(РезультатФоновойЗадачи.АдресРезультата);
Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
Элементы.Результат.ОтображениеСостояния.Текст = "";
КонецЕсли;
КонецПроцедуры