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