Содержание:
Файлы материала

Все серверные вызовы, которые могут длиться больше 8 секунд 1С рекомендует реализовывать через длительные операции, более подробно из официальных источников можно почитать тут.
В данной статье приведен пример расширения с демонстрацией работы длительной операции с выводом процентов (протестировано на ЗУП 3.1 с БСП 3.1.7.343)
Шаблон «многопоточной Длительной операции» можно посмотреть тут.
Описание
Расширение состоит из обработки, в форме которой добавлена команда ВыполнитьСПроцентами().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#Область ОбработчикиКомандФормы &НаКлиенте Процедура ВыполнитьСПроцентами(Команда) // 1. Запуск фонового задания на сервере. ДлительнаяОперация = НачатьВыполнениеДолгойФункции( УникальныйИдентификатор, Объект.НомерДокумента, Объект.ДатаДокумента); // 2. Подключение обработчика завершения фонового задания. ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина; ПараметрыОжидания.Интервал = 1; ДлительныеОперацииКлиент.ОжидатьЗавершение( ДлительнаяОперация, Новый ОписаниеОповещения("ВыполнениеДолгойПроцедурыЗавершение", ЭтотОбъект), ПараметрыОжидания); КонецПроцедуры #КонецОбласти |
1. С помощью функции НачатьВыполнениеДолгойФункции() инициализируем длительную операцию
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
&НаСервереБезКонтекста Функция НачатьВыполнениеДолгойФункции(Знач ИдентификаторФормы, Знач НомерДокумента, Знач ДатаДокумента) // Обработка может находится в модуль менеджере или в серверном общем модуле ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(ИдентификаторФормы); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение сложных данных'"); ПараметрыВыполнения.ЗапуститьВФоне = Истина; Возврат ДлительныеОперации.ВыполнитьФункцию( ПараметрыВыполнения, "Обработки.АВ_ОбработкаДлительнаяОперация.ПолучениеСложныхДанных", НомерДокумента, ДатаДокумента); // Есть аналог с процедурой, соответсвенно в модуле менеджера должна быть процедура //ДлительныеОперации.ПараметрыВыполненияПроцедуры(); //ДлительныеОперации.ВыполнитьПроцедуру(); КонецФункции |
В которой и вызывается «тяжелая» экспортная функция из модуля менеджера обработки.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Функция ПолучениеСложныхДанных(НомерДокумента, ДатаДокумента) Экспорт Результат = 0; Всего = 100; Для Сч = 1 По Всего Цикл // Сложная операция ДокументСсылка = Документы.ЛистокСообщенияДляВоенкомата.НайтиПоНомеру(НомерДокумента, ДатаДокумента); ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); ДокументОбъект.Записать(); Результат = Результат + 1; // Пример передачи прогресса выполнения фонового задания // Не рекомендуется сообщать прогресс больше 100 раз за операцию ТекущийПроцент = Сч; ДлительныеОперации.СообщитьПрогресс(ТекущийПроцент, "Текст"); КонецЦикла; Возврат Результат; КонецФункции |
В теле функции выводится информация о прогрессе выполнения (ДлительныеОперации.СообщитьПрогресс — не рекомендовано вызывать больше 100 раз за операцию).
2. Вторым шагом в команде ВыполнитьСПроцентами() был подключен обработчик завершения с вызовом экспортной функции ВыполнениеДолгойПроцедурыЗавершение().
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
&НаКлиенте Процедура ВыполнениеДолгойПроцедурыЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда Возврат; КонецЕсли; Если Результат.Статус = "Ошибка" Тогда СтандартныеПодсистемыКлиент.ВывестиИнформациюОбОшибке(Результат.ИнформацияОбОшибке); Возврат; КонецЕсли; ДлительныеОперацииЗавершениеНаСервере(Результат.АдресРезультата); УдалитьИзВременногоХранилища(Результат.АдресРезультата); КонецПроцедуры &НаСервереБезКонтекста Процедура ДлительныеОперацииЗавершениеНаСервере(Знач АдресХранилища) Результат = ПолучитьИзВременногоХранилища(АдресХранилища); // Здесь должен быть код обработки полученного результата ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Сложная операция выполнена. Всего записано документов: %1'"), Результат); ОбщегоНазначения.СообщитьПользователю(ТекстСообщения); КонецПроцедуры |
Отладка
Для того, что бы поймать в отладчике выполнении «тяжелой» функции модуль менеджера, необходимо в меню Сервис -> Параметры написать в параметрах запуска РежимОтладки, но тогда соответственно процентов вы не увидите.

Образец расширения можно скачать в начале статьи.
