Обработка исключений и получение результата из фона

На предыдущем этапе мы научились запускать фоновые задания и настраивать ожидание их завершения. Однако запуск — это только половина дела. В реальной разработке фоновое задание может завершиться аварийно или вернуть данные, которые нужно обработать в основном сеансе.

Поскольку фоновое задание выполняется в отдельном сеансе на сервере, оно не имеет прямого доступа к переменным или экранным формам пользователя. Для обмена информацией между «фоном» и основным сеансом мы используем специальные механизмы БСП.

Обработка исключений в фоновом режиме

В обычном режиме ошибка останавливает работу и выводит окно с предупреждением. В фоновом задании всё иначе: если произойдет критическая ошибка (деление на ноль, обращение к несуществующему объекту), фоновый поток просто прервется. Если не предусмотрена Обработка исключений, пользователь увидит лишь сообщение «Задание завершилось с ошибкой», не понимая причин.

Чтобы программа работала корректно, оборачивайте основной код фонового задания в конструкцию Try ... Except.

Пример организации кода в экспортной процедуре серверного модуля:

// Процедура в общем модуле (сервер)
Procedure CalculateDataInBackground(Parameters, ResultAddress) Export
    
    Try
        // Логика длительной операции
        Result = 100 / Parameters.Divisor; 
        
        // Помещаем результат во временное хранилище
        PutToTempStorage(Result, ResultAddress);
    Except
        // Записываем подробности ошибки для администратора
        WriteErrorToLog(ErrorInfo());
        // Перебрасываем исключение дальше, чтобы БСП зафиксировала статус "Ошибка"
        Raise; 
    EndTry
    
EndProcedure

Журнал регистрации как инструмент диагностики

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

БСП автоматически фиксирует запуск и завершение заданий. Чтобы понимать контекст ошибки, записывайте детали самостоятельно. Хорошим тоном считается запись структуры, содержащей имя подсистемы и контекст выполнения.

Как показано в Схеме 1, путь информации об ошибке выглядит как эстафета от серверного потока к интерфейсу администратора.

Получение результата из фона

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

Алгоритм действий:

  1. Перед запуском сформируйте уникальный адрес во временном хранилище.
  2. Передайте этот адрес в параметры фонового задания.
  3. Внутри задания запишите данные по этому адресу через PutToTempStorage.
  4. В основном сеансе после завершения задания считайте данные.

Не пытайтесь передать результат через глобальную переменную или реквизит формы напрямую из фонового кода. Фоновое задание — это другой сеанс. Оно не видит ваши переменные, и данные будут потеряны.

Для получения данных используйте стандартные методы, которые мы рассматривали в теме запуска асинхронных процессов.

Практикум: Получение итогов расчета

Закрепим теорию на примере получения структуры данных из фонового процесса.

Задание: Реализуйте получение результата

  1. В процедуре фонового задания сформируйте структуру ResultData с полями Status (Истина) и Value (результат вычислений).
  2. Используйте PutToTempStorage(ResultData, ResultAddress) для сохранения.
  3. В обработчике завершения (на клиенте) примените GetFromTempStorage(ResultAddress) и выведите результат пользователю через ShowUserNotification.

Мы научились запускать тяжелые процессы, контролировать их состояние и возвращать данные в интерфейс. Это завершает блок работы с асинхронностью.

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

Понравился урок?

Сохраните прогресс и получите персональный курс по любой теме — без форм и паролей

Продолжить в Telegram