Как реализовать асинхронный HTTP-запрос в 1С и избежать зависания интерфейса

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

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

Использование встроенных асинхронных методов платформы

Начиная с версии 8.3.18, в платформе 1С активно развивается механизм асинхронных вызовов, построенный на парадигме Promise (обещаний). Метод ВызватьHTTPМетодАсинх и сопутствующие ему функции позволяют выполнять операции без блокировки основного потока. Этот подход удобен, когда требуется реализовать, например, получение токена авторизации RuStore с подписью RSA, где сложные вычисления и сетевой обмен не должны мешать работе пользователя. Проанализируем пример использования асинхронной загрузки данных в контексте клиентского кода:


&НаКлиенте
Асинх Процедура ЗагрузитьДанныеИзСети(Команда) 
    ПеременнаяАдрес = "https://example.com/data/file.bin";
    ИмяФайла = ПолучитьИмяВременногоФайла();
    
    // Используем оператор Ждать для асинхронного выполнения
    Ждать КопироватьФайлАсинх(ПеременнаяАдрес, ИмяФайла); 
    
    // Обработка результата после завершения скачивания
    ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, ИмяФайла);
    АдресХранилища = ОписаниеФайла.Адрес;
    ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры

В данном примере ключевое слово Асинх перед объявлением процедуры указывает системе, что внутри могут использоваться асинхронные вызовы. Оператор Ждать не останавливает работу всей платформы, а временно передает управление системе, позволяя ей обрабатывать другие события, пока файл загружается. Как только загрузка завершится, выполнение процедуры продолжится с точки остановки.

Реализация через фоновые задания на сервере

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

  1. Клиент вызывает серверный метод, который запускает ФоновоеЗадание.
  2. Сервер в отдельном сеансе выполняет HTTPСоединение и получает необходимые данные.
  3. Результат сохраняется во ВременноеХранилище.
  4. Клиентская форма периодически опрашивает состояние задания.

Разберем пример кода для запуска такой операции:


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

Для отслеживания завершения процесса на клиенте рекомендуется использовать ПодключитьОбработчикОжидания. Это позволяет избежать блокировки формы и дает пользователю возможность продолжать работу, пока, например, происходит автоматический импорт задач из Jira в 1С через REST API в фоновом режиме.

Применение метода НачатьКопированиеФайла

Для разработчиков, работающих на более старых версиях платформы или поддерживающих Обычные формы, существует альтернативный подход с использованием процедур обратного вызова (callback). Рассмотрим ситуацию, когда нам нужно получить данные без использования современных ключевых слов Ждать.

Выясним причину популярности метода НачатьКопированиеФайла: он позволяет инициировать процесс передачи данных и сразу вернуть управление пользователю. Проанализируем структуру вызова:


&НаКлиенте
Процедура ИнициироватьЗагрузку(Команда)
    ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеЗагрузкиДанных", ЭтотОбъект);
    НачатьКопированиеФайла(ОписаниеОповещения, "https://api.service.com/get", "C:\Temp\result.dat");
КонецПроцедуры

&НаКлиенте
Процедура ЗавершениеЗагрузкиДанных(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = Истина Тогда
        // Обработка полученного файла
        Сообщить("Данные успешно получены!");
    КонецЕсли;
КонецПроцедуры

Этот подход гарантирует, что основной поток 1С останется свободным. Однако стоит помнить, что в Веб-клиенте данный метод может потребовать установленного расширения работы с файлами.

Внешние инструменты: WinHTTP и cURL

В некоторых случаях штатные средства HTTPСоединение могут не обеспечивать нужной гибкости. Посмотрим на пример использования COM-объекта WinHTTP, который поддерживает полноценный асинхронный режим. Это может быть актуально, если вы настраиваете интеграцию 1С с Google Таблицами, где требуется специфическая работа с заголовками и токенами доступа через сервисный аккаунт.


// Пример для Толстого клиента (Windows)
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Open("GET", "https://server.local/api", Истина); // Истина = Асинхронно
WinHttp.Send();

// Проверка состояния может выполняться в обработчике ожидания
Если WinHttp.WaitForResponse(1) Тогда
    Данные = WinHttp.ResponseBody;
КонецЕсли;

Альтернативным способом является использование системных утилит или специализированных прокси-сервисов. Например, REST API To WebSocket прокси сервис позволяет транслировать внешние события в 1С в режиме реального времени, что значительно расширяет возможности стандартного HTTP-протокола.

Сравнительный анализ и рекомендации

Подводя итог, выделим основные правила выбора метода:

  1. Если используется современная платформа (8.3.18+) и управляемые формы — используйте Асинх / Ждать и ВызватьHTTPМетодАсинх. Это наиболее чистый и читаемый код.
  2. Если необходимо обеспечить максимальную отзывчивость в сложных транзакционных процессах — используйте ФоновыеЗадания на сервере.
  3. Для Обычных форм и старых релизов платформы оптимальным выбором будет НачатьКопированиеФайла или использование обработчиков ожидания с проверкой состояния внешнего процесса.
  4. В Веб-клиенте всегда учитывайте ограничения безопасности браузера и необходимость расширения для работы с файловой системой.

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

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

← На главную