29 ноября 2013 г.

Когда закончится обработка

Знакома ли вам эта неловкая ситуация, когда устанавливаешь обновление конфигурации, и вдруг начинается реструктуризация таблиц. Таблицы оказываются большими, обновление затягивается, и пользователи начинают приставать с вопросами: "Ну, когда же можно будет работать?" Вы отвечаете: "Не знаю...". А они опять: "Ну хотя бы примерно?" Но разработчики платформы "1С:Предприятие", видимо, посчитали, что информировать пользователей о ходе выполнения процесса не обязательно и, соответственно, этого не сделали. И даже более того - разработчики не предусмотрели возможности прервать процесс. Ну, да ладно, оставим это на их совести. Здесь мы всё равно ничем помочь не сможем. Давайте будем делать то, что в наших силах.

В статье "Как прервать выполнение обработки в 1С 8" я рассказывал, как предоставить пользователю возможность прерывать затянувшиеся по времени процессы. Но это лишь полдела. Ведь неизбежно возникает вопрос: как пользователь должен догадаться, что процесс затянется надолго? По факту того, что он уже долго выполняется? А если остаётся совсем немного, а пользователь прервёт процесс? Решение: пользователя нужно информировать о ходе выполнения программы.



Сейчас я вам продемонстрирую три способа информирования пользователя о ходе выполнения цикла обработки:
  1. Показываем факт выполнения в абсолютном выражении.
  2. Показываем факт выполнения в процентах.
  3. Показываем расчётное время завершения.
Для упрощения все три способа я покажу в одном примере. На практике так делать не обязательно. Достаточно использовать один из трёх способов. В реальных задачах, как правило, приходится иметь дело с выборками данных, обрабатывая их в цикле. Для примера же, чтобы он был рабочим, я возьму простой цикл Для ... Цикл.

Создайте обработку. В процедуре обработки события нажатия на кнопку "Выполнить" напишите такой код:

Процедура КнопкаВыполнитьНажатие(Кнопка)
   ВремяНачальное = ТекущаяДата();
   КоличествоЦиклов = 100000;
   Для Счетчик = 1 По КоличествоЦиклов Цикл
      //здесь выполняется полезная работа с данными
      //...
      
      //Информируем пользователя о ходе выполнения обработки
      ПроцентВыполнения = Окр(Счетчик / КоличествоЦиклов * 100, 0);
      РасчетноеВремяЗавершения = ВремяНачальное + Окр((ТекущаяДата() - ВремяНачальное) * КоличествоЦиклов / Счетчик, 0);
      Состояние("Выполнено " + Счетчик + " из " + КоличествоЦиклов + " (" + ПроцентВыполнения + "%). Расчётное время завершения " + РасчетноеВремяЗавершения);
      //Дадим пользователю возможность прервать обработку
      ОбработкаПрерыванияПользователя();
   КонецЦикла;
КонецПроцедуры

Запустите обработку и посмотрите, как это работает. Вот теперь пользователю все карты в руки.

P. S. Вот примерно такую статью вы можете разместить в этом блоге, а взамен получить до двух ссылок на свои ресурсы. Подробности здесь.

Комментировать в ВКонтакте

Комментировать в Facebook

Комментировать в Blogger

Комментариев нет:

Отправить комментарий