Как реализовать фоновое выполнение кода во внешней обработке без редактирования общих модулей в 1С

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

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

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

Ограничения платформы 1С при работе с фоновыми заданиями

Прежде чем перейти к решениям, проанализируем ключевые особенности работы фоновых заданий:

  1. Точка входа: Платформа не позволяет напрямую вызывать экспортную процедуру из модуля формы или модуля объекта внешней обработки (файла .epf) через метод ФоновыеЗадания.Выполнить(). Параметром может быть только процедура общего модуля.
  2. Изоляция контекста: Фоновое задание запускается в отдельном сеансе на стороне сервера. Оно не имеет доступа к клиентскому контексту, открытым формам, диалоговым окнам или локальному диску пользователя.
  3. Передача результата: Данные, полученные в ходе фонового задания (например, скачанный файл), необходимо передавать в основной сеанс через временное хранилище (с помощью метода ПоместитьВоВременноеХранилище и передачи адреса) или сохранять в базу данных.

Решение 1. Использование типовых механизмов БСП

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

Разберем вариант, когда обработка зарегистрирована в справочнике Дополнительные отчеты и обработки или запускается через подсистему ДлительныеОперации:

  1. Подготовка модуля объекта внешней обработки: В модуле объекта внешней обработки создаем экспортную процедуру, которая будет выполнять длительное действие (например, загрузку файла по HTTP). Результат работы сохраняем во временное хранилище.
  2. Запуск фонового задания из формы: Из модуля формы обращаемся к функциям модуля ДлительныеОперации (или ДополнительныеВнешниеОтчетыИОбработки). Модуль БСП создает фоновое задание и сам вызывает экспортный метод вашей внешней обработки на сервере.
  3. Ожидание завершения: На клиенте подключаем обработчик ожидания с помощью процедуры ПодключитьОбработчикОжидания, чтобы периодически проверять статус фоновой задачи, не блокируя интерфейс пользователя.

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


&НаСервере
Функция ЗапуститьЗагрузкуНаСервере()
    
    // Подготавливаем параметры для выполнения внешней обработки в фоне
    ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
    
    // Указываем имя экспортной процедуры в модуле объекта обработки
    ИмяПроцедуры = "ВыполнитьЗагрузкуФайла"; 
    
    // Запускаем фоновое задание через БСП
    Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
        "ИмяМодуляИлиОбработки", 
        ИмяПроцедуры, 
        ПараметрыЗагрузки, 
        ПараметрыВыполнения
    );
    
    Возврат Результат;
    
КонецФункции

После запуска задания на клиенте включается проверка статуса:


&НаКлиенте
Процедура ЗапуститьЗагрузку()

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

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

&НаКлиенте
Процедура ПроверитьЗавершениеЗагрузки()

    Если ДлительныеОперации.ЗаданиеЗавершено(ИдентификаторЗадания) Тогда
        ОтключитьОбработчикОжидания("ПроверитьЗавершениеЗагрузки");
        // Получаем результаты и обновляем интерфейс
        ПолучитьРезультатыЗагрузки();
    КонецЕсли;

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

Решение 2. Асинхронные вызовы на стороне клиента (без фоновых заданий)

Если главная цель — предотвратить «заморозку» интерфейса при скачивании небольших файлов или выполнении сетевых запросов, можно обойтись без фоновых заданий на сервере. Для этого в платформе 8.3 используются асинхронные методы работы с сетью и файловой системой.

Рассмотрим применение асинхронных методов на клиенте с помощью конструкции Ждать и ключевого слова Асинх:


&НаКлиенте
Асинх Процедура СкачатьФайлАсинхронно()

    Соединение = Новый HTTPСоединение("example.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
    Запрос = Новый HTTPЗапрос("/data/file.zip");
    
    // Выполняем HTTP-запрос асинхронно, не блокируя UI
    Ответ = Ждать Соединение.ПолучитьАсинх(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ПоказатьОповещениеПользователю("Загрузка", , "Файл успешно скачан!");
    КонецЕсли;

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

При использовании асинхронных методов поток интерфейса 1С остается активным, что позволяет пользователю продолжать навигацию по спискам и форме, пока файл скачивается в фоновом режиме.

Выводы и рекомендации

Выбор подходящего решения зависит от особенностей задачи:

  1. Для длительных серверных расчетов или загрузки больших объемов данных во внешней обработке используйте подсистему ДлительныеОперации из состав БСП. Это позволит выполнить код в отдельном потоке сервера без изменения конфигурации.
  2. Для быстрых сетевых операций на стороне клиента отдавайте предпочтение асинхронным функциям платформы (Асинх / Ждать) — они не нагружают фоновые сеансы сервера и сохраняют отзывчивость интерфейса.
← На главную