Как исправить код ошибки 400 при запросе к API из 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При интеграции 1С с внешними сервисами (маркетплейсами, облачными АТС или логистическими системами) разработчики часто сталкиваются с кодом состояния 400 Bad Request. Эта ошибка означает, что сервер не может обработать запрос из-за неверного синтаксиса или некорректной структуры данных. Рассмотрим подробнее, почему это происходит и как правильно сформировать запрос, чтобы избежать подобных проблем.

Анализируем структуру JSON: Объект против Массива

Одной из самых частых причин возникновения ошибки 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".

Правильная работа с HTTP-запросом и заголовками

Часто ошибка 400 возникает из-за того, что заголовки устанавливаются не в тот объект или неверно указан тип контента. В 1С важно разделять объект HTTPСоединение и объект HTTPЗапрос. Заголовки (такие как Content-Type и Authorization) должны устанавливаться именно в объект HTTPЗапрос.

Разберем по шагам правильную последовательность действий:

  1. Создаем HTTPСоединение, указывая хост и настройки безопасности.
  2. Создаем HTTPЗапрос, указывая путь к ресурсу (URL).
  3. Устанавливаем заголовки через метод Заголовки.Вставить().
  4. Записываем тело запроса в формате JSON.

Посмотрим на пример правильной организации кода:


Соединение = Новый HTTPСоединение(Хост, , , , , , Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Content-Type", "application/json");
Запрос.Заголовки.Вставить("Authorization", "Bearer " + Токен);

// Формируем тело JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СтруктураДляПередачи);
ТелоЗапроса = ЗаписьJSON.Закрыть();

Запрос.УстановитьТелоИзСтроки(ТелоЗапроса, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

Ответ = Соединение.ОтправитьДляОбработки(Запрос);

Проблема Byte Order Mark (BOM)

Особое внимание стоит уделить параметру ИспользованиеByteOrderMark.НеИспользовать. По умолчанию 1С может добавлять в начало строки JSON невидимый символ (BOM). Многие веб-серверы (особенно написанные на языках Go, Python или Node.js) не ожидают этого символа и, встречая его, сразу обрывают обработку с ошибкой 400, так как JSON становится "невалидным" с точки зрения их парсеров.

Как диагностировать причину, если сервер молчит?

Если метод Ответ.ПолучитьТелоКакСтроку() возвращает пустую строку, а код все равно 400, попробуйте следующие шаги:

Подводя итог, можно сказать, что ошибка 400 — это всегда сигнал о невнимательности к деталям реализации протокола. Тщательная проверка структуры объектов, форматов дат и кодировки текста позволяет решить эту проблему в большинстве случаев.

← На главную