Гельмер Александр

+79129291010 Telegram,WhatsApp,Viber ( helmer@ya.ru )

Механизм для конфигурации в которой можно встроить глобальный модуль

Создаем общий модуль "ДлительныеОперации", в него добавляем Ваш метод генерации сайтов, который работает очень долго:

галочка Сервер



Процедура СгенерироватьСайт() Экспорт

Сообщить("Начало:" + ТекущаяДатаСеанса());

// ........

Сообщить("Создаем каталоги");

// .........

Сообщить("Выгружаем изображения");

// .......

Сообщить("всего время: ...")

КонецПроцедуры


Создаем обработку с формой. На форме кнопка для запуска генератора сайтов. Модуль формы таков:

&НаКлиенте
Перем ИдентификаторЗадания;



&НаКлиенте
Процедура тест(Команда)
// Запускаем задание, сохраняем его идентификатор.
ИдентификаторЗадания
= ЗапуститьГенераторСайтаНаСервере();

// Каждые две секунды проверяем, как там наше задание.
ПодключитьОбработчикОжидания
("ПроверитьСостояниеЗадания", 2);
КонецПроцедуры


&НаСервереБезКонтекста
Функция ЗапуститьГенераторСайтаНаСервере()

Задание
= ФоновыеЗадания.Выполнить("ДлительныеОперации.СгенерироватьСайт");

Возврат Задание.УникальныйИдентификатор;

КонецФункции

&НаКлиенте
Процедура ПроверитьСостояниеЗадания()

Результат
= ПолучитьСостояниеЗадания(ИдентификаторЗадания);

Для каждого СообщениеПользователю Из Результат.Сообщения Цикл
СообщениеПользователю
.Сообщить();
КонецЦикла;

Если Результат.ЗаданиеЗавершено Тогда

ИдентификаторЗадания
= Неопределено;
ОтключитьОбработчикОжидания
("ПроверитьСостояниеЗадания");

Сообщить
("Задание завершено");

КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПолучитьСостояниеЗадания(Знач ИдентификаторЗадания)

Задание
= ФоновыеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторЗадания);

МассивСоощений
= Задание.ПолучитьСообщенияПользователю(Истина);
Завершено
= (Задание.Состояние <> СостояниеФоновогоЗадания.Активно);

Результат
= Новый Структура();
Результат
.Вставить("Сообщения", МассивСоощений);
Результат
.Вставить("ЗаданиеЗавершено", Завершено);

Возврат Результат;

КонецФункции


Механизм для внешних отчетов и обработок

Если имеем конфигурацию на базе БСП и можно подключать внешние обработки, то выход есть.

Создаем внешнюю обработку. В модуле объекта пишем функцию регистрации обработки и обработчик серверной команды:

Функция СведенияОВнешнейОбработке() Экспорт

ПараметрыРегистрации
= ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("3.1.5.0");
ПараметрыРегистрации
.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации
.Версия = "1.0";
ПараметрыРегистрации
.Информация = НСтр("ru = 'Пример подключаемой дополнительной обработки для демонстрации работы в фоновом режиме с отображением сообщений пользователю.'");

Команда
= ПараметрыРегистрации.Команды.Добавить();
Команда
.Идентификатор = "СгенерироватьСайтНаСервере";
Команда
.Представление = НСтр("ru = 'Сгенерировать сайт на сервере'");
Команда
.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
Команда
.ПоказыватьОповещение = Ложь;
Команда
.Скрыть = Истина;

Команда
= ПараметрыРегистрации.Команды.Добавить();
Команда
.Идентификатор = "ОткрытьГенераторСайтов";
Команда
.Представление = НСтр("ru = 'Генератор сайтов'");
Команда
.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы();

Возврат ПараметрыРегистрации;

КонецФункции

Процедура ВыполнитьКоманду(ИдентификаторКоманды, ПараметрыКоманды) Экспорт

Если ИдентификаторКоманды = "СгенерироватьСайтНаСервере" Тогда

ДлительностьСозданияСайта
= ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(ПараметрыКоманды, "ДлительностьСозданияСайта", 3);

СгенерироватьСайт
(ДлительностьСозданияСайта);

КонецЕсли;

КонецПроцедуры

Процедура СгенерироватьСайт(ДлительностьВСекундах)

Если Не ЗначениеЗаполнено(ДлительностьВСекундах) Тогда
Возврат;
КонецЕсли;

ОбщегоНазначения
.СообщитьПользователю("Начало выполнения: ....");
ОбщегоНазначения
.СообщитьПользователю("Процесс выполнения: ....");
ОбщегоНазначения
.СообщитьПользователю("Окончание выполнения: ....");

КонецПроцедуры


Создаем форму обработки, где размещаем уже собственные элементы управления генерацией сайта и команду запуска серверного обработчика. Важно здесь добавить в параметры формы ключевой параметр "ДополнительнаяОбработкаСсылка" типа "СправочникСсылка.ДополнительныеОтчетыИОбработки". Модуль формы:




&НаКлиенте
Процедура СгенерироватьСайт(Команда)

// Важный момент: параметр формы "ДополнительнаяОбработкаСсылка" заполняется только при открытии подключенной к ИБ обработке.
ПараметрыВыполненияКоманды
= ДополнительныеОтчетыИОбработкиКлиент.ПараметрыВыполненияКомандыВФоне(Параметры.ДополнительнаяОбработкаСсылка);

// Здесь можем добавить свои параметры для серверного обработчика.
ПараметрыВыполненияКоманды
.Вставить("ДлительностьСозданияСайта", ДлительностьСозданияСайта);

// Здесь обязательно нужно правильно указать идентификатор серверной команды.
ИдентификаторКоманды
= "СгенерироватьСайтНаСервере";

// Запускаем генератор.
ОбработчикЗавершения
= Новый ОписаниеОповещения("ЗавершитьГенерациюСайта", ЭтотОбъект);

ДополнительныеОтчетыИОбработкиКлиент
.ВыполнитьКомандуВФоне(ИдентификаторКоманды, ПараметрыВыполненияКоманды, ОбработчикЗавершения);

КонецПроцедуры

&НаКлиенте
Процедура ЗавершитьГенерациюСайта(Результат, ДополнительныеПараметры) Экспорт

Если Результат.Статус = "Ошибка" Тогда
ПоказатьПредупреждение
(, Результат.КраткоеПредставлениеОшибки);
Возврат;
КонецЕсли;

ОбщегоНазначенияКлиент
.СообщитьПользователю("Готово");

КонецПроцедуры




---------------------------------------------

Смотри также:


Вывод сообщений из 1c при длительном выполении на сервере под управляемыми формами через текстовый файл и EXE

---------------------------------------------

Публикация №000000094


©AlexHelmer 2023