Запуск асинхронных процессов и механизм ожидания завершения
Мы уже научились использовать программный интерфейс (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
Почему это эффективно?
Использование механизмов БСП для длительных операций дает нам несколько преимуществ:
- Стабильность: БСП сама следит за тем, чтобы фоновое задание не «подвисло» навсегда.
- Кроссплатформенность: Код будет одинаково надежно работать в тонком клиенте, веб-браузере и на мобильных устройствах.
- UX (User Experience): Пользователь видит, что система работает, и сохраняет контроль над программой.
Математически выигрыш в отзывчивости можно выразить через время блокировки интерфейса : В обычном режиме: В режиме БСП:
Мы научились запускать процессы так, чтобы программа оставалась «живой». Но что делать, если в процессе расчетов на сервере произошла ошибка? Или как нам забрать те данные, которые фоновое задание подготовило для нас во временном хранилище?
В следующей теме мы разберем, как правильно «приземлять» фоновые задания и обрабатывать любые исключительные ситуации, чтобы пользователь всегда получал корректный результат.