Почему фоновое задание блокирует интерфейс и как отобразить процесс длительной операции в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке обработок в управляемом приложении часто возникает задача вынести тяжелые расчеты в фоновое задание, чтобы не блокировать работу пользователя. Однако нередко разработчики сталкиваются с ситуацией, когда процедура запускается как фоновая, но интерфейс все равно зависает, переключиться на другие окна программы нельзя, а стандартные средства информирования не срабатывают должным образом. Разберем по шагам, почему возникает такое поведение и как корректно организовать отображение процесса выполнения операции.

Причина блокировки интерфейса: влияние режима отладки

Проанализируем ключевую причину, из-за которой фоновое задание может вести себя как синхронный вызов. Если в параметрах запуска сеанса передан параметр РежимОтладки (или в типовых механизмах БСП включен соответствующий флаг), подсистема длительных операций принудительно переключается на синхронное выполнение в основном потоке.

Рассмотрим, зачем это сделано разработчиками платформы и БСП. В обычном асинхронном режиме серверный код выполняется в отдельном фоновом потоке, и для перехвата точек останова требуется специальная настройка отладчика. Чтобы упростить отладку кода процедур менеджера обработки, система принудительно выполняет код синхронно. В результате интерфейс клиентского приложения полностью блокируется до завершения работы процедуры.

Для восстановления асинхронного выполнения достаточно отключить параметр РежимОтладки в параметрах запуска информационной базы. После этого фоновое задание начинает выполняться в действительно параллельном потоке, разблокируя интерфейс и позволяя переключаться между вкладками и окнами.

Отображение анимации длительной операции на форме

Выясним, как настроить визуализацию процесса, используя стандартную системную пиктограмму БиблиотекаКартинок.ДлительнаяОперация48 непосредственно на управляемой форме обработки.

Разберем пошаговый порядок реализации неблокирующего интерфейса:

  1. Добавление визуального элемента на форму. В редакторе формы добавляем элемент Декорация с видом Картинка. В свойстве Картинка выбираем БиблиотекаКартинок.ДлительнаяОперация48. В свойствах элемента устанавливаем Видимость = Ложь, чтобы анимация не показывалась до старта процесса.
  2. Блокировка управляющих кнопок. Чтобы исключить повторные случайные нажатия пользователем, на время выполнения операции отключаем доступность кнопки запуска: свойство Доступность устанавливаем в значение Ложь.
  3. Запуск фонового задания. При нажатии кнопки вызываем процедуру запуска фонового потока (через функции ДлительныеОперации.ЗапуститьВыполнениеВФоне или метод ФоновыеЗадания.Выполнить), делаем декорацию видимой и регистрируем периодический опрос формы с помощью метода ПодключитьОбработчикОжидания.
  4. Циклическая проверка статуса. В процедуре обработчика ожидания проверяем состояние задания. Пока задание выполняется, платформа обеспечивает непрерывную анимацию индикатора, не мешая работе с другими окнами.
  5. Завершение операции. Когда задание переходит в состояние завершения, обязательно вызываем метод ОтключитьОбработчикОжидания, скрываем декорацию индикатора (Видимость = Ложь), возвращаем доступность кнопке запуска и получаем результат из временного хранилища.

Пример реализации запуска и ожидания фонового задания

Посмотрим на пример кода управляемой формы, демонстрирующий правильное управление состоянием интерфейса и таймером ожидания:


&НаКлиенте
Процедура ЗапуститьОбработку(Команда)
    
    // Блокируем кнопку запуска от повторных кликов
    Элементы.КнопкаВыполнить.Доступность = Ложь;
    
    // Включаем отображение анимированной картинки
    Элементы.ДекорацияИндикатор.Видимость = Истина;
    
    // Запускаем фоновую задачу на сервере
    ПараметрыЗадания = ЗапуститьЗаданиеНаСервере();
    ИдентификаторЗадания = ПараметрыЗадания.ИдентификаторЗадания;
    АдресРезультата = ПараметрыЗадания.АдресРезультата;
    
    // Подключаем опрос состояния
    ПодключитьОбработчикОжидания("ПроверитьВыполнениеЗадания", 2);
    
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьВыполнениеЗадания()
    
    Если ЗаданиеВыполнено(ИдентификаторЗадания) Тогда
        ОтключитьОбработчикОжидания("ПроверитьВыполнениеЗадания");
        
        // Скрываем индикатор и восстанавливаем доступность интерфейса
        Элементы.ДекорацияИндикатор.Видимость = Ложь;
        Элементы.КнопкаВыполнить.Доступность = Истина;
        
        ПолучитьРезультат(АдресРезультата);
        ПоказатьОповещениеПользователя("Успешно", , "Обработка завершена!");
    КонецЕсли;
    
КонецПроцедуры

Особенности и тонкости работы фоновых заданий

Рассмотрим важные нюансы, которые необходимо учитывать при разработке неблокирующих фоновых процессов:

  1. Файловый режим работы. Следует помнить, что в файловых базах данных параллельность потоков ограничена архитектурой платформы. При высокой дисковой активности интерфейс может кратковременно подвисать даже при корректно запущенном фоновом задании. Полноценная асинхронность обеспечивается в клиент-серверном режиме (SQL).
  2. Контроль закрытия формы. Если форма остается не заблокированной, пользователь может случайно закрыть её до окончания серверного процесса. В обработчике формы ПередЗакрытием необходимо предусмотреть проверку выполняющегося задания и, при необходимости, принудительно прерывать его методом Отменить(), чтобы сервер не расходовал ресурсы вхолостую.
  3. Передача прогресса выполнения. Если требуется показывать не только вращающийся индикатор, но и процент выполнения или текущий шаг, следует использовать передачу сообщений через временное хранилище или механизм ДлительныеОперации.СообщитьПрогресс, считывая актуальный статус в цикле обработчика ожидания на клиенте.
← На главную