Почему не работает рассылка отчетов при запросе к HTTP-сервису?

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

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

Разбор проблемы

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

Первым шагом при возникновении ошибки («Отчеты пустые или не сформированы») всегда должно быть получение детального текста ошибки. Использование конструкций Попытка...Исключение позволяет перехватить реальное исключение, которое скрывается за общим сообщением системы.

Шаг 1: Получение детальной информации об ошибке

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


Попытка
    ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
    JSON_Struktura = ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8");
Исключение
    ЗаписьЖурналаРегистрации("ОшибкаHTTP", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;

В ходе анализа выяснилось, что при выполнении в фоновом задании метод ПолучитьТелоКакСтроку выдавал ошибку, так как ОтветHTTP не был корректно сформирован. Это указывает на то, что проблема кроется на этапе установления соединения или отправки запроса.

Шаг 2: Анализ сетевого адреса (localhost vs 127.0.0.1)

В ходе отладки было выявлено, что причиной сбоя было использование имени localhost в качестве адреса сервера. Рассмотрим, почему это происходит:

  1. Разрешение имен: localhost является доменным именем. При его использовании операционная система должна разрешить его в IP-адрес. В контексте фонового задания (службы сервера 1С или процесса фонового задания) настройки сети могут отличаться от настроек текущего пользователя.
  2. Протокол IPv6 vs IPv4: Имя localhost может резолвиться как в IPv4 (127.0.0.1), так и в IPv6 (::1). Если ваш HTTP-сервис настроен на прослушивание только IPv4, а система при запросе по localhost пытается стучаться по IPv6, соединение будет отклонено или завершится тайм-аутом.
  3. Решение: Замена имени localhost на прямой IP-адрес 127.0.0.1 принудительно указывает системе использовать протокол IPv4, что снимает неопределенность и обеспечивает стабильную работу соединения в любом контексте исполнения.

Рекомендации по реализации

При написании кода для обмена данными через HTTP-соединение придерживайтесь следующих правил:

Таким образом, перенос сетевого взаимодействия из интерактивной формы в регламентное задание требует более строгой адресации ресурсов. Замена на 127.0.0.1 — это эффективный способ устранить "плавающие" проблемы с соединением в среде 1С.

← На главную