Часто разработчики 1С сталкиваются с ситуацией, когда написанный код обработки прекрасно работает при ручном запуске из формы, но при переносе в регламентное задание перестает выполнять свою функцию. Давайте разберем, почему это происходит и как правильно организовать передачу данных по HTTP на стороне сервера.
Основная причина заключается в том, где именно выполняется код. Когда вы запускаете процедуру с формы, вы находитесь в клиентском контексте (или в контексте конкретного сеанса пользователя). В этом случае localhost указывает на компьютер, за которым вы сидите, и веб-сервер, запущенный на нем, доступен без проблем.
Однако, регламентные задания выполняются на стороне сервера 1С:Предприятия. Сервер 1С — это, как правило, отдельная машина (или служба), работающая в фоновом режиме. Когда код регламентного задания обращается к localhost, он ищет веб-сервер внутри самого сервера 1С, а не на вашем рабочем компьютере.
Чтобы заставить ваш обмен работать корректно, пройдемся по этапам настройки и проверки.
1С:Enterprise Server Agent, имеет сетевой доступ к целевому веб-серверу (Apache или IIS). localhost в коде нужно заменить на реальный IP-адрес или доменное имя веб-сервера.СообщениеПользователю или ПоказатьОповещение. Если вы хотите видеть результат работы задания, используйте ЗаписьЖурналаРегистрации.Для корректной работы серверного кода используйте следующий шаблон, который включает базовую обработку ошибок и запись в журнал:
Процедура ВыполнитьОбменПоРасписанию() Экспорт
Сервер = "192.168.1.10"; // Указываем реальный IP вашего веб-сервера
АдресРесурса = "/web/hs/post/file_down/";
Попытка
Соединение = Новый HTTPСоединение(Сервер);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
// ... здесь формирование тела запроса ...
Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
Если Ответ.КодСостояния <> 200 Тогда
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , "Ошибка передачи: " + Ответ.КодСостояния);
КонецЕсли;
Исключение
ЗаписьЖурналаРегистрации("ОбменДанными", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
При отладке серверных процедур крайне полезно следовать этим правилам:
Попытка...Исключение.ЗначениеВСтрокуВнутр — плохая практика для обмена с другими системами, так как этот формат специфичен только для 1С. Применяйте ЗаписьJSON для формирования тела запроса, это гарантирует совместимость с любыми веб-сервисами.КомандаСистемы("ping 192.168.1.10") и проанализировать результат в файле лога.Помните, что перенос логики с клиента на сервер требует особого внимания к контексту исполнения. Устранив проблему с адресацией localhost и добавив логирование в ЖурналРегистрации, вы обеспечите стабильную работу вашего регламентного задания.