Содержание:
Файлы материала
Все серверные вызовы, которые могут длиться больше 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 |
&НаКлиенте Процедура ВыполнитьСПроцентами(Команда) // 1. Запуск фонового задания на сервере. ДлительнаяОперация = НачатьВыполнениеДолгойФункции(); // 2. Подключение обработчика завершения фонового задания. ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект); ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина; ПараметрыОжидания.Интервал = 1; ДлительныеОперацииКлиент.ОжидатьЗавершение( ДлительнаяОперация, Новый ОписаниеОповещения("ВыполнениеДолгойПроцедурыЗавершение", ЭтотОбъект), ПараметрыОжидания); КонецПроцедуры |
1. С помощью функции НачатьВыполнениеДолгойФункции() инициализируем длительную операцию
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
&НаСервере Функция НачатьВыполнениеДолгойФункции() ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияФункции(УникальныйИдентификатор); ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Получение сложных данных'"); ПараметрыВыполнения.ЗапуститьВФоне = Истина; // обработка может находится в модуле менеджера любого объекта или в общем модуле Возврат ДлительныеОперации.ВыполнитьФункцию(УникальныйИдентификатор, "Обработки.АВ_ОбработкаДлительнаяОперация.ПолучениеСложныхДанных", Объект.ДатаАктуальности); // Есть аналог с процедурой вместо функции, соответственно в модуль менеджере должна быть процедура //ДлительныеОперации.ПараметрыВыполненияПроцедуры(); //ДлительныеОперации.ВыполнитьПроцедуру(); КонецФункции |
В которой и вызывается “тяжелая” экспортная функция из модуля менеджера обработки
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Функция ПолучениеСложныхДанных(Параметры) Экспорт //Здесь должен находиться код, определяющий выполнение длительной процедуры Всего = 500; Для Сч = 1 по Всего Цикл // Сложная операция ДокументСсылка = Документы.ЛистокСообщенияДляВоенкомата.НайтиПоНомеру("0000-000001", ТекущаяДата()); ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); ДокументОбъект.Записать(); //Пример передачи прогресса выполнения фонового задания Процент = Окр(Сч/Всего*100,0); Если НЕ (Сч) % 10 Тогда ДлительныеОперации.СообщитьПрогресс(Окр(Процент,0), "Текст"); КонецЕсли; КонецЦикла; Результат = Всего; Возврат Результат; КонецФункции |
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 |
&НаКлиенте Процедура ВыполнениеДолгойПроцедурыЗавершение(Результат, ДополнительныеПараметры) Экспорт Если Результат = Неопределено Тогда Возврат; КонецЕсли; Если Результат.Статус = "Ошибка" Тогда ПоказатьПредупреждение(,Результат.КраткоеПредставлениеОшибки); Иначе ДлительныеОперацииЗавершениеНаСервере(Результат.АдресРезультата); УдалитьИзВременногоХранилища(Результат.АдресРезультата); КонецЕсли; КонецПроцедуры &НаСервере Процедура ДлительныеОперацииЗавершениеНаСервере(АдресХранилища) Результат = ПолучитьИзВременногоХранилища(АдресХранилища); //Здесь должен быть код обработки полученного результата Сообщить("Сложная операция выполнена! Всего записано документов:" +Строка(Результат)); КонецПроцедуры |
Отладка
Для того, что бы поймать в отладчике выполнении “тяжелой” функции модуль менеджера, необходимо в меню Сервис -> Параметры написать в параметрах запуска РежимОтладки, но тогда соответственно процентов вы не увидите.
Образец расширения можно скачать в начале статьи.