Copyright © 2010 Promsite. All Rights Reserved.
P  R  O  M  S  I  T  E
Статьи по 1С
стр. 1
стр. 1
Прогрессор
       
       При выполнении какой-нибудь обработки иногда и не поймешь то ли что-то выполняется, то ли все застыло. Можно. конечно выводить информацию в строку состояния, а если хочется покрасивее.
       Тогда варианты: использовать внешнюю компоненту или извратиться с кодом и получить подобие индикатора. В ЗиК есть пример на оригинальное использование списка значения при выводе индикатора (в других я не встречал). Посмотрим как его можно использовать.
       Для опытов создадим какой-нибудь отчет. На форму поместим два статика, так называется элемент формы диалога с типом Текст.

       У длинного поля идентификатор: Прогрессор, у поля где процент идентификатор: ПроцентПрогрессора.
В типовой ЗиК есть одна функция глСоздатьПрогрессор() и две процедуры глОбновитьПрогрессор(Прогрессор, Процент) и глСброситьПрогрессор(Прогрессор), которые вынесены в глобальный модуль.

       В типовой ЗиК прогрессор использует обработка по загрузке адресных классификаторов. Нам для демонстрационных целей лучше прописать названные функции и процедуры в контексте самого отчета. Убрать, конечно передачу контекста из кода и все лишние. Вот что получится:

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


Теперь сравните этот код с кодом из Зик. От него почти ничего и не осталось, я же говорил, что фирма 1С старается писать универсальные функции.
Download: внешний отчет Progressor.zip 2.54 kb.

Для отображения Облака ссылок
необходим
Adobe Flash Player 9
или выше.