Каталог решений - Создание внешней обработки в фоне на БСП — проще простого, для ленивых или начинающих

Создание внешней обработки в фоне на БСП — проще простого, для ленивых или начинающих

Создание внешней обработки в фоне на БСП — проще простого, для ленивых или начинающих

В наличии

Представлен шаблон обработки для выполнения в фоновом режиме.
По сути в Команде нужно прописать Параметры и путь к Модулю, все остальное универсально.

Категория:

Описание

Данная публикация основана на теории из Асинхронная концепция программирования

Работает на Платформе 3.14+ и на версии БСП: 3.0+.

Расположение выполняемой Процедуры — зависит от ситуации.

Данный пример демонстрирует, что Процедуру можно вызывать как из Общего модуля так и из Модуля менеджера — обработки расположенной в Конфигурации или в Расширении.

1. В общем модуле или Модуле менеджера Обработки нужно создать Экспортную Процедуру:

Процедура НашаДлительнаяОперация(Параметры, Заглушка) Экспорт
    // Имитация продолжительного действия (Длительность сек.).
    ДатаНачалаОперации    = ТекущаяДата();

    Пока ТекущаяДата()-ДатаНачалаОперации<Параметры.Длительность Цикл
    КонецЦикла;
КонецПроцедуры

2. Нужно создать внешнюю обработку и добавить форму, на форме создать:

2.1. Реквизит — Длительность и ФоновоеЗадание

2.2. Команды — ТестОМ и ТестОбработка

2.3. Обработчик события — ПриСозданииНаСервере

 

3. В модуль формы вставить следующий код:

&НаКлиенте
Перем ПараметрыОбработчикаОжидания;

&НаКлиенте
Перем ФормаДлительнойОперации;

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    ФоновоеЗадание = Новый Структура("
        |ИмяЗадания,
        |ИдентификаторЗадания,
        |АдресХранилища");
КонецПроцедуры

&НаКлиенте
Процедура ТестОМ(Команда)
    ПараметрыЗадания = Новый Структура;
    ПараметрыЗадания.Вставить("Длительность", Длительность);
    
    ЗапуститьФоновоеЗадание("Фоновое задание", ПараметрыЗадания, "ОбщийМодульСервер.НашаДлительнаяОперация");
КонецПроцедуры

&НаКлиенте
Процедура ТестОбработка(Команда)
    ПараметрыЗадания = Новый Структура;
    ПараметрыЗадания.Вставить("Длительность", Длительность);
    
    ЗапуститьФоновоеЗадание("Фоновое задание", ПараметрыЗадания, "Обработки.Обработка.НашаДлительнаяОперация");
КонецПроцедуры

&НаКлиенте
Процедура ЗапуститьФоновоеЗадание(ИмяЗадания, ПараметрыЗадания, Модуль)
    
    ЗаданиеВыполнено = ЗапуститьФоновоеЗаданиеНаСервере(ИмяЗадания, ПараметрыЗадания, Модуль);
    
    Если ЗаданиеВыполнено Тогда
        ОбработатьЗавершениеЗаданияНаКлиенте(Ложь);
    Иначе
        ОткрытьФормуДлительнойОперации();
    КонецЕсли;

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

&НаСервере
Функция ЗапуститьФоновоеЗаданиеНаСервере(ИмяЗадания, ПараметрыЗадания, Модуль)
    
    РезультатЗапускаЗадания = ЗапуститьЗаданиеНаСервере(ИмяЗадания, ПараметрыЗадания, Модуль);
    
    ФоновоеЗадание.ИмяЗадания           = ИмяЗадания;
    ФоновоеЗадание.ИдентификаторЗадания = РезультатЗапускаЗадания.ИдентификаторЗадания;
    ФоновоеЗадание.АдресХранилища       = РезультатЗапускаЗадания.АдресХранилища;
    
    Возврат РезультатЗапускаЗадания.ЗаданиеВыполнено;

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

&НаСервере
Функция ЗапуститьЗаданиеНаСервере(НаименованиеЗадания, ПараметрыЗадания, Модуль)
    
    РезультатЗапускаЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
                                    УникальныйИдентификатор,
                                    Модуль,
                                    ПараметрыЗадания,
                                    НаименованиеЗадания);
            
    Возврат РезультатЗапускаЗадания;
        
КонецФункции

&НаКлиенте
Процедура ОбработатьЗавершениеЗаданияНаКлиенте(ОбновитьДанные = Истина)

    ЗавершениеФоновогоЗадания(ФоновоеЗадание.АдресХранилища, ОбновитьДанные);

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

&НаКлиенте
Процедура ОткрытьФормуДлительнойОперации()
    
    ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
    
    ПараметрыОбработчикаОжидания.КоэффициентУвеличенияИнтервала = 1.2;
    ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания", 1, Истина);
    
    ФормаДлительнойОперации = ДлительныеОперацииКлиент.ОткрытьФормуДлительнойОперации(
        ЭтаФорма, ФоновоеЗадание.ИдентификаторЗадания);
    
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеФоновогоЗадания(АдресХранилища, ОбновитьДанные)
    
    Результат = ЗавершениеЗаданияНаСервере(АдресХранилища);
    
КонецПроцедуры

&НаСервере
Функция ЗавершениеЗаданияНаСервере(АдресХранилища)
    
    Результат = ПолучитьИзВременногоХранилища(АдресХранилища);
    
    Возврат Результат;
    
КонецФункции

&НаКлиенте
Процедура Подключаемый_ПроверитьВыполнениеЗадания()
    
    Попытка
        
        Если ФормаДлительнойОперации.Открыта() Тогда
            
            Если ЗаданиеВыполнено(ФоновоеЗадание.ИдентификаторЗадания) Тогда
                ОбработатьЗавершениеЗаданияНаКлиенте();
                ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
            Иначе
                ДлительныеОперацииКлиент.ОбновитьПараметрыОбработчикаОжидания(ПараметрыОбработчикаОжидания);
                ПодключитьОбработчикОжидания("Подключаемый_ПроверитьВыполнениеЗадания",
                    ПараметрыОбработчикаОжидания.ТекущийИнтервал, Истина);
            КонецЕсли;
                
        КонецЕсли;
        
    Исключение
        
        ДлительныеОперацииКлиент.ЗакрытьФормуДлительнойОперации(ФормаДлительнойОперации);
        ВызватьИсключение;
        
    КонецПопытки;
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗаданиеВыполнено(ИдентификаторЗадания)
    
    Возврат ДлительныеОперации.ЗаданиеВыполнено(ИдентификаторЗадания);
    
КонецФункции

 

has been added to your cart:
Оформление заказа