При интеграции 1С с внешними системами через HTTP-запросы разработчики часто сталкиваются с ситуацией, когда вместо ожидаемых данных (код 200 OK) сервер возвращает код состояния 301 Moved Permanently. Это означает, что запрашиваемый ресурс был окончательно перемещен по новому адресу. Рассмотрим подробно, почему это происходит в контексте платформы 1С, как диагностировать проблему и какие методы существуют для её решения.
Код 301 — это стандартный ответ протокола HTTP, указывающий на перенаправление (редирект). В отличие от браузеров или таких инструментов, как Postman, объект 1С HTTPСоединение не всегда умеет обрабатывать редиректы автоматически. В результате программа получает пустой ответ или ошибку, так как она ожидает полезную нагрузку (например, XML или JSON), а получает лишь заголовок с новым адресом.
Выясним основные причины, по которым сервер «отфутболивает» запрос из 1С:
https://.myserver/api вместо myserver/api/ часто приводит к редиректу.Проанализируем ситуацию, когда база 1С версии 8.2 или 8.3 пытается отправить запрос на сервер, требующий безопасное соединение. Если в настройках HTTPСоединение не указан параметр ЗащищенноеСоединениеOpenSSL, сервер вернет код 301.
Посмотрим на пример правильного создания соединения для HTTPS:
// Инициализируем защищенное соединение
Защита = Новый ЗащищенноеСоединениеOpenSSL();
// Создаем соединение, явно указывая использование SSL
Соединение = Новый HTTPСоединение(Сервер, 443, , , , , Защита);
Запрос = Новый HTTPЗапрос(Ресурс);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Важное замечание для пользователей платформы 8.2: Эта версия платформы использует устаревшие библиотеки OpenSSL, которые не поддерживают современные протоколы TLS 1.2 и выше. В этом случае вы можете столкнуться с ошибкой SSL connect error. Рассмотрим варианты обхода:
WinHttp.WinHttpRequest.5.1, который работает через системные библиотеки Windows.Если вы обращаетесь к веб-сервису другой базы 1С, опубликованной на веб-сервере, обратите внимание на регистр имени базы и имени самого сервиса. Рассмотрим пример из практики: база была опубликована под именем TradeBase (в CamelCase), а в коде 1С запрос шел к tradebase (в нижнем регистре). Веб-сервер в такой ситуации часто возвращает 301.
Проанализируем шаги для исправления:
HTTPЗапрос полностью совпадает по регистру с именем публикации.Если сервер возвращает 301, он обязан передать в заголовках ответа новый адрес в поле Location. Мы можем написать универсальную функцию, которая будет рекурсивно переходить по ссылкам до тех пор, пока не получит код 200.
Разберем пример кода для автоматической обработки перенаправлений:
Функция ВыполнитьЗапросСОбработкойРедиректа(Знач ТекущийРесурс, Знач ПараметрыСоединения)
Соединение = Новый HTTPСоединение(ПараметрыСоединения.Сервер, , , , , , ПараметрыСоединения.Защита);
Запрос = Новый HTTPЗапрос(ТекущийРесурс);
Ответ = Соединение.Получить(Запрос);
Если Ответ.КодСостояния = 301 Или Ответ.КодСостояния = 302 Тогда
// Извлекаем новый адрес из заголовка Location
НовыйАдрес = Ответ.Заголовки.Получить("Location");
Если ЗначениеЗаполнено(НовыйАдрес) Тогда
// Важно: Location может быть как полным URL, так и относительным путем
Если Найти(НовыйАдрес, "http") = 0 Тогда
// Это относительный путь, продолжаем работу с тем же сервером
Возврат ВыполнитьЗапросСОбработкойРедиректа(НовыйАдрес, ПараметрыСоединения);
Иначе
// Это полный URL, нужно разобрать его на сервер и путь (используйте СтруктураURI)
// Здесь логика разбора и создания нового соединения...
Сообщить("Перенаправление на: " + НовыйАдрес);
Возврат Неопределено; // Для примера
КонецЕсли;
КонецЕсли;
ИначеЕсли Ответ.КодСостояния = 200 Тогда
Возврат Ответ;
КонецЕсли;
Возврат Ответ;
КонецФункции
Чтобы окончательно выяснить причину ошибки 301, выполните следующие действия:
Headers в ответе. Postman по умолчанию следует редиректам (опция Follow Redirects), поэтому вы можете даже не заметить, как он перешел с одного адреса на другой.HTTPЗапрос строку User-Agent, имитирующую браузер: Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0");./ в конец строки ресурса. Например, вместо /hs/MyService используйте /hs/MyService/.Таким образом, мы выяснили, что ошибка 301 в 1С чаще всего является следствием настроек безопасности сервера или невнимательности к регистру символов. Внимательный анализ заголовков ответа и использование защищенного соединения позволяют успешно решить эту задачу.