При интеграции 1С со сторонними сервисами через протокол JSON-RPC часто возникает ошибка 400 Bad Request. Она сигнализирует о том, что сервер не смог распознать отправленный вами пакет данных из-за нарушения структуры или синтаксиса JSON. Давайте разберем, почему это происходит и как правильно организовать передачу данных.
Основная проблема при ручном формировании JSON-строки в коде 1С заключается в высокой вероятности допустить опечатку: пропустить кавычку, поставить лишнюю запятую в конце массива или забыть закрывающую фигурную скобку. Сервер, получая такой «битый» JSON, возвращает ошибку Invalid JSON data.
Кроме того, распространенная ошибка — попытка формирования JSON как обычной строки с последующим пропуском через ЗаписьJSON. В результате 1С экранирует все кавычки внутри вашей строки, превращая код в нечитаемый для API стороннего ПО набор символов.
Вместо того чтобы собирать JSON вручную как конкатенацию строковых переменных, используйте встроенные возможности платформы: Структура, Массив и Соответствие. Это гарантирует, что итоговая строка будет соответствовать стандарту JSON. Давайте разберем по шагам, как собрать корректный запрос.
Структура, которая будет описывать корневой объект запроса.Массив для передачи списков аргументов и параметров.Запись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Запрос);
Чтобы избежать подобных проблем в будущем, придерживайтесь следующих правил:
ЗаписатьJSON: это избавляет от необходимости следить за экранированием символов и запятыми.id присутствует в вашем запросе, так как многие серверы JSON-RPC отклоняют запросы без него.ЗащищенноеСоединениеOpenSSL при инициализации HTTPСоединение, иначе вызов может завершиться ошибкой соединения до того, как данные достигнут сервера.Проанализировав ситуацию, можно сделать вывод: использование штатных механизмов сериализации 1С — это единственный надежный способ работы с внешними API, исключающий человеческий фактор при формировании JSON-строк.