При разработке интеграций часто возникает ситуация, когда выполнение внешнего запроса занимает значительное время (от нескольких секунд и выше). Если выполнять такой запрос синхронно в основном потоке, интерфейс программы «замирает», что вызывает дискомфорт у пользователя. Типичным примером является получение данных о контрагенте по УНП через API, когда ответ от стороннего сервиса может задерживаться из-за сетевых нагрузок. Рассмотрим подробнее, какие инструменты предоставляет платформа 1С для решения этой задачи, и разберем наиболее эффективные методики.
Начиная с версии 8.3.18, в платформе 1С активно развивается механизм асинхронных вызовов, построенный на парадигме Promise (обещаний). Метод ВызватьHTTPМетодАсинх и сопутствующие ему функции позволяют выполнять операции без блокировки основного потока. Этот подход удобен, когда требуется реализовать, например, получение токена авторизации RuStore с подписью RSA, где сложные вычисления и сетевой обмен не должны мешать работе пользователя. Проанализируем пример использования асинхронной загрузки данных в контексте клиентского кода:
&НаКлиенте
Асинх Процедура ЗагрузитьДанныеИзСети(Команда)
ПеременнаяАдрес = "https://example.com/data/file.bin";
ИмяФайла = ПолучитьИмяВременногоФайла();
// Используем оператор Ждать для асинхронного выполнения
Ждать КопироватьФайлАсинх(ПеременнаяАдрес, ИмяФайла);
// Обработка результата после завершения скачивания
ОписаниеФайла = Ждать ПоместитьФайлНаСерверАсинх(,,, ИмяФайла);
АдресХранилища = ОписаниеФайла.Адрес;
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры
В данном примере ключевое слово Асинх перед объявлением процедуры указывает системе, что внутри могут использоваться асинхронные вызовы. Оператор Ждать не останавливает работу всей платформы, а временно передает управление системе, позволяя ей обрабатывать другие события, пока файл загружается. Как только загрузка завершится, выполнение процедуры продолжится с точки остановки.
Если ваша конфигурация работает в клиент-серверном режиме или используется веб-клиент, наиболее надежным решением будет вынос логики на сервер в фоновое задание. Для управления множеством таких процессов удобно использовать специализированный конвейер обработки задач, который позволяет организовать очередь выполнения без потери производительности. Рассмотрим этот механизм по шагам:
ФоновоеЗадание.HTTPСоединение и получает необходимые данные.ВременноеХранилище.Разберем пример кода для запуска такой операции:
&НаСервере
Функция ЗапуститьЗагрузкуНаСервере()
ПараметрыЗадания = Новый Массив;
ПараметрыЗадания.Добавить(URLРесурса);
Задание = ФоновыеЗадания.Выполнить("ИнтеграцияОбмен.ЗагрузитьДанные", ПараметрыЗадания);
Возврат Задание.УникальныйИдентификатор;
КонецФункции
Для отслеживания завершения процесса на клиенте рекомендуется использовать ПодключитьОбработчикОжидания. Это позволяет избежать блокировки формы и дает пользователю возможность продолжать работу, пока, например, происходит автоматический импорт задач из Jira в 1С через REST API в фоновом режиме.
Для разработчиков, работающих на более старых версиях платформы или поддерживающих Обычные формы, существует альтернативный подход с использованием процедур обратного вызова (callback). Рассмотрим ситуацию, когда нам нужно получить данные без использования современных ключевых слов Ждать.
Выясним причину популярности метода НачатьКопированиеФайла: он позволяет инициировать процесс передачи данных и сразу вернуть управление пользователю. Проанализируем структуру вызова:
&НаКлиенте
Процедура ИнициироватьЗагрузку(Команда)
ОписаниеОповещения = Новый ОписаниеОповещения("ЗавершениеЗагрузкиДанных", ЭтотОбъект);
НачатьКопированиеФайла(ОписаниеОповещения, "https://api.service.com/get", "C:\Temp\result.dat");
КонецПроцедуры
&НаКлиенте
Процедура ЗавершениеЗагрузкиДанных(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Истина Тогда
// Обработка полученного файла
Сообщить("Данные успешно получены!");
КонецЕсли;
КонецПроцедуры
Этот подход гарантирует, что основной поток 1С останется свободным. Однако стоит помнить, что в Веб-клиенте данный метод может потребовать установленного расширения работы с файлами.
В некоторых случаях штатные средства 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-протокола.
Подводя итог, выделим основные правила выбора метода:
Асинх / Ждать и ВызватьHTTPМетодАсинх. Это наиболее чистый и читаемый код.ФоновыеЗадания на сервере.НачатьКопированиеФайла или использование обработчиков ожидания с проверкой состояния внешнего процесса.Важный момент: при работе с асинхронными вызовами всегда предусматривайте обработку исключений. В асинхронных процедурах ошибки могут возникать в моменты, когда контекст выполнения уже изменился, поэтому блоки Попытка...Исключение должны охватывать непосредственно вызовы Ждать или находиться внутри процедур оповещения.
Рассмотренные подходы позволяют сделать работу пользователя в 1С комфортной, исключая простои из-за ожидания ответов от внешних информационных систем.