При интеграции 1С с внешними системами через HTTP-запросы (например, с Zabbix API) разработчики часто сталкиваются с ошибкой Invalid JSON. An error occurred on the server while parsing the JSON text (код -32700). Эта ошибка означает, что сервер не смог распознать присланный текст как корректную структуру JSON. Разберем типичные причины этой проблемы и рассмотрим надежные способы формирования запросов.
Рассмотрим ситуацию, когда текст запроса собирается «руками» как обычная многострочная строка. Проанализируем пример кода, который часто приводит к ошибкам:
СтрокаJSON = "{
| ""jsonrpc"":""2.0"",
| ""method"":""host.get"",
| ""params"":{
| ""output"": [""hostid"", ""host""],
| ""selectInterfaces"": [
| ""interfaceid"", ""ip""
| ]
| }
| },
| ""id"": 2,
| ""auth"": Аид
| }";
В данном фрагменте кроются сразу три критические ошибки:
params. В JSON структура должна быть строго иерархичной. Лишняя скобка разрывает объект раньше времени.Аид написан прямо внутри строки. Для 1С это просто набор символов «А-и-д», а не значение переменной. Чтобы вставить значение переменной, нужно использовать конкатенацию.Если мы все же решим собирать строку вручную, исправленный вариант будет выглядеть так:
// Используем кавычки внутри строки и конкатенацию переменной Аид
СтрокаJSON = "{
|""jsonrpc"": ""2.0"",
|""method"": ""host.get"",
|""params"": {
| ""output"": [""hostid"", ""host""],
| ""selectInterfaces"": [""interfaceid"", ""ip""]
|},
|""auth"": """ + Аид + """,
|""id"": 2
|}";
Здесь мы используем конструкцию """ + Аид + """, чтобы обернуть строковое значение переменной в двойные кавычки, которые требует стандарт JSON. Однако такой метод крайне хрупок: любая опечатка в скобках или кавычках приведет к невалидности всего пакета.
Проанализируем более современный и надежный подход. Вместо того чтобы следить за каждой запятой, мы доверим формирование текста платформе 1С. Для этого будем использовать объекты Структура, Массив и ЗаписьJSON.
Рассмотрим пошаговый алгоритм:
// 1. Формируем вложенные параметры
Параметры = Новый Структура;
Параметры.Вставить("output", Новый Массив);
Параметры.output.Добавить("hostid");
Параметры.output.Добавить("host");
Параметры.Вставить("selectInterfaces", Новый Массив);
Параметры.selectInterfaces.Добавить("interfaceid");
Параметры.selectInterfaces.Добавить("ip");
// 2. Формируем основной корень запроса
КорневойОбъект = Новый Структура;
КорневойОбъект.Вставить("jsonrpc", "2.0");
КорневойОбъект.Вставить("method", "host.get");
КорневойОбъект.Вставить("params", Параметры);
КорневойОбъект.Вставить("id", 2);
КорневойОбъект.Вставить("auth", Аид); // Переменная вставляется как значение
// 3. Сериализуем структуру в строку JSON
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, КорневойОбъект);
СтрокаJSON = ЗаписьJSON.Закрыть();
Почему это лучше? Платформа сама расставит все кавычки, правильно экранирует спецсимволы в строках, верно преобразует числа и булевы значения, а также гарантирует отсутствие лишних запятых. Этот код гораздо легче читать и модифицировать.
Выясним некоторые технические нюансы, которые помогут сделать вашу интеграцию более профессиональной.
1. Авторизация через заголовки (Zabbix 5.4+)
В новых версиях Zabbix передача auth в теле запроса считается устаревшей. Рекомендуется использовать заголовок HTTP. В 1С это реализуется так:
HTTPЗапрос.Заголовки.Вставить("Authorization", "Bearer " + Аид);
В этом случае из структуры params поле auth можно удалить.
2. Обработка больших ответов
Если вы запрашиваете данные по тысячам хостов, метод Ответ.ПолучитьТелоКакСтроку() может вызвать переполнение памяти. Проанализируем альтернативный вариант — чтение через файл:
ИмяФайла = ПолучитьИмяВременногоФайла("json");
Ответ.ЗаписатьТелоВФайл(ИмяФайла);
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.ОткрытьФайл(ИмяФайла);
Данные = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
УдалитьФайлы(ИмяФайла);
3. Проверка SSL-соединения
При работе с защищенным соединением Новый ЗащищенноеСоединениеOpenSSL() важно помнить, что если на сервере Zabbix стоит самоподписанный сертификат, 1С может разорвать соединение. Для отладки в локальной сети иногда используют конструктор без проверки сертификатов, но в промышленной эксплуатации лучше добавить сертификат сервера в хранилище доверенных сертификатов ОС или 1С.
4. Обработка типов данных
Помните, что при использовании ЗаписатьJSON:
Дата преобразуются в строки. Если Zabbix ждет Unix Timestamp, преобразуйте дату в число (секунды с 1970 года) до вставки в структуру.Неопределено и Null обрабатываются по-разному. Убедитесь, что внешняя система понимает значение null, иначе используйте пустые строки.Использование встроенных функций сериализации ЗаписатьJSON и ПрочитатьJSON — это стандарт современной разработки на платформе 1С 8.3, который сводит вероятность синтаксических ошибок в запросах к нулю.