Введение
Статья предназначена для программистов и администраторов, работающих с большими объемами данных. При этом в самой обработке есть понимание объема обрабатываемых данных и, как следствие, возможно отображение прогресса и хода обработки.
Предполагается, что имеются общие представления об использовании длительных операций в БСП. В противном случае рекомендую ознакомиться с этой статьей.
Использовалась БСП версии 2.3. На более ранних версиях это не работает, там нет такого программного интерфейса.
Прогресс выполнения
Если при выполнении длительных операций в фоне вам (или пользователям) не хочется просто смотреть на вращающийся кружок, а хочется знать, сколько обработалось данных и что в текущий момент обрабатывается, то в БСП есть механизм визуализации прогресса.
Процедура, являющаяся обработчиком команды, отображаемой на форме.
В ней производится передача исполнения на сервер в процедуру, инициирующую запуск длительной операции. После чего начинается ожидание завершения длительной операции.
Теперь в своей форме не надо описывать обработчики ожидания и запоминать идентификаторы заданий. Достаточно передать описание оповещения, которое вызовется при окончании фонового задания.
Если задание не завершится в течение 2 секунд, то вызовется форма ожидания, на которой будет отображаться прогресс выполнения операции и описание текущего действия.
&НаКлиенте
Процедура ВыполнитьПроцедуруФоново(Команда)
ДлительнаяОперация = ВыполнитьФоновоеЗаданиеНаСервере();
ПараметрыОжидания = ДлительныеОперацииКлиент.ПараметрыОжидания(ЭтотОбъект);
// указываем необходимость вывода прогресса состояния
ПараметрыОжидания.ВыводитьПрогрессВыполнения = Истина;
// указываем интервал обновления состояния в секундах, если не указать,
// то интервал будет увеличиваться при каждой итерации в 1.4 раза.
ПараметрыОжидания.Интервал = 2;
ДлительныеОперацииКлиент.ОжидатьЗавершение(
ДлительнаяОперация,
Новый ОписаниеОповещения("ВыполнитьПроцедуруФоновоВыполнено", ЭтотОбъект),
ПараметрыОжидания);
КонецПроцедуры
Серверная процедура, инициирующая запуск длительной операции
В данной процедуре формируются параметры запуска, и инициируется запуск длительной операции методом ВыполнитьВФоне.
&НаСервере
Функция ВыполнитьФоновоеЗаданиеНаСервере()
СтруктураПараметров = Новый Структура;
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
ПараметрыВыполнения.НаименованиеФоновогоЗадания = НСтр("ru = 'Наименование фонового задания'");
ДлительнаяОперация = ДлительныеОперации.ВыполнитьВФоне(
"ИмяМодуля.ИмяЭкспортнойПроцедуры",
СтруктураПараметров,
ПараметрыВыполнения);
Возврат ДлительнаяОперация;
КонецФункции
Сообщение о прогрессе
В самой процедуре длительной операции "ИмяМодуля.ИмяЭкспортнойПроцедуры" необходимо сообщать о прогрессе выполнения и описание текущего действия.
Данные сообщения собирает родительский сеанс и выводит в форму ожидания.
Процедура ИмяЭкспортнойПроцедуры(СтруктураПараметров, АдресРезультата) Экспорт
//...
ДлительныеОперации.СообщитьПрогресс(Окр(ПроцентВыполнения, 0), Описание);
//...
КонецПроцедуры
Процедура обработки результата
Данная процедура инициируется после завершения длительной операции. При завершении операции с ошибками есть возможность обработать их.
В случае успешного выполнения длительной операции, результат будет находиться во временном хранилище, находящемуся по адресу "Результат.АдресРезультата".
&НаКлиенте
Процедура ВыполнитьПроцедуруФоновоВыполнено(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат;
ИначеЕсли Результат.Статус = "Ошибка" Тогда
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Результат.ПодробноеПредставлениеОшибки);
ИначеЕсли Результат.Статус = "Выполнено" Тогда
// обрабатываем результат
//ОбработатьРезультат(Результат.АдресРезультата);
КонецЕсли;
КонецПроцедуры
Вот такая форма будет вызвана типовым кодом БСП:
Работаем над юзабилити
В текущем окне ожидания завершения длительной операции, на мой взгляд, есть следующие недостатки:
- Нет наглядности индикации прогресса. Выводится только текст, хотя есть возможность отображать индикатор.
- Нет оценки оставшегося времени выполнения операции.
- При нажатии на "Отмена" не отменяется фоновое задание, а просто закрывается форма.
- Перенести форму "ДлительнаяОперацияНовая" из обработки, приложенной к статье, в общие формы конфигурации.
- Заменить имя вызываемой формы ожидания в процедуре "ДлительныеОперацииКлиент.ОжидатьЗавершение" с "ОбщаяФорма.ДлительнаяОперация" на "ОбщаяФорма.ДлительнаяОперацияНовая".
Отладка длительных операций
И небольшой бонус (может кому будет полезным) - для отладки длительных операций в текущем сеансе достаточно запустить 1С:Предприятие с параметром запуска "РежимОтладки". Об этом кратко упоминается в документации. В этом случае не будет запущено фоновое задание, а переданную функцию система запустит в текущем сеансе. Это отлаживать намного удобнее.