В 1С существует несколько способов создать и отобразить прогресс бар, в зависимости от того, где вы хотите его отображать (форма, окно сообщений) и какой функциональности вы хотите достичь. Вот несколько основных подходов с примерами кода:
1. Прогресс бар в форме (рекомендуется для длительных операций в пользовательском интерфейсе):
Этот способ позволяет пользователю видеть прогресс непосредственно в форме, не блокируя интерфейс (если операция выполняется в фоновом режиме).
- Используем элемент формы “ИндикаторВыполнения”: Добавьте элемент формы “ИндикаторВыполнения” на вашу форму. В конфигураторе откройте форму, перейдите на вкладку “Элементы формы”, нажмите “Добавить” -> “ИндикаторВыполнения”. Назовите его, например, ИндикаторПрогресса. В коде формы (обычно в процедуре, где выполняется длительная операция) используйте методы элемента формы:
3. Процедура ВыполнитьДлительнуюОперацию() Экспорт
4.
5. МаксимальноеЗначение = 100; // Общее количество шагов
6. ИндикаторПрогресса. МинимальноеЗначение = 0;
7. ИндикаторПрогресса. МаксимальноеЗначение = МаксимальноеЗначение;
8. ИндикаторПрогресса. ОтображатьПроцентВыполнения = Истина; // Отображать процент
9.
10. Для Счетчик = 1 По МаксимальноеЗначение Цикл
11.
12. // Здесь ваша длительная операция…
13. // Например:
14. // Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ Справочник. Номенклатура");
15. // Результат = Запрос. Выполнить();
16. // Пока Результат. Следующий() Цикл
17. // // Что-то делаем с данными
18. // КонецЦикла;
19.
20. ИндикаторПрогресса. ТекущееПоложение = Счетчик;
21. ИндикаторПрогресса. Заголовок = "Обработано " + Счетчик + " из " + МаксимальноеЗначение;
22. ОбновитьОтображение(); // Важно для обновления UI
23.
24. КонецЦикла;
25.
26. Сообщить("Операция завершена!");
27.
28. КонецПроцедуры
- Важные моменты:
- ОбновитьОтображение(): Ключевой момент! Без этой процедуры 1С может не обновлять индикатор прогресса вовремя. Эта процедура заставляет UI перерисоваться. Фоновые задания (Рекомендуется для больших операций): Чтобы не блокировать интерфейс пользователя, настоятельно рекомендуется запускать длительные операции в фоновом задании. Связывайте индикатор прогресса с данными, которые фоновое задание обновляет. (Этот вариант сложнее, требует знаний о механизме фоновых заданий).
2. Прогресс бар в окне сообщений (простой, но блокирует интерфейс):
Это самый простой способ, но он Блокирует пользовательский интерфейс на время выполнения операции. Не рекомендуется для длительных операций.
Процедура ВыполнитьДлительнуюОперацию() Экспорт
МаксимальноеЗначение = 100;
Попытка
Состояние("Запуск длительной операции…");
Для Счетчик = 1 По МаксимальноеЗначение Цикл
// Ваша длительная операция…
// …
Состояние("Обработано " + Счетчик + " из " + МаксимальноеЗначение + " (" + Окр(Счетчик / МаксимальноеЗначение * 100, 0) + "%)");
КонецЦикла;
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
Состояние("Операция завершена!");
КонецПроцедуры
- Состояние(): Функция Состояние() отображает текст в строке состояния внизу окна 1С. Она также отображает встроенный индикатор выполнения (если операция длится достаточно долго).
3. Прогресс бар с использованием обработки “Ожидание” (не рекомендуется для длительных операций):
Этот способ показывает окно “Ожидание” с текстом. Хотя визуально похоже на прогресс, это скорее просто индикатор загрузки.
Процедура ВыполнитьДлительнуюОперацию() Экспорт
МаксимальноеЗначение = 100;
Попытка
ПоказатьОжидание("Запуск длительной операции…", Истина); // Истина — отображать отмену
Для Счетчик = 1 По МаксимальноеЗначение Цикл
// Ваша длительная операция…
// …
ПоказатьОжидание("Обработано " + Счетчик + " из " + МаксимальноеЗначение);
КонецЦикла;
Исключение
Сообщить("Ошибка: " + ОписаниеОшибки());
КонецПопытки;
СкрытьОжидание();
КонецПроцедуры
- ПоказатьОжидание() и СкрытьОжидание(): Управляют отображением окна “Ожидание”. Второй параметр ПоказатьОжидание() (Истина) добавляет кнопку “Отмена”. Этот метод также Блокирует интерфейс.
Выбор способа:
- Для длительных операций, не блокирующих UI: ИндикаторВыполнения на форме + Фоновые задания. Это самый сложный, но и самый удобный для пользователя способ. Для операций средней длительности (несколько секунд) на форме: ИндикаторВыполнения на форме + ОбновитьОтображение(). Для коротких операций (мгновенные): Можно использовать Состояние() или ПоказатьОжидание(), но обычно в этом нет необходимости.
Рекомендации:
- Избегайте блокировки интерфейса. Используйте фоновые задания и индикаторы прогресса на форме, чтобы пользователь мог продолжать работать, пока выполняется длительная операция. Регулярно обновляйте индикатор прогресса. Используйте ОбновитьОтображение() или обновляйте данные, привязанные к фоновому заданию, чтобы индикатор показывал актуальную информацию. Предусмотрите возможность отмены. Добавьте кнопку “Отмена” и обработчик для остановки операции (особенно для фоновых заданий). Предусмотрите обработку ошибок. Используйте блоки Попытка…Исключение, чтобы корректно обрабатывать ошибки и сообщать о них пользователю.
Пример использования фонового задания и ИндикатораВыполнения (упрощенный):
// В форме:
Перем ОбъектФоновогоЗадания Экспорт;
Процедура КнопкаВыполнитьНажатие(Элемент)
ПараметрыФоновогоЗадания = Новый Структура;
ПараметрыФоновогоЗадания. Вставить("МаксимальноеЗначение", 100);
ПараметрыФоновогоЗадания. Вставить("ИдентификаторФормы", ЭтаФорма. Идентификатор);
ОбъектФоновогоЗадания = ФоновыеЗадания. Выполнить("ИмяВашегоФоновогоЗадания", ПараметрыФоновогоЗадания);
ИндикаторПрогресса. МинимальноеЗначение = 0;
ИндикаторПрогресса. МаксимальноеЗначение = 100;
ИндикаторПрогресса. ОтображатьПроцентВыполнения = Истина;
ИндикаторПрогресса. Заголовок = "Запущено…";
КонецПроцедуры
// В общем модуле (с галкой "Сервер" и "ВызовСервера"):
Процедура ИмяВашегоФоновогоЗадания(Параметры) Экспорт
МаксимальноеЗначение = Параметры. МаксимальноеЗначение;
ИдентификаторФормы = Параметры. ИдентификаторФормы;
Для Счетчик = 1 По МаксимальноеЗначение Цикл
// Ваша длительная операция…
// …
// Отправляем данные на форму для обновления индикатора:
ДанныеФормы = Новый Структура;
ДанныеФормы. Вставить("ТекущееПоложение", Счетчик);
ДанныеФормы. Вставить("Заголовок", "Обработано " + Счетчик + " из " + МаксимальноеЗначение);
СообщитьДанныеФорме(ИдентификаторФормы, ДанныеФормы);
// Проверка на отмену (обязательно!):
Если ФоновыеЗадания. Отменено(ЭтаФункция) Тогда
Прервать;
КонецЕсли;
КонецЦикла;
СообщитьДанныеФорме(ИдентификаторФормы, Новый Структура("Заголовок", "Операция завершена!"));
КонецПроцедуры
// В форме:
Процедура ОбработкаДанныхФормы(Данные)
Если Данные. Свойство("ТекущееПоложение") Тогда
ИндикаторПрогресса. ТекущееПоложение = Данные. ТекущееПоложение;
КонецЕсли;
Если Данные. Свойство("Заголовок") Тогда
ИндикаторПрогресса. Заголовок = Данные. Заголовок;
КонецЕсли;
КонецПроцедуры
Этот пример демонстрирует основную идею:
Запускаем фоновое задание из формы. Фоновое задание выполняет длительную операцию. Фоновое задание отправляет данные (текущее положение, заголовок) на форму через СообщитьДанныеФорме(). В форме обрабатываем эти данные в процедуре ОбработкаДанныхФормы() и обновляем индикатор прогресса. Фоновое задание проверяет, не была ли запрошена отмена (ФоновыеЗадания. Отменено()).
Реализация фоновых заданий может быть сложной, но она необходима для создания отзывчивых приложений.