Прогресс бар в статус строке для неуправляемых форм

Мой вариант реализации прогресс бара в статусной строке для неуправляемых форм 1С 8.х

 

Привожу код тестовой обработки, содержащей функции реализации прогресс бара:

Пример, как работает GIF 

Перем СтатусИтерация, СтатусМаксимум, СтатусРасшифровка;

Процедура ПересчетКонтрагентовНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.Покупатель = ИСТИНА";
Результат = Запрос.Выполнить();
ПрогрессБарСброс("Обход контрагентов"); //Сброс и установка текста статуса.
ПрогрессБар(0,Результат.Выгрузить().Количество()); //Установка максимального значения прогресс бара.

ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ПрогрессБар(); //Увеличение шага итерации и отрисовка прогресс бара в статус строке.

ЭлементыФормы.Надпись1.Заголовок = ВыборкаДетальныеЗаписи.Ссылка.Наименование;
ОбработкаПрерыванияПользователя();
КонецЦикла;
КонецПроцедуры

//------------------------------------------------------------------------------
// Статус строка
//------------------------------------------------------------------------------
Процедура СтатусСтрока() //Отрисовка прогресбара в статус строке
Процент = ?(СтатусМаксимум>0,Окр(СтатусИтерация/СтатусМаксимум*100),0);
сс="----------------------------------------------------------------------------------------------------";
ссл=Лев(сс,Процент);сср=Прав(сс,100-Процент);
ссл=СтрЗаменить(ссл,"-","]");
сс=ссл+сср;
Состояние(""+СтатусРасшифровка+": "+сс+" "+Процент+"%");
КонецПроцедуры
Процедура ПрогрессБарСброс(СтТекст="") //Сбрасывает прогресбар с статус строке
//При указании параметра - устанавливаем текстовое значение прогресс бара
СтатусРасшифровка = СтТекст;
СтатусИтерация=0;
СтатусМаксимум=0;
Состояние("");
КонецПроцедуры
Процедура ПрогрессБар(ДобавитьИтерацию=1,ДобавитьМаксимум=0) //шаг итерации
// ПрогрессБар() - увеличивает шаг на 1
// ПрогрессБар(0,Максимальное значение) - устанавливает максимум для значения прогресс бара
СтатусИтерация=СтатусИтерация+ДобавитьИтерацию;
СтатусМаксимум=СтатусМаксимум+ДобавитьМаксимум;
СтатусСтрока();
КонецПроцедуры

ПыСы: в коде пришлось вставить другие, упрощенные символы формирования полосы прогрессбара. В фото и гифке использовал символы из стандартной таблицы символов Windows. А вообще можете подобрать на свое усмотрение. symbols

9 Comments

  1. anig99

    Честно говоря, боян, но симпатишный

    Reply
  2. denis_aka_wolf

    Производительность будет минимальной…

    Не имеет смысла использовать данный метод при обработке больших объемов данных

    Reply
  3. Созинов

    Плюс за оригинальность отображения, возьму на заметку. С производительностью — да плохо. Но индикацию попробую прикрутить к своей индикации. (кстати когда-то брал здесь же Эффективная индикация в 8.2 и Правильная индикация прогресса цикла)

    Reply
  4. anig99

    (3) идея не оригинальна. Тут уже было несколько таких, правда давно.

    (2)(3) и да… давно уже доказано, что индикация процесса ОЧЕНЬ тормозит работу. Чтобы сократить этот эффект статус надо выводить раз в сколько-то тактов или раз в минуту.

    Reply
  5. endryu

    Согласен с тем, что отображать каждый шаг — не рационально.

    Перем СтатусВремя;
    …
    …
    …
    Процедура ПрогрессБарСброс(СтТекст=»») //Сбрасывает прогресбар с статус строке
    //При указании параметра — устанавливаем текстовое значение прогресс бара
    СтатусРасшифровка = СтТекст;
    СтатусИтерация=0;
    СтатусМаксимум=0;
    СтатусВремя = ТекущаяДата();
    Состояние(«»);
    КонецПроцедуры
    Процедура ПрогрессБар(ДобавитьИтерацию=1,ДобавитьМаксимум=0) //шаг итерации
    // ПрогрессБар() — увеличивает шаг на 1
    // ПрогрессБар(0,Максимальное значение) — устанавливает максимум для значения прогресс бара
    СтатусИтерация=СтатусИтерация+ДобавитьИтерацию;
    СтатусМаксимум=СтатусМаксимум+ДобавитьМаксимум;
    Если (ТекущаяДата()-СтатусВремя)>1 тогда
    СтатусВремя = ТекущаяДата();
    СтатусСтрока();
    КонецЕсли;
    КонецПроцедуры
    

    Показать

    Вот так будет выводить раз в секунду. А выводить каждую N-нную итерацию считаю не верным, ибо цикл может работать по 10-20 секунд один обход, а может и долю секунды.

    Reply
  6. 1cprogr_nsk

    А зачем это нужно? на крайний случай в форме можно разместить стандартный объект «индикатор», а в статус баре выводить основные этапы исполнения кода:

    Выполняется Запрос….

    Формирование табличного документа…

    и т.д.

    Reply
  7. 1cprogr_nsk

    Или вообще, можно сделать общую форму с индикатором, передавать в нее все необходимые данные и открыть в любом месте окна, хоть вертикально.

    Reply
  8. user676376_tp7273

    Спасибо за идею!

    Немного модифицировал для использования в общих модулей, без объявления переменных.

    Передаю эти переменные через структуру

    Процедура СтатусСтрока(структураСтатус) ЭКСПОРТ //Отрисовка прогресбара в статус строке
    Процент = ?(структураСтатус.СтатусМаксимум>0,Окр(структураСтатус.СтатусИтерация/структураСтатус.СтатусМаксимум*100),0);
    сс=»—————————————————————————————————-«;
    ссл=Лев(сс,Процент);сср=Прав(сс,100-Процент);
    ссл=СтрЗаменить(ссл,»-«,»]»);
    сс=ссл+сср;
    Состояние(«»+структураСтатус.СтатусРасшифровка+»: «+сс+» «+Процент+»%»);
    КонецПроцедуры
    Процедура ПрогрессБарСброс(СтТекст=»»,структураСтатус) ЭКСПОРТ//Сбрасывает прогресбар с статус строке
    //При указании параметра — устанавливаем текстовое значение прогресс бара
    структураСтатус = новый структура;
    структураСтатус.Вставить(«СтатусРасшифровка»,СтТекст);
    //структураСтатус.СтатусРасшифровка = СтТекст;
    структураСтатус.Вставить(«СтатусИтерация»,0);
    //структураСтатус.СтатусИтерация=0;
    структураСтатус.Вставить(«СтатусМаксимум»,0);
    //структураСтатус.СтатусМаксимум=0;
    Состояние(«»);
    КонецПроцедуры
    Процедура ПрогрессБар(ДобавитьИтерацию=1,ДобавитьМаксимум=0,структураСтатус) ЭКСПОРТ //шаг итерации
    // ПрогрессБар() — увеличивает шаг на 1
    // ПрогрессБар(0,Максимальное значение) — устанавливает максимум для значения прогресс бара
    структураСтатус.СтатусИтерация=структураСтатус.СтатусИтерация+ДобавитьИтерацию;
    структураСтатус.СтатусМаксимум=структураСтатус.СтатусМаксимум+ДобавитьМаксимум;
    СтатусСтрока(структураСтатус);
    КонецПроцедуры

    Показать

    Вызовы будут выглядеть так:

     СТАТ = «»;
    ВашМодуль.ПрогрессБарСброс(«Ищем контрагентов»,СТАТ); //Сброс и установка текста статуса.
    ВашМодуль.ПрогрессБар(0,КоличествоИтераций,СТАТ);
    ВашМодуль.ПрогрессБар(,,СТАТ); 
    Reply
  9. necropunk

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *