При разработке внешних обработок часто возникает необходимость выполнять длительные операции — например, загружать данные из интернета, скачивать файлы или производить сложные расчеты. Если выполнять такой код напрямую в контексте формы, интерфейс 1С замирает, и пользователь не может продолжать работу в программе до полного завершения процесса.
Стандартный метод платформы ФоновыеЗадания.Выполнить() требует передачи имени экспортной процедуры из общего модуля с установленным флагом «Сервер». Однако во многих проектах у разработчика нет доступа на изменение конфигурации или создание новых общих модулей. Рассмотрим, как обойти это ограничение и реализовать асинхронное выполнение задач во внешней обработке.
Прежде чем перейти к решениям, проанализируем ключевые особенности работы фоновых заданий:
.epf) через метод ФоновыеЗадания.Выполнить(). Параметром может быть только процедура общего модуля.ПоместитьВоВременноеХранилище и передачи адреса) или сохранять в базу данных.Если ваша конфигурация разработана на базе Библиотеки Стандартных Подсистем (БСП), вносить изменения в конфигурацию не требуется. В БСП уже предусмотрены общие модули-посредники, умеющие запускать внешние обработки в фоновом режиме.
Разберем вариант, когда обработка зарегистрирована в справочнике Дополнительные отчеты и обработки или запускается через подсистему ДлительныеОперации:
ДлительныеОперации (или ДополнительныеВнешниеОтчетыИОбработки). Модуль БСП создает фоновое задание и сам вызывает экспортный метод вашей внешней обработки на сервере.ПодключитьОбработчикОжидания, чтобы периодически проверять статус фоновой задачи, не блокируя интерфейс пользователя.Посмотрим на пример структуры вызова функции выполнения длительной операции на сервере:
&НаСервере
Функция ЗапуститьЗагрузкуНаСервере()
// Подготавливаем параметры для выполнения внешней обработки в фоне
ПараметрыВыполнения = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
// Указываем имя экспортной процедуры в модуле объекта обработки
ИмяПроцедуры = "ВыполнитьЗагрузкуФайла";
// Запускаем фоновое задание через БСП
Результат = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
"ИмяМодуляИлиОбработки",
ИмяПроцедуры,
ПараметрыЗагрузки,
ПараметрыВыполнения
);
Возврат Результат;
КонецФункции
После запуска задания на клиенте включается проверка статуса:
&НаКлиенте
Процедура ЗапуститьЗагрузку()
РезультатЗапуска = ЗапуститьЗагрузкуНаСервере();
Если РезультатЗапуска.Статус = "Выполняется" Тогда
// Запоминаем идентификатор задания и подключаем обработчик ожидания
ИдентификаторЗадания = РезультатЗапуска.ИдентификаторЗадания;
ПодключитьОбработчикОжидания("ПроверитьЗавершениеЗагрузки", 2);
ИначеЕсли РезультатЗапуска.Статус = "Завершено" Тогда
// Если операция выполнилась мгновенно
ОбработатьРезультат(РезультатЗапуска.АдресРезультата);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьЗавершениеЗагрузки()
Если ДлительныеОперации.ЗаданиеЗавершено(ИдентификаторЗадания) Тогда
ОтключитьОбработчикОжидания("ПроверитьЗавершениеЗагрузки");
// Получаем результаты и обновляем интерфейс
ПолучитьРезультатыЗагрузки();
КонецЕсли;
КонецПроцедуры
Если главная цель — предотвратить «заморозку» интерфейса при скачивании небольших файлов или выполнении сетевых запросов, можно обойтись без фоновых заданий на сервере. Для этого в платформе 8.3 используются асинхронные методы работы с сетью и файловой системой.
Рассмотрим применение асинхронных методов на клиенте с помощью конструкции Ждать и ключевого слова Асинх:
&НаКлиенте
Асинх Процедура СкачатьФайлАсинхронно()
Соединение = Новый HTTPСоединение("example.com", 443, , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/data/file.zip");
// Выполняем HTTP-запрос асинхронно, не блокируя UI
Ответ = Ждать Соединение.ПолучитьАсинх(Запрос);
Если Ответ.КодСостояния = 200 Тогда
ПоказатьОповещениеПользователю("Загрузка", , "Файл успешно скачан!");
КонецЕсли;
КонецПроцедуры
При использовании асинхронных методов поток интерфейса 1С остается активным, что позволяет пользователю продолжать навигацию по спискам и форме, пока файл скачивается в фоновом режиме.
Выбор подходящего решения зависит от особенностей задачи:
ДлительныеОперации из состав БСП. Это позволит выполнить код в отдельном потоке сервера без изменения конфигурации.Асинх / Ждать) — они не нагружают фоновые сеансы сервера и сохраняют отзывчивость интерфейса.