gifts2017

Расчет времени до завершения операции с отображением индикатора состояния

Опубликовал Николай Чирясов (pridecom) в раздел Программирование - Работа с интерфейсом

Это кусок кода для отображения стандартного прогрессбара в УТ 10 с информированием расчетного оставшегося времени.

Иногда приходится создавать отчеты, время формирования которых достигает существенного объема. Конечно первое что приходит на ум это оптимизация кода с целью уменьшения времени расчетов, но бывают случаи, когда это невозможно и поэтому нужно оповестить пользователя о примерном времени формирования отчета/данных.

Данный код пригодится для отображения прогрессбара с расчетным оставшемся временем.

Подходит для УТ 10, УПП и без труда может быть оптимизирован под любые другие конфигурации.

Позаботьтесь о пользователях, отпустите их выпить чашку кофе, пока выполняется обработка. 


ФормаИндикатора = ПолучитьОбщуюФорму("ХодВыполненияОбработкиДанных");
ФормаИндикатора.НаименованиеОбработкиДанных = "Чтение данных";
ФормаИндикатора.КомментарийОбработкиДанных = "Выполнение запроса";
ФормаИндикатора.Открыть();
ФормаИндикатора.ЭлементыФормы.Индикатор.МаксимальноеЗначение = Выборка.Количество();
ВсегоОбъектов =  Выборка.Количество() ;
текПроцент = 0 ;
минОсталось = 0 ;
Прогноз = 0;
ВремяСтарта = ТекущаяДата() ;
СуммаЗаказа = 0 ;
КолВоЗаказа = 0 ;
Товары.Очистить();
Пока Выборка.Следующий() Цикл
                Ном = Ном +1 ;
                //формула
                //минОсталось = минПрошло*100/текПроцентОстаток
                //где
                //текПроцент =  текЭлемент*100/ВсегоОбъектов ;
                текПроцент  = Ном * 100 / ФормаИндикатора.ЭлементыФормы.Индикатор.МаксимальноеЗначение ;
                минПрошло   = (ТекущаяДата () - ВремяСтарта)  ;
                Прогноз =    минПрошло*100/текПроцент ;
                минОсталось = Окр(Прогноз - минПрошло,0);
                ФормаИндикатора.ЭлементыФормы.Индикатор.Значение = Ном;
                ФормаИндикатора.КомментарийОбработкиДанных = "Обработка элемента (" + Ном + " из " + ВсегоОбъектов + ") " + "Осталось: "+минОсталось+" сек.";
                ФормаИндикатора.ЭлементыФормы.КомментарийЗначения.Значение = Строка(Выборка.Номенклатура);//+"  Прошло: "+Окр(минПрошло,1)+ " мин.";
КонецЦикла;
ФормаИндикатора.Закрыть()   ;

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Ruslan (rus128) 12.04.12 12:37
все гениальное - просто!
2. Stamper (Stamper) 18.04.12 12:36
а замером производительности "проходились" по выполнению?
по моему опыту операция обработки интерфейса (Сообщить, вывод на форме) раз в 10 медленнее операции какого-нибудь действия. не стало ли в разы медленнее, но с информацией? =)