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