Индикатор в 1С — улучшение

В предыдущей публикации я описал, как можно вывести графический индикатор средствами 1С, без редактирования формы. С тех пор я создал функции для управления индикатором с любого места. И теперь не нужно постоянно копировать код и вставлять его в определенные места цикла — достаточно просто вызвать нужную функцию. Напомню, что индикатор выводится с помощью СКД.

Итак, что нам нужно:

1. Вынести указанные ниже процедуры в общий модуль.

Общий модуль

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//УПРАВЛЕНИЕ ИНДИКАТОРОМ//
Функция ИнициализироватьИндикатор(ПраваяГраница) Экспорт
НастройкаИндикатора = Новый Структура;
//установка параметров для вывода прецентов
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.ОтображатьПроцентВывода = Истина;
ЭлементПроцессора = Новый ЭлементРезультатаКомпоновкиДанных;
Шаг = ?(ПраваяГраница = 0, 0, 100 / ПраваяГраница);
ТекПроцент = 0;
ПроцессорВывода.НачатьВывод();
 
НастройкаИндикатора.Вставить("ПроцессорВывода", ПроцессорВывода);
НастройкаИндикатора.Вставить("ЭлементПроцессора", ЭлементПроцессора);
НастройкаИндикатора.Вставить("Шаг", Шаг);
НастройкаИндикатора.Вставить("ТекПроцент", ТекПроцент);
Возврат НастройкаИндикатора;
КонецФункции
 
Процедура СдвинутьИндикатор(НастройкаИндикатора) Экспорт 
Если ТипЗнч(НастройкаИндикатора) <> Тип("Структура") Тогда
Возврат;
КонецЕсли;
 
//получаем переменные
ТекПроцент = НастройкаИндикатора.ТекПроцент;
Шаг = НастройкаИндикатора.Шаг;
ЭлементПроцессора = НастройкаИндикатора.ЭлементПроцессора;
ПроцессорВывода = НастройкаИндикатора.ПроцессорВывода;
 
//вывод процента
ТекПроцент = ТекПроцент + Шаг;
ЭлементПроцессора.ПроцентВывода = ТекПроцент;
ПроцессорВывода.ВывестиЭлемент(ЭлементПроцессора);
 
НастройкаИндикатора.Вставить("ПроцессорВывода", ПроцессорВывода);
НастройкаИндикатора.Вставить("ЭлементПроцессора", ЭлементПроцессора);
НастройкаИндикатора.Вставить("Шаг", Шаг);
НастройкаИндикатора.Вставить("ТекПроцент", ТекПроцент);
КонецПроцедуры
 
Процедура ДеАктивироватьИндикатор(НастройкаИндикатора) Экспорт 
ПроцессорВывода = НастройкаИндикатора.ПроцессорВывода;
 
ПроцессорВывода.ЗакончитьВывод();
ПроцессорВывода = Неопределено;
 
НастройкаИндикатора = Неопределено;
КонецПроцедуры //

2. Затем в определенных местах цикла вызывать нужные функции

  1. Перед циклом — инициализация индикатора и вспомогательных параметров
  2. В цикле — метод смещения индикатора на нужную величину
  3. После цикла — выключение индикатора

Пример:

в цикле

1
2
3
4
5
6
7
8
9
10
// передаем в функцию инициализации индикатора количество итераций цикла, для расчета шага индикатора
ПараметрыИндикатора = УниверсальныеМеханизмы.ИнициализироватьИндикатор(Выборка.Количество());
 
Пока Выборка.Следующий() Цикл
//какие-то обработчики цикла
 
УниверсальныеМеханизмы.СдвинутьИндикатор(ПараметрыИндикатора); //сдвигаем индикатор
КонецЦикла;
 
УниверсальныеМеханизмы.ДеАктивироватьИндикатор(НастройкаИндикатора);//выключаем индикатор

Дополнение. Как я указывал ранее, при выводе индикатора выводится также надпись «Вывод отчета». Но если вызвать метод «Состояние ()» при выводе индикатора — текст будет изображаться с индикатором. Вот маленькая хитрость для вывода описания операции, для которой выводится индикатор.

Дополнение 2. Как подметил Данилюк Андрей в 1С 8.2 в управляемых формах описанный мною подход заменяет простой вызов метода «Состояние ()». А в обычном режиме можно использовать СКД 🙂