&НаКлиенте
Перем ПараметрыОбработчикаОжидания;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭтаФорма.КлючТекущегоВарианта = "ПримерОтчета";
Если Параметры.ДополнительнаяОбработкаСсылка = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда
// Почему то не передаются "Параметры" ДополнительнаяОбработкаСсылка, так что ищем сами
// Если же и здесь не находит, то служебные процедуры выведут ошибки.
ВременнаяСсылка = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию("Пример отчета");
Параметры.ДополнительнаяОбработкаСсылка = ВременнаяСсылка;
ОбъектСсылка = ВременнаяСсылка;
Иначе
ОбъектСсылка = Параметры.ДополнительнаяОбработкаСсылка;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СформироватьОтчетВФонеДлительныеОперации(Команда)
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "ФОРМИРОВАНИЕОТЧЕТА");
ОчиститьСообщения();
ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
ИнтервалПроверки = ПараметрыОбработчикаОжидания.ТекущийИнтервал;
Состояние(НСтр("ru = 'Выполнение отчета...'"));
СформироватьОтчетВФонеДлительныеОперацииНаСервере();
Если НЕ Выполнено Тогда
ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", ИнтервалПроверки, Истина);
Иначе
ОтключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания");
ЗагрузитьПодготовленныеДанные()
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СформироватьОтчетПрограммно(Команда)
СформироватьОтчетПрограммноНаСервере()
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчетПрограммноНаСервере()
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
ИдентификаторЗадания = Неопределено;
Выполнено = Ложь;
АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("СхемаКомпоновкиДанных" , ОтчетОбъект.СхемаКомпоновкиДанных);
ПараметрыКоманды.Вставить("НастройкиПользователя" , Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "ФОРМИРОВАНИЕОТЧЕТА");
ОтчетОбъект.СформироватьОтчет(ПараметрыКоманды,АдресХранилища);
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеИспользовать");
ЗагрузитьПодготовленныеДанные();
КонецПроцедуры
&НаСервере
Процедура СформироватьОтчетВФонеДлительныеОперацииНаСервере()
ДлительныеОперации.ОтменитьВыполнениеЗадания(ИдентификаторЗадания);
ИдентификаторЗадания = Неопределено;
Выполнено = Ложь;
АдресХранилища = ПоместитьВоВременноеХранилище(Неопределено, УникальныйИдентификатор);
ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
ПараметрыКоманды = Новый Структура;
ПараметрыКоманды.Вставить("АдресХранилища" , АдресХранилища);
ПараметрыКоманды.Вставить("ДополнительнаяОбработкаСсылка" , ОбъектСсылка);
ПараметрыКоманды.Вставить("СопровождающийТекст" , НСтр("ru = 'Выполнение отчета...'"));
ПараметрыКоманды.Вставить("ИдентификаторКоманды" , "СформироватьОтчет");
ПараметрыКоманды.Вставить("УникальныйИдентификатор" , УникальныйИдентификатор);
ПараметрыКоманды.Вставить("СхемаКомпоновкиДанных" , ОтчетОбъект.СхемаКомпоновкиДанных);
ПараметрыКоманды.Вставить("НастройкиПользователя" , Отчет.КомпоновщикНастроек.ПользовательскиеНастройки);
Попытка
ЗаданиеРезультат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
УникальныйИдентификатор,
"ДополнительныеОтчетыИОбработки.ВыполнитьКоманду",
ПараметрыКоманды,
СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
НСтр("ru = 'Выполнение дополнительного отчета или обработки ""%1"", имя команды ""%2""'"),
Строка(ПараметрыКоманды.ДополнительнаяОбработкаСсылка),
ПараметрыКоманды.ИдентификаторКоманды));
Выполнено = ЗаданиеРезультат.ЗаданиеВыполнено;
ВызваноИсключение = Ложь;
Если Выполнено Тогда
ЗагрузитьПодготовленныеДанные();
Иначе
ИдентификаторЗадания = ЗаданиеРезультат.ИдентификаторЗадания;
КонецЕсли;
Исключение
Выполнено = Ложь;
ВызваноИсключение = Истина;
ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура СформироватьОтчетВФонеРежимКомпоновки(Команда)
ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый);
КонецПроцедуры
&НаКлиенте
Процедура Подключаемый_ПроверитьВыполнениеЗадания()
Попытка
Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда
ЗагрузитьПодготовленныеДанные();
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеИспользовать");
Иначе
ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
ПодключитьОбработчикОжидания(
"Подключаемый_ПроверитьВыполнениеЗадания",
ПараметрыОбработчикаОжидания.ТекущийИнтервал,
Истина);
КонецЕсли;
Исключение
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеИспользовать");
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьПодготовленныеДанныеНаКлиенте()
ЗагрузитьПодготовленныеДанные();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьПодготовленныеДанные()
РезультатВыполнения = ПолучитьИзВременногоХранилища(АдресХранилища);
Результат = РезультатВыполнения.Результат;
//ДанныеРасшифровки = РезультатВыполнения.ДанныеРасшифровки;
ИдентификаторЗадания = Неопределено;
ОбщегоНазначенияКлиентСервер.УстановитьСостояниеПоляТабличногоДокумента(Элементы.Результат, "НеИспользовать");
//ДополнительныеСвойства = Отчет.КомпоновщикНастроек.Настройки.ДополнительныеСвойства;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаданиеВыполнено(ИдентификаторЗадания)
Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
КонецФункции
пробую ваш обработку, для меня так же важно запустить отчет в фоне.
отчет сам формируется нормально, и штатными средствами и вашей процедурой СформироватьОтчетПрограммноНаСервере.
но вот с фоновом формированием — проблема.
ничего не возвращается из Временного Хранилища!
помогите пожалуйста разобраться…
Разобрался — проблемы была в Параметры.ДополнительнаяОбработкаСсылк
(1)Рад что разобрались). Я тоже с этим сталкивался, многие часы отладки таки не дали ответа, почему ссылка пустая. Пришлось самому присваивать ссылку в «Параметры.ДополнительнаяОбработкаСсылка».
но в обработке есть реально две ошибки:
1. НоваяКоманда.Идентификатор = «СформироватьОтчет»;
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
у вас изначально вариант — открытиеформы, а надо вызовсерверногометода.
У вас же даже Процедура ВыполнитьКоманду для этого уже была.
2. ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
ТекущийИнтервал = ПараметрыОбработчикаОжидания.ТекущийИнтервал;
ПодключитьОбработчикОжидания(«Подключаемый_ПроверитьВыполнениеЗадания»,ТекущийИнтервал, Истина);
надо инициализировать ПараметрыОбработчикаОжидания, иначе потом в процедуре Подключаемый_ПроверитьВыполнениеЗадания будет ошибка на ТекущийИнтервал
(3)
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
у вас изначально вариант — открытиеформы, а надо вызовсерверногометода.
Если ставить «ТипКомандыВызовСерверногоМетода()» вместо «ТипКомандыОткрытиеФормы()» то форма не откроется и запуститься сразу команда по идентификатору «СформироватьОтчет».
ТекущийИнтервал = ПараметрыОбработчикаОжидания.ТекущийИнтервал;
ПодключитьОбработчикОжидания(«Подключаемый_ПроверитьВыполнениеЗадания»,ТекущийИнтервал, Истина);
надо инициализировать ПараметрыОбработчикаОжидания, иначе потом в процедуре Подключаемый_ПроверитьВыполнениеЗадания будет ошибка на ТекущийИнтервал
Здесь все поправил.
Спасибо вам за замечания.
да, тоже до этого дошел.
в итоге сделал две команды: одну на открытие формы другую на ВызовСерверногоМетода.
потому как без первого — реально форма не открывается, а без второго не работает сформировать отчет в фоне.
я в процедуре формирования еще запихиваю тз во внешние данные.
Спасибо. Очень помог пример кода для пункта 3: Сформировать (длительные операции в фоне). Все работает.
(6) Рад что помогла публикация)
Хороший пример! Пригодилось, спасибо!
(3)
подскажи в каком именно моменте необходимо инициализация ПараметрыОбработчикаОжидания ?
(9) В типовых инициализируют при открытии формы. Я сделал в команде «СформироватьОтчетВФонеДлительныеОперации».
спасибо автору за статью и еще за оперативный ответ :), давно хотел юзать отчеты через бсп в фоне.