Механизм для конфигурации в которой можно встроить глобальный модуль
Создаем общий модуль "ДлительныеОперации", в него добавляем Ваш метод генерации сайтов, который работает очень долго:
галочка Сервер
Процедура СгенерироватьСайт() Экспорт
Сообщить("Начало:" + ТекущаяДатаСеанса());
// ........
Сообщить("Создаем каталоги");
// .........
Сообщить("Выгружаем изображения");
// .......
Сообщить("всего время: ...")
КонецПроцедуры
Создаем обработку с формой. На форме кнопка для запуска генератора сайтов. Модуль формы таков:
&НаКлиенте
Перем ИдентификаторЗадания;
&НаКлиенте
Процедура тест(Команда)
// Запускаем задание, сохраняем его идентификатор.
ИдентификаторЗадания = ЗапуститьГенераторСайтаНаСервере();
// Каждые две секунды проверяем, как там наше задание.
ПодключитьОбработчикОжидания("ПроверитьСостояниеЗадания", 2);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗапуститьГенераторСайтаНаСервере()
Задание = ФоновыеЗадания.Выполнить("ДлительныеОперации.СгенерироватьСайт");
Возврат Задание.УникальныйИдентификатор;
КонецФункции
&НаКлиенте
Процедура ПроверитьСостояниеЗадания()
Результат = ПолучитьСостояниеЗадания(ИдентификаторЗадания);
Для каждого СообщениеПользователю Из Результат.Сообщения Цикл
СообщениеПользователю.Сообщить();
КонецЦикла;
Если Результат.ЗаданиеЗавершено Тогда
ИдентификаторЗадания = Неопределено;
ОтключитьОбработчикОжидания("ПроверитьСостояниеЗадания");
Сообщить("Задание завершено");
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьСостояниеЗадания(Знач ИдентификаторЗадания)
Задание = ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);
МассивСоощений = Задание.ПолучитьСообщенияПользователю(Истина);
Завершено = (Задание.Состояние <> СостояниеФоновогоЗадания.Активно);
Результат = Новый Структура();
Результат.Вставить("Сообщения", МассивСоощений);
Результат.Вставить("ЗаданиеЗавершено", Завершено);
Возврат Результат;
КонецФункции
Механизм для внешних отчетов и обработок
Если имеем конфигурацию на базе БСП и можно подключать внешние обработки, то выход есть.
Создаем внешнюю обработку. В модуле объекта пишем функцию регистрации обработки и обработчик серверной команды:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.5.0");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.Информация = НСтр("ru = 'Пример подключаемой дополнительной обработки для демонстрации работы в фоновом режиме с отображением сообщений пользователю.'");
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Идентификатор = "СгенерироватьСайтНаСервере";
Команда.Представление = НСтр("ru = 'Сгенерировать сайт на сервере'");
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Команда.Скрыть = Истина;
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Идентификатор = "ОткрытьГенераторСайтов";
Команда.Представление = НСтр("ru = 'Генератор сайтов'");
Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт
Если ИдентификаторКоманды = "СгенерироватьСайтНаСервере" Тогда
ДлительностьСозданияСайта = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ДлительностьСозданияСайта", 3);
СгенерироватьСайт(ДлительностьСозданияСайта);
КонецЕсли;
КонецПроцедуры
Процедура СгенерироватьСайт(ДлительностьВСекундах)
Если Не ЗначениеЗаполнено(ДлительностьВСекундах) Тогда
Возврат;
КонецЕсли;
ОбщегоНазначения.СообщитьПользователю("Начало выполнения: ....");
ОбщегоНазначения.СообщитьПользователю("Процесс выполнения: ....");
ОбщегоНазначения.СообщитьПользователю("Окончание выполнения: ....");
КонецПроцедуры
Создаем форму обработки, где размещаем уже собственные элементы управления генерацией сайта и команду запуска серверного обработчика. Важно здесь добавить в параметры формы ключевой параметр "ДополнительнаяОбработкаСсылка" типа "СправочникСсылка.ДополнительныеОтчетыИОбработки". Модуль формы:
&НаКлиенте
Процедура СгенерироватьСайт(Команда)
// Важный момент: параметр формы "ДополнительнаяОбработкаСсылка" заполняется только при открытии подключенной к ИБ обработке.
ПараметрыВыполненияКоманды = ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);
// Здесь можем добавить свои параметры для серверного обработчика.
ПараметрыВыполненияКоманды.Вставить("ДлительностьСозданияСайта", ДлительностьСозданияСайта);
// Здесь обязательно нужно правильно указать идентификатор серверной команды.
ИдентификаторКоманды = "СгенерироватьСайтНаСервере";
// Запускаем генератор.
ОбработчикЗавершения = Новый ОписаниеОповещения("ЗавершитьГенерациюСайта", ЭтотОбъект);
ДополнительныеОтчетыИОбработкиКлиент.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыВыполненияКоманды, ОбработчикЗавершения);
КонецПроцедуры
&НаКлиенте
Процедура ЗавершитьГенерациюСайта(Результат, ДополнительныеПараметры) Экспорт
Если Результат.Статус = "Ошибка" Тогда
ПоказатьПредупреждение(, Результат.КраткоеПредставлениеОшибки);
Возврат;
КонецЕсли;
ОбщегоНазначенияКлиент.СообщитьПользователю("Готово");
КонецПроцедуры
---------------------------------------------
Смотри также:
---------------------------------------------
Публикация №000000094