Как исправить ошибку 400 Bad Request при отправке JSON-RPC запроса из 1С?

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

При интеграции 1С со сторонними сервисами через протокол JSON-RPC часто возникает ошибка 400 Bad Request. Она сигнализирует о том, что сервер не смог распознать отправленный вами пакет данных из-за нарушения структуры или синтаксиса JSON. Давайте разберем, почему это происходит и как правильно организовать передачу данных.

Выясняем причину возникновения ошибки

Основная проблема при ручном формировании JSON-строки в коде 1С заключается в высокой вероятности допустить опечатку: пропустить кавычку, поставить лишнюю запятую в конце массива или забыть закрывающую фигурную скобку. Сервер, получая такой «битый» JSON, возвращает ошибку Invalid JSON data.

Кроме того, распространенная ошибка — попытка формирования JSON как обычной строки с последующим пропуском через ЗаписьJSON. В результате 1С экранирует все кавычки внутри вашей строки, превращая код в нечитаемый для API стороннего ПО набор символов.

Правильный подход к формированию запроса

Вместо того чтобы собирать JSON вручную как конкатенацию строковых переменных, используйте встроенные возможности платформы: Структура, Массив и Соответствие. Это гарантирует, что итоговая строка будет соответствовать стандарту JSON. Давайте разберем по шагам, как собрать корректный запрос.

  1. Создайте Структура, которая будет описывать корневой объект запроса.
  2. Используйте Массив для передачи списков аргументов и параметров.
  3. Примените объект ЗаписьJSON для автоматической сериализации данных в корректную строку.

Пример реализации кода

Рассмотрим пример, который поможет избежать ошибок синтаксиса. При работе с JSON-RPC крайне важно соблюдать структуру, включая обязательные поля, такие как jsonrpc и id.


// Создаем структуру данных для запроса
ДанныеJSON = Новый Структура;
ДанныеJSON.Вставить("jsonrpc", "2.0");
ДанныеJSON.Вставить("method", "call");
ДанныеJSON.Вставить("id", 123456); // Обязательный идентификатор запроса

// Формируем параметры запроса
Параметры = Новый Структура;
Параметры.Вставить("service", "object");
Параметры.Вставить("method", "execute");

// Формируем массив аргументов
Аргументы = Новый Массив;
Аргументы.Добавить("1111");
Аргументы.Добавить(id_1);
Аргументы.Добавить("pass");
Аргументы.Добавить("product");
Аргументы.Добавить("search");

// Вложенный массив для фильтрации
Фильтр = Новый Массив;
Фильтр.Добавить("id");
Фильтр.Добавить("in");
Фильтр.Добавить(Новый Массив);
Фильтр[2].Добавить(888888);
Фильтр[2].Добавить(777777);

МассивФильтров = Новый Массив;
МассивФильтров.Добавить(Фильтр);

Аргументы.Добавить(МассивФильтров);
Параметры.Вставить("args", Аргументы);

ДанныеJSON.Вставить("params", Параметры);

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

Отправка запроса на сервер

После того как строка сформирована, отправляем её с помощью объекта HTTPЗапрос. Важно корректно указать заголовки, чтобы сервер понял, какой формат данных мы передаем.


HTTPЗапрос = Новый HTTPЗапрос("/jsonrpc");
HTTPЗапрос.Заголовки.Вставить("Content-Type", "application/json");
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);

// Отправка соединения
HTTP = Новый HTTPСоединение("test.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL());
Результат = HTTP.ОтправитьДляОбработки(HTTPЗапрос);

Рекомендации для стабильной работы

Чтобы избежать подобных проблем в будущем, придерживайтесь следующих правил:

Проанализировав ситуацию, можно сделать вывод: использование штатных механизмов сериализации 1С — это единственный надежный способ работы с внешними API, исключающий человеческий фактор при формировании JSON-строк.

← На главную