При разработке интеграций через HTTP-сервисы в 1С начинающие разработчики часто сталкиваются с ошибкой 404 Not Found при попытке передать параметры в POST-запросе. Рассмотрим основные причины возникновения этой проблемы и разберем три способа передачи данных, которые позволяют корректно настроить взаимодействие между системами.
Выясним причину, по которой запрос автора темы возвращал ошибку 404. В конфигурации 1С был задан шаблон URL следующего вида:
/LoadMessageFromKIS/{MessageNo}/{ReceivedNo}
Однако вызов сервиса производился строкой:
zup3_test/hs/ExchangeKIS/LoadMessageFromKIS/?MessageNo=6&ReceivedNo=0
Проанализируем ситуацию: платформа 1С воспринимает части пути, заключенные в фигурные скобки {}, как обязательные сегменты URL. В данном случае система ожидает, что после LoadMessageFromKIS/ в адресе будут идти еще два сегмента, разделенных слешем. Но в запросе автора после названия метода стоит знак вопроса ?, который инициирует передачу параметров запроса (Query Parameters). Для платформы эти два адреса абсолютно разные, поэтому она не находит подходящий обработчик и возвращает 404.
Если мы хотим оставить текущий шаблон в базе-приемнике без изменений, нам необходимо привести строку вызова в соответствие с этим шаблоном. Разберем, как сформировать правильный запрос на стороне отправителя:
// Правильное формирование пути согласно шаблону /{MessageNo}/{ReceivedNo}
ПутьКРесурсу = "zup3_test/hs/ExchangeKIS/LoadMessageFromKIS/"
+ Узел_ЗУП3.НомерОтправленного + "/"
+ Узел_ЗУП3.НомерПринятого;
ЗапросHTTP = Новый HTTPЗапрос(ПутьКРесурсу, ЗаголовокЗапросаHTTP);
// В POST-запросе тело обычно заполняется, даже если параметры в URL
ЗапросHTTP.УстановитьТелоИзСтроки("{}");
Ответ = Соединение.ОтправитьДляОбработки(ЗапросHTTP);
На стороне сервера (в базе-приемнике) значения из фигурных скобок следует получать через коллекцию ПараметрыURL:
МесседжНом = Запрос.ПараметрыURL.Получить("MessageNo");
РесиведНом = Запрос.ПараметрыURL.Получить("ReceivedNo");
Рассмотрим альтернативный вариант: передачу параметров через знак вопроса. Это удобно, когда параметров много или они являются необязательными. Чтобы этот способ заработал, необходимо удалить сегменты в фигурных скобках из шаблона в конфигураторе.
Новый шаблон в 1С:
/LoadMessageFromKIS
Теперь обращение по адресу .../LoadMessageFromKIS/?MessageNo=6&ReceivedNo=0 будет успешно обработано. В коде обработчика на сервере получение данных изменится:
// Используем коллекцию ПараметрыЗапроса вместо ПараметрыURL
МесседжНом = Запрос.ПараметрыЗапроса.Получить("MessageNo");
РесиведНом = Запрос.ПараметрыЗапроса.Получить("ReceivedNo");
Преимущество этого метода: вы можете изменять состав передаваемых параметров, добавлять новые или удалять старые, не меняя структуру шаблонов в метаданных конфигурации.
Для метода POST наиболее правильным и профессиональным подходом считается передача данных внутри тела запроса, обычно в формате JSON. Это позволяет скрывать технические данные из URL, передавать сложные структуры (массивы, вложенные объекты) и избегать проблем с длиной строки запроса.
Разберем по шагам реализацию этого подхода. Сначала подготовим данные на стороне отправителя:
// Формируем структуру с данными
ДанныеЗапроса = Новый Структура;
ДанныеЗапроса.Вставить("MessageNo", Узел_ЗУП3.НомерОтправленного);
ДанныеЗапроса.Вставить("ReceivedNo", Узел_ЗУП3.НомерПринятого);
// Сериализуем в JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ДанныеЗапроса);
СтрокаJSON = ЗаписьJSON.Закрыть();
// Формируем запрос
ЗапросPOST = Новый HTTPЗапрос("/zup3_test/hs/ExchangeKIS/LoadMessageFromKIS/");
ЗапросPOST.Заголовки.Вставить("Content-Type", "application/json");
// Важно: отключаем BOM, чтобы сторонние системы или строгие парсеры не выдали ошибку 400
ЗапросPOST.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(ЗапросPOST);
На стороне сервера (в базе-приемнике) мы считываем тело запроса и преобразуем его обратно в структуру:
// Читаем тело запроса
СтрокаТела = Запрос.ПолучитьТелоКакСтроку();
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаТела);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
МесседжНом = Данные.MessageNo;
РесиведНом = Данные.ReceivedNo;
При работе с POST-запросами в 1С следует учитывать несколько критически важных моментов, которые помогут избежать трудноуловимых ошибок:
УстановитьТелоИзСтроки() всегда явно указывайте ИспользованиеByteOrderMark.НеИспользовать. Многие современные веб-серверы (например, на Python или Go) воспринимают невидимый символ BOM в начале JSON-пакета как ошибку синтаксиса и возвращают 400 Bad Request.Content-Type: application/json. Без него сервер может некорректно интерпретировать кодировку или формат входящих данных.201 Created. Если параметры не прошли валидацию — 400 Bad Request.ПолучитьТелоКакСтроку() используйте Запрос.ПолучитьТелоКакПоток(). Это позволит обрабатывать данные порциями, не перегружая оперативную память сервера.Проанализировав все способы, можно сделать вывод: использование сегментов URL (Способ 1) подходит для получения конкретного ресурса по его ID, тогда как передача данных в теле (Способ 3) является стандартом для отправки команд и больших наборов данных в современных API.