Главная страница » Как сделать прогресс бар в 1с

Как сделать прогресс бар в 1с

В 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 По МаксимальноеЗначение Цикл

// Ваша длительная операция…

// …

// Отправляем данные на форму для обновления индикатора:

ДанныеФормы = Новый Структура;

ДанныеФормы. Вставить("ТекущееПоложение", Счетчик);

ДанныеФормы. Вставить("Заголовок", "Обработано " + Счетчик + " из " + МаксимальноеЗначение);

СообщитьДанныеФорме(ИдентификаторФормы, ДанныеФормы);

// Проверка на отмену (обязательно!):

Если ФоновыеЗадания. Отменено(ЭтаФункция) Тогда

Прервать;

КонецЕсли;

КонецЦикла;

СообщитьДанныеФорме(ИдентификаторФормы, Новый Структура("Заголовок", "Операция завершена!"));

КонецПроцедуры

// В форме:

Процедура ОбработкаДанныхФормы(Данные)

Если Данные. Свойство("ТекущееПоложение") Тогда

ИндикаторПрогресса. ТекущееПоложение = Данные. ТекущееПоложение;

КонецЕсли;

Если Данные. Свойство("Заголовок") Тогда

ИндикаторПрогресса. Заголовок = Данные. Заголовок;

КонецЕсли;

КонецПроцедуры

Этот пример демонстрирует основную идею:

Запускаем фоновое задание из формы. Фоновое задание выполняет длительную операцию. Фоновое задание отправляет данные (текущее положение, заголовок) на форму через СообщитьДанныеФорме(). В форме обрабатываем эти данные в процедуре ОбработкаДанныхФормы() и обновляем индикатор прогресса. Фоновое задание проверяет, не была ли запрошена отмена (ФоновыеЗадания. Отменено()).

Реализация фоновых заданий может быть сложной, но она необходима для создания отзывчивых приложений.

Оставьте комментарий

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

Прокрутить вверх