Проект

Общее

Профиль

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

Всеволод Дорофеев, 08.10.2018 17:52

1 1 Всеволод Дорофеев
h1. Фоновое формирование отчета СКД на УФ средствами БСП
2 1 Всеволод Дорофеев
3 1 Всеволод Дорофеев
Иточник
4 1 Всеволод Дорофеев
5 1 Всеволод Дорофеев
http://1c.ruboard.ru/public/622567/
6 1 Всеволод Дорофеев
7 1 Всеволод Дорофеев
Итак. Сам алгоритм, исполняемый в фоновом задании, размещается в модуле менеджера целевого отчета. Тут все просто и никакой магии:
8 1 Всеволод Дорофеев
<pre>
9 1 Всеволод Дорофеев
Процедура ВыполнитьКомпоновкуВФоне(СтруктураНастроек, АдресРезультатаВоВременномХранилище) Экспорт
10 1 Всеволод Дорофеев
    
11 1 Всеволод Дорофеев
    ТабличныйДокументРезультат = Новый ТабличныйДокумент;
12 1 Всеволод Дорофеев
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
13 1 Всеволод Дорофеев
    
14 1 Всеволод Дорофеев
    Отчет = Отчеты[СтруктураНастроек.ИмяОтчета].Создать();
15 1 Всеволод Дорофеев
    Отчет.КомпоновщикНастроек.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет.СхемаКомпоновкиДанных));
16 1 Всеволод Дорофеев
    Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(СтруктураНастроек.НастройкиКомпоновщика);
17 1 Всеволод Дорофеев
    Отчет.СкомпоноватьРезультат(ТабличныйДокументРезультат, ДанныеРасшифровки);
18 1 Всеволод Дорофеев
    
19 1 Всеволод Дорофеев
    ПоместитьВоВременноеХранилище(ДанныеРасшифровки, СтруктураНастроек.АдресДанныхРасшифровки);
20 1 Всеволод Дорофеев
    ПоместитьВоВременноеХранилище(ТабличныйДокументРезультат, АдресРезультатаВоВременномХранилище);
21 1 Всеволод Дорофеев
    
22 1 Всеволод Дорофеев
КонецПроцедуры
23 1 Всеволод Дорофеев
</pre>
24 1 Всеволод Дорофеев
25 1 Всеволод Дорофеев
Нужно перехватить событие компоновки на клиенте. К сожалению, человеческого способа это сделать нет. Придется подсовывать свою команду вместо стандартной. Отключаем в доступных командах отчета штатное "Сформировать", выводим на форму кнопку со своей командой. Оформляем, чтобы выглядела аналогично.
26 1 Всеволод Дорофеев
27 1 Всеволод Дорофеев
<pre>
28 1 Всеволод Дорофеев
&НаКлиенте
29 1 Всеволод Дорофеев
Процедура Сформировать(Команда)
30 1 Всеволод Дорофеев
	
31 1 Всеволод Дорофеев
	ФоновоеФормированияОтчета = ЗапускФормированияОтчетаСервер();
32 1 Всеволод Дорофеев
	Если ФоновоеФормированияОтчета <> Неопределено Тогда
33 1 Всеволод Дорофеев
		НастройкиОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
34 1 Всеволод Дорофеев
		ОбработчикЗавершения = Новый ОписаниеОповещения("ЗавершениеФоновогоФормированияОтчетаКлиент", ЭтотОбъект);
35 1 Всеволод Дорофеев
		ДлительныеОперацииКлиент.ОжидатьЗавершение(ФоновоеФормированияОтчета, ОбработчикЗавершения, НастройкиОжидания);
36 1 Всеволод Дорофеев
	КонецЕсли;	
37 1 Всеволод Дорофеев
	
38 1 Всеволод Дорофеев
КонецПроцедуры
39 1 Всеволод Дорофеев
</pre>
40 1 Всеволод Дорофеев
41 1 Всеволод Дорофеев
42 1 Всеволод Дорофеев
<pre>
43 1 Всеволод Дорофеев
&НаСервере
44 1 Всеволод Дорофеев
Функция ЗапускФормированияОтчетаСервер()
45 1 Всеволод Дорофеев
	
46 1 Всеволод Дорофеев
	ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
47 1 Всеволод Дорофеев
	МетаданныеОтчета = ОтчетОбъект.Метаданные();
48 1 Всеволод Дорофеев
	ИмяОтчета = МетаданныеОтчета.Имя;
49 1 Всеволод Дорофеев
	
50 1 Всеволод Дорофеев
	Если НЕ Метаданные.Отчеты.Содержит(МетаданныеОтчета) Тогда // если отчет внешний, то выполняем компоновку стандартно
51 1 Всеволод Дорофеев
		СкомпоноватьРезультат();
52 1 Всеволод Дорофеев
		Возврат Неопределено;
53 1 Всеволод Дорофеев
	КонецЕсли;
54 1 Всеволод Дорофеев
	
55 1 Всеволод Дорофеев
	Если ПустаяСтрока(ДанныеРасшифровки) Тогда
56 1 Всеволод Дорофеев
		ДанныеРасшифровки = ПоместитьВоВременноеХранилище(Новый ДанныеРасшифровкиКомпоновкиДанных, УникальныйИдентификатор);
57 1 Всеволод Дорофеев
	КонецЕсли;
58 1 Всеволод Дорофеев
	
59 1 Всеволод Дорофеев
	ПараметрыФормирования = Новый Структура;
60 1 Всеволод Дорофеев
	ПараметрыФормирования.Вставить("ИмяОтчета", ИмяОтчета);
61 1 Всеволод Дорофеев
	ПараметрыФормирования.Вставить("АдресДанныхРасшифровки", ДанныеРасшифровки);
62 1 Всеволод Дорофеев
	ПараметрыФормирования.Вставить("НастройкиКомпоновщика", Отчет.КомпоновщикНастроек.ПолучитьНастройки());
63 1 Всеволод Дорофеев
	
64 1 Всеволод Дорофеев
	НастройкиЗапуска = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
65 1 Всеволод Дорофеев
	
66 1 Всеволод Дорофеев
	Возврат ДлительныеОперации.ВыполнитьВФоне(СтрШаблон("Отчеты.%1.ВыполнитьКомпоновкуВФоне", ИмяОтчета), ПараметрыФормирования, НастройкиЗапуска);
67 1 Всеволод Дорофеев
	
68 1 Всеволод Дорофеев
КонецФункции
69 1 Всеволод Дорофеев
</pre>
70 1 Всеволод Дорофеев
71 1 Всеволод Дорофеев
72 1 Всеволод Дорофеев
обработчик результата фонового задания (замечу, что данные расшифровки уже были положены по нужному адресу еще в фоновом задании, поэтому осталось получить только табличный документ):
73 1 Всеволод Дорофеев
74 1 Всеволод Дорофеев
<pre>
75 1 Всеволод Дорофеев
&НаКлиенте
76 1 Всеволод Дорофеев
Процедура ЗавершениеФоновогоФормированияОтчетаКлиент(РезультатФоновойЗадачи, ДополнительныеПараметры) Экспорт
77 1 Всеволод Дорофеев
	
78 1 Всеволод Дорофеев
	Если РезультатФоновойЗадачи <> Неопределено И РезультатФоновойЗадачи.Статус = "Выполнено" Тогда
79 1 Всеволод Дорофеев
		Результат = ПолучитьИзВременногоХранилища(РезультатФоновойЗадачи.АдресРезультата);
80 1 Всеволод Дорофеев
		Элементы.Результат.ОтображениеСостояния.ДополнительныйРежимОтображения = ДополнительныйРежимОтображения.НеИспользовать;
81 1 Всеволод Дорофеев
		Элементы.Результат.ОтображениеСостояния.Текст = "";
82 1 Всеволод Дорофеев
	КонецЕсли;
83 1 Всеволод Дорофеев
	
84 1 Всеволод Дорофеев
КонецПроцедуры
85 1 Всеволод Дорофеев
</pre>