Мой вариант реализации прогресс бара в статусной строке для неуправляемых форм 1С 8.х
Привожу код тестовой обработки, содержащей функции реализации прогресс бара:
Пример, как работает GIF
Перем СтатусИтерация, СтатусМаксимум, СтатусРасшифровка;
Процедура ПересчетКонтрагентовНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Покупатель = ИСТИНА";
Результат = Запрос.Выполнить();
ПрогрессБарСброс("Обход контрагентов"); //Сброс и установка текста статуса.
ПрогрессБар(0,Результат.Выгрузить().Количество()); //Установка максимального значения прогресс бара.
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ПрогрессБар(); //Увеличение шага итерации и отрисовка прогресс бара в статус строке.
ЭлементыФормы.Надпись1.Заголовок = ВыборкаДетальныеЗаписи.Ссылка.Наименование;
ОбработкаПрерыванияПользователя();
КонецЦикла;
КонецПроцедуры
//------------------------------------------------------------------------------
// Статус строка
//------------------------------------------------------------------------------
Процедура СтатусСтрока() //Отрисовка прогресбара в статус строке
Процент = ?(СтатусМаксимум>0,Окр(СтатусИтерация/СтатусМаксимум*100),0);
сс="----------------------------------------------------------------------------------------------------";
ссл=Лев(сс,Процент);сср=Прав(сс,100-Процент);
ссл=СтрЗаменить(ссл,"-","]");
сс=ссл+сср;
Состояние(""+СтатусРасшифровка+": "+сс+" "+Процент+"%");
КонецПроцедуры
Процедура ПрогрессБарСброс(СтТекст="") //Сбрасывает прогресбар с статус строке
//При указании параметра - устанавливаем текстовое значение прогресс бара
СтатусРасшифровка = СтТекст;
СтатусИтерация=0;
СтатусМаксимум=0;
Состояние("");
КонецПроцедуры
Процедура ПрогрессБар(ДобавитьИтерацию=1,ДобавитьМаксимум=0) //шаг итерации
// ПрогрессБар() - увеличивает шаг на 1
// ПрогрессБар(0,Максимальное значение) - устанавливает максимум для значения прогресс бара
СтатусИтерация=СтатусИтерация+ДобавитьИтерацию;
СтатусМаксимум=СтатусМаксимум+ДобавитьМаксимум;
СтатусСтрока();
КонецПроцедуры
ПыСы: в коде пришлось вставить другие, упрощенные символы формирования полосы прогрессбара. В фото и гифке использовал символы из стандартной таблицы символов Windows. А вообще можете подобрать на свое усмотрение.
Честно говоря, боян, но симпатишный
Производительность будет минимальной…
Не имеет смысла использовать данный метод при обработке больших объемов данных
Плюс за оригинальность отображения, возьму на заметку. С производительностью — да плохо. Но индикацию попробую прикрутить к своей индикации. (кстати когда-то брал здесь жеЭффективная индикация в 8.2 и Правильная индикация прогресса цикла )
(3) идея не оригинальна. Тут уже было несколько таких, правда давно.
(2)(3) и да… давно уже доказано, что индикация процесса ОЧЕНЬ тормозит работу. Чтобы сократить этот эффект статус надо выводить раз в сколько-то тактов или раз в минуту.
Согласен с тем, что отображать каждый шаг — не рационально.
Показать
Вот так будет выводить раз в секунду. А выводить каждую N-нную итерацию считаю не верным, ибо цикл может работать по 10-20 секунд один обход, а может и долю секунды.
А зачем это нужно? на крайний случай в форме можно разместить стандартный объект «индикатор», а в статус баре выводить основные этапы исполнения кода:
Выполняется Запрос….
Формирование табличного документа…
и т.д.
Или вообще, можно сделать общую форму с индикатором, передавать в нее все необходимые данные и открыть в любом месте окна, хоть вертикально.
Спасибо за идею!
Немного модифицировал для использования в общих модулей, без объявления переменных.
Передаю эти переменные через структуру
Показать
Вызовы будут выглядеть так: