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

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