Выполнение длительных операций в фоновых заданиях

19.01.23

Разработка - Универсальные функции

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

Создал свою статью, потому что не нашёл подобную статью на Инфостарте, которая бы точно подходила для моей ситуации, и в которой было бы подробно всё описано, чтобы можно было просто скопировать код.                     

С формы обработки запускаем в фоновом задании функцию, которая находится в не глобальном общем модуле "расш_ОбщийМодульСервер" со свойством "Сервер".

// форма обработки

&НаКлиенте
Процедура ОбновитьТаблицу(Команда) 
    
    расш_ОбновитьТаблицыСверок();
    
КонецПроцедуры

// Вызов функции в фоновом задании:
// 1) запуск с клиента фонового задания на сервере
// 2) на клиенте подключение обработчика завершения фонового задания
// 3) на клиенте проверка выполнения фонового задания
// 4) на сервере получение результата фонового задания

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

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

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

// 4) на сервере получение результата фонового задания
&НаСервере
Процедура расш_ЗаполнениеТаблицСверки(РезультатИзВремХран) 
    
    РезультатВыборкаСверка = ПолучитьИзВременногоХранилища(РезультатИзВремХран.АдресРезультата);   
    
    Для каждого ТекН Из РезультатВыборкаСверка.ТаблицаНаименований Цикл 
        НовН = СписокНоменклатуры.Добавить();
        ЗаполнитьЗначенияСвойств(НовН, ТекН); 
    КонецЦикла;  
    
    Для каждого ТекЕд Из РезультатВыборкаСверка.ТаблицаЕдиниц Цикл 
        НовЕд = СписокЕдиниц.Добавить();
        ЗаполнитьЗначенияСвойств(НовЕд, ТекЕд); 
    КонецЦикла;  
    
    УдалитьИзВременногоХранилища(РезультатИзВремХран.АдресРезультата);  
    
КонецПроцедуры


// общий модуль  расш_ОбщийМодульСервер

Функция расш_ВыборкаСверкаНоменклатуры() Экспорт
    
    // упрощённый текст функции
    
    ТаблицаНаименований = Новый ТаблицаЗначений;
    ТаблицаНаименований.Колонки.Добавить("Номенклатура",Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(100)));  
    ...
    
    ТаблицаЕдиниц = Новый ТаблицаЗначений;
    ТаблицаЕдиниц.Колонки.Добавить("Единица",Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(50)));  
    ...
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ 
        ...
        |    СправочникНоменклатура.Наименование";
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл   
        ...
                    НоваяСтрока = ТаблицаНаименований.Добавить();
                    ЗаполнитьЗначенияСвойств(НоваяСтрока, Выборка);
        ...
                    НоваяСтрокаЕд = ТаблицаЕдиниц.Добавить();
                    ЗаполнитьЗначенияСвойств(НоваяСтрокаЕд, Выборка);  
        ...   
    КонецЦикла;

    РезультатВыборкаСверка = Новый Структура("ТаблицаНаименований, ТаблицаЕдиниц", ТаблицаНаименований, ТаблицаЕдиниц);
    
    Возврат РезультатВыборкаСверка;
    
КонецФункции

 

Вступайте в нашу телеграмм-группу Инфостарт

длительные операции фоновые задания

См. также

Универсальные функции Работа с интерфейсом Программист 1С:Предприятие 8 Бесплатно (free)

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

14.05.2025    5493    DeerCven    15    

57

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

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

21.05.2024    46587    dimanich70    83    

165

Универсальные функции Программист 1С:Предприятие 8 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    6887    6    John_d    13    

59

Универсальные функции Программист Стажер 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    57767    atdonya    31    

68

Универсальные функции Программист 1С:Предприятие 8 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    8660    ke.92@mail.ru    17    

68

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист 1С:Предприятие 8 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    22866    YA_418728146    8    

174
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. prog2019 50 25.01.23 17:21 Сейчас в теме
(1) Просмотрел эти статьи. Не моя ситуация. Мне так не удобно. Свой вариант никому не навязываю.
2. ltfriend 20.01.23 19:57 Сейчас в теме
Статья с ИТС своими словами?
mixailpopovsaratov; +1 Ответить
5. prog2019 50 25.01.23 17:23 Сейчас в теме
(2) Только часть информации есть на ИТС. На ИТС нет полностью нужной мне информации, которую я описал в своей статье.
3. Cmapnep 20 24.01.23 10:53 Сейчас в теме
Желательно добавить в описание номер версии БСП для которой это работает
umberto_nobile; sandr13; +2 Ответить
6. prog2019 50 25.01.23 17:35 Сейчас в теме
Для отправки сообщения требуется регистрация/авторизация