При интеграции 1С с внешними API часто возникают ситуации, когда запрос, сформированный платформой, возвращает ошибку или код состояния 302 Found. Одной из частых причин является некорректная сборка строки запроса, при которой в параметре Host или в самом пути запроса неожиданно появляется двоеточие с номером порта, например :443, либо дублируются сегменты URL. Давайте разберем, как правильно работать с объектами HTTPСоединение и HTTPЗапрос, чтобы избежать подобных проблем.
Проблема кроется в неправильном распределении данных между объектом HTTPСоединение и HTTPЗапрос. Когда мы передаем в конструктор HTTPСоединение строку, содержащую не только доменное имя, но и часть пути (например, mysite.ru/api/), платформа 1С пытается «склеить» эти данные. В результате парсер воспринимает содержимое после домена как часть структуры адреса, что приводит к появлению некорректных конструкций в заголовках HTTP-пакета.
Чтобы избежать ошибок, необходимо строго придерживаться следующего правила: объект HTTPСоединение должен знать только «кто» (хост) и «куда» (порт), а объект HTTPЗапрос — «что именно» (ресурс и путь).
Рассмотрим по шагам правильную структуру кода:
api.mysite.ru). Никаких слешей, протоколов https:// или вложенных путей типа /merchant/api/ здесь быть не должно.HTTPСоединение для указания порта (для HTTPS это 443).HTTPЗапрос.Давайте посмотрим, как должен выглядеть исправленный код, который успешно выполнит отправку POST запроса:
// Правильная инициализация соединения: только хост и порт
Сервер = "api.mysite.ru";
Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Новый ЗащищенноеСоединениеOpenSSL);
// Формирование заголовков
Заголовки = Новый Соответствие;
Заголовки.Вставить("Content-type", "application/json");
// Формирование запроса: путь начинается со слеша и содержит полный маршрут
Ресурс = "/merchant/api/product/price/";
Запрос = Новый HTTPЗапрос(Ресурс, Заголовки);
// Подготовка тела запроса
МассивДанных = Новый Массив;
МассивДанных.Добавить(Новый Структура("barcode,priceOpt", "9002490206000", 98));
Запрос.УстановитьТелоИзСтроки(СериализоватьВJSONСтроку(МассивДанных));
// Отправка запроса
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Получение кода 302 Found при работе с API сигнализирует о том, что сервер пытается перенаправить запрос. Часто это происходит из-за того, что сервер ожидает «чистый» путь без лишних сегментов, которые ошибочно добавляет 1С из-за неправильной настройки HTTPСоединение. Также проверьте наличие финального слеша в строке пути: некоторые API крайне чувствительны к этому символу.
Важные советы для отладки:
Host вы видите что-то вроде api.mysite.ru/api/:443, значит, вы допустили ошибку при формировании объекта HTTPСоединение.HTTPЗапрос со знака /, чтобы избежать проблем с относительной адресацией.Host вручную, если в этом нет крайней необходимости — платформа 1С корректно управляет им автоматически, если параметры соединения заданы верно.Следуя этим простым правилам разделения параметров, вы обеспечите стабильную и предсказуемую работу обменов данными с любыми внешними веб-сервисами.