Запуск асинхронных процессов и механизм ожидания завершения

Мы уже научились использовать программный интерфейс (API) модуля «ОбщегоНазначения» для эффективного извлечения данных. Это значительно упростило наш код. Однако в разработке на платформе «1С:Предприятие» существует ситуация, когда даже самый идеальный код может вызвать недовольство пользователей: это «зависание» интерфейса при выполнении тяжелых задач.

Проблема блокировки интерфейса

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

Рассмотрим два подхода к реализации одной и той же задачи.

Линейное выполнение (блокирует работу):

// При нажатии кнопки интерфейс "замирает" до конца цикла
&НаСервере
Procedure CalculateHeavyData()
    // Имитация долгой работы
    For i = 1 To 1000000 Do
        // Какие-то сложные вычисления
    EndDo;
EndProcedure

Асинхронное выполнение через БСП (сохраняет отзывчивость): Мы делегируем задачу фоновому заданию, а пользователю показываем индикатор прогресса. Это и есть Асинхронность — способ организации работы, при котором основная программа не ждет завершения тяжелой операции, а продолжает взаимодействовать с пользователем.

Ключевые понятия

Для реализации правильного подхода в БСП используются следующие механизмы:

  • Фоновое задание — отдельный процесс на сервере «1С», который выполняет программный код независимо от основного сеанса пользователя.
  • Длительные операции — специальная подсистема БСП, которая предоставляет готовые инструменты для управления фоновыми заданиями, их запуска и мониторинга.
  • Окно ожидания — стандартная визуальная форма БСП, которая информирует пользователя о том, что процесс идет, и позволяет при необходимости прервать его или перевести в фоновый режим (скрыть).

Важно помнить: Фоновое задание выполняется в отдельном сеансе. Оно не имеет доступа к открытым формам или временным переменным вашего текущего сеанса. Все необходимые данные нужно передавать через параметры или временное хранилище.

Алгоритм запуска через «ДлительныеОперации»

Чтобы превратить тяжелую процедуру в асинхронную, мы используем метод модуля TimeConsumingOperations (ДлительныеОперации).

Шаг 1. Подготовка процедуры на сервере

Процедура, которую мы хотим запустить, должна находиться в Общем модуле с установленными флажками «Сервер» и «Вызов сервера» (или «Внешнее соединение»).

// В общем модуле MyGeneralModule
Procedure RunProcess(Parameters, StorageAddress) Export
    // Здесь выполняется тяжелый код
    // Результат можно поместить во временное хранилище по адресу StorageAddress
EndProcedure

Шаг 2. Запуск и вызов окна ожидания

В модуле формы мы используем стандартный шаблон БСП. Вместо прямого вызова процедуры, мы просим библиотеку запустить её в фоне.

&AtClient
Procedure StartButtonExecution(Command)
    
    // Описываем параметры для запуска
    ExecutionParameters = TimeConsumingOperationsClient.IdleParameters(ThisObject);
    ExecutionParameters.MessageText = "Пожалуйста, подождите. Идет расчет данных...";
    
    // Указываем имя нашей процедуры
    ProcedureName = "MyGeneralModule.RunProcess";
    
    // Запускаем фоновое задание
    ExecutionResult = TimeConsumingOperationsDataServer.StartExecution(
        ProcedureName, 
        New Structure, // Параметры для процедуры
        "MyBackgroundJob" // Идентификатор задания
    );
    
    // Открываем стандартное Окно ожидания
    TimeConsumingOperationsClient.WaitCompletion(
        ExecutionResult, 
        ExecutionParameters
    );
    
EndProcedure

Почему это эффективно?

Использование механизмов БСП для длительных операций дает нам несколько преимуществ:

  1. Стабильность: БСП сама следит за тем, чтобы фоновое задание не «подвисло» навсегда.
  2. Кроссплатформенность: Код будет одинаково надежно работать в тонком клиенте, веб-браузере и на мобильных устройствах.
  3. UX (User Experience): Пользователь видит, что система работает, и сохраняет контроль над программой.

Математически выигрыш в отзывчивости можно выразить через время блокировки интерфейса TblockT_{block}: В обычном режиме: Tblock=ToperationT_{block} = T_{operation} В режиме БСП: Tblock0T_{block} \approx 0

Мы научились запускать процессы так, чтобы программа оставалась «живой». Но что делать, если в процессе расчетов на сервере произошла ошибка? Или как нам забрать те данные, которые фоновое задание подготовило для нас во временном хранилище?

В следующей теме мы разберем, как правильно «приземлять» фоновые задания и обрабатывать любые исключительные ситуации, чтобы пользователь всегда получал корректный результат.