Індикатор в 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 в керованих формах описаний мною підхід замінює простий виклик метода “Состояние()”. А в звичайному режимі можна використовувати СКД 🙂