При интеграции 1С с внешними сервисами (маркетплейсами, облачными АТС или логистическими системами) разработчики часто сталкиваются с кодом состояния 400 Bad Request. Эта ошибка означает, что сервер не может обработать запрос из-за неверного синтаксиса или некорректной структуры данных. Рассмотрим подробнее, почему это происходит и как правильно сформировать запрос, чтобы избежать подобных проблем.
Одной из самых частых причин возникновения ошибки 400 является несоответствие структуры данных ожиданиям API. Разберем ситуацию на примере. Часто программисты по привычке помещают фильтры или параметры в массив, даже если сервер ожидает одиночный объект.
Проанализируем фрагмент кода, который вызывал ошибку:
СписокОбъектов = Новый Массив;
СписокОбъектов.Добавить(СтруктураДляJSON);
СтруктураДляПередачи = Новый Структура;
СтруктураДляПередачи.Вставить("filter", СписокОбъектов);
В данном случае в JSON-документе поле filter превращалось в массив (заключалось в квадратные скобки [...]). Если документация API не указывает явно, что фильтр должен быть списком, сервер вернет ошибку 400, так как не сможет сопоставить массив с ожидаемым объектом.
Выясним, как сделать правильно. Для исправления достаточно передать структуру напрямую, без использования промежуточного массива:
СтруктураДляПередачи = Новый Структура;
СтруктураДляПередачи.Вставить("filter", СтруктураДляJSON); // Передаем объект напрямую
В этом случае JSON примет вид "filter": {...}, что является стандартным требованием для большинства методов получения данных (например, при получении списка заказов или остатков).
Еще один критический момент — передача даты. Веб-серверы крайне чувствительны к формату строкового представления даты. В 1С стандартное преобразование Строка(ТекущаяДата()) выдает результат в формате ДД.ММ.ГГГГ ЧЧ:ММ:СС, который API практически никогда не принимают.
Рассмотрим, как правильно подготовить дату. Вместо ручной склейки строк с использованием функций Прав() или Лев(), воспользуемся мощным механизмом функции Формат(). Посмотрим на пример правильного формирования параметров:
СтруктураДляJSON = Новый Структура;
СтруктураДляJSON.Вставить("status", "ORDER_WAIT_SUPPLIER");
СтруктураДляJSON.Вставить("limit", 50);
// Используем стандарт ISO 8601 или формат, требуемый API
СтруктураДляJSON.Вставить("fromDate", Формат('20210101', "ДФ='yyyy-MM-dd HH:mm:ss'"));
СтруктураДляJSON.Вставить("tillDate", Формат('20210401', "ДФ='yyyy-MM-dd HH:mm:ss'"));
Важное замечание: Многие современные API требуют формат ISO 8601, где дата и время разделяются символом T (например, 2023-10-25T12:00:00). В таком случае строка формата в 1С будет выглядеть так: "ДФ=yyyy-MM-ddTHH:mm:ss".
Часто ошибка 400 возникает из-за того, что заголовки устанавливаются не в тот объект или неверно указан тип контента. В 1С важно разделять объект HTTPСоединение и объект HTTPЗапрос. Заголовки (такие как Content-Type и Authorization) должны устанавливаться именно в объект HTTPЗапрос.
Разберем по шагам правильную последовательность действий:
HTTPСоединение, указывая хост и настройки безопасности.HTTPЗапрос, указывая путь к ресурсу (URL).Заголовки.Вставить().Посмотрим на пример правильной организации кода:
Соединение = Новый HTTPСоединение(Хост, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);
// Формируем тело JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДляПередачи);
ТелоЗапроса = ЗаписьJSON.Закрыть();
Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Ответ = Соединение.ОтправитьДляОбработки(Запрос);
Особое внимание стоит уделить параметру ИспользованиеByteOrderMark.НеИспользовать. По умолчанию 1С может добавлять в начало строки JSON невидимый символ (BOM). Многие веб-серверы (особенно написанные на языках Go, Python или Node.js) не ожидают этого символа и, встречая его, сразу обрывают обработку с ошибкой 400, так как JSON становится "невалидным" с точки зрения их парсеров.
Если метод Ответ.ПолучитьТелоКакСтроку() возвращает пустую строку, а код все равно 400, попробуйте следующие шаги:
"filter" и "Filter" — это разные поля. Проверьте соответствие документации до последнего символа.limit, убедитесь, что в 1С вы передаете именно число, а не строку. Функция ЗаписатьJSON автоматически конвертирует число 1С в число JSON (без кавычек), а строку — в строку (с кавычками).Подводя итог, можно сказать, что ошибка 400 — это всегда сигнал о невнимательности к деталям реализации протокола. Тщательная проверка структуры объектов, форматов дат и кодировки текста позволяет решить эту проблему в большинстве случаев.