Часто при автоматизации обмена данными в 1С:Предприятии возникает ситуация, когда один и тот же программный код отлично работает при ручном запуске («интерактивно»), но выдает ошибку при выполнении через регламентные или фоновые задания (например, в «Рассылке отчетов»). Рассмотрим, почему это происходит и как найти решение.
Основная сложность заключается в том, что регламентное задание выполняется на стороне сервера 1С (даже если это файловая база на локальном компьютере, фоновое задание работает в ином контексте, чем основной сеанс пользователя). В данном случае фоновое задание не могло успешно обработать сетевой запрос к HTTP-сервису, хотя интерактивный пользователь с теми же правами и параметрами подключения успешно получал данные.
Первым шагом при возникновении ошибки («Отчеты пустые или не сформированы») всегда должно быть получение детального текста ошибки. Использование конструкций Попытка...Исключение позволяет перехватить реальное исключение, которое скрывается за общим сообщением системы.
Чтобы понять, что именно идет не так, обернем вызов сетевого соединения в блок обработки исключений. Это позволит нам увидеть, какой метод или свойство вызывает сбой.
Попытка
ОтветHTTP = Соединение2.ОтправитьДляОбработки(Запрос);
JSON_Struktura = ОтветHTTP.ПолучитьТелоКакСтроку("UTF-8");
Исключение
ЗаписьЖурналаРегистрации("ОшибкаHTTP", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
В ходе анализа выяснилось, что при выполнении в фоновом задании метод ПолучитьТелоКакСтроку выдавал ошибку, так как ОтветHTTP не был корректно сформирован. Это указывает на то, что проблема кроется на этапе установления соединения или отправки запроса.
В ходе отладки было выявлено, что причиной сбоя было использование имени localhost в качестве адреса сервера. Рассмотрим, почему это происходит:
localhost является доменным именем. При его использовании операционная система должна разрешить его в IP-адрес. В контексте фонового задания (службы сервера 1С или процесса фонового задания) настройки сети могут отличаться от настроек текущего пользователя.localhost может резолвиться как в IPv4 (127.0.0.1), так и в IPv6 (::1). Если ваш HTTP-сервис настроен на прослушивание только IPv4, а система при запросе по localhost пытается стучаться по IPv6, соединение будет отклонено или завершится тайм-аутом.localhost на прямой IP-адрес 127.0.0.1 принудительно указывает системе использовать протокол IPv4, что снимает неопределенность и обеспечивает стабильную работу соединения в любом контексте исполнения.При написании кода для обмена данными через HTTP-соединение придерживайтесь следующих правил:
127.0.0.1 вместо localhost.КодСостояния у объекта ОтветHTTP). Если код не равен 200, необходимо анализировать заголовки и тело ответа для понимания причины ошибки на стороне принимающего сервера.ИмяКомпьютера, Пользователь и Пароль, передаются явно и не зависят от текущего сеанса пользователя.Таким образом, перенос сетевого взаимодействия из интерактивной формы в регламентное задание требует более строгой адресации ресурсов. Замена на 127.0.0.1 — это эффективный способ устранить "плавающие" проблемы с соединением в среде 1С.