Как правильно передать параметр в JSON-запрос из 1С и избежать ошибок парсинга?

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

При интеграции 1С с внешними системами через HTTP-запросы (например, с Zabbix API) разработчики часто сталкиваются с ошибкой Invalid JSON. An error occurred on the server while parsing the JSON text (код -32700). Эта ошибка означает, что сервер не смог распознать присланный текст как корректную структуру JSON. Разберем типичные причины этой проблемы и рассмотрим надежные способы формирования запросов.

Причина ошибки: ручное формирование строки JSON

Рассмотрим ситуацию, когда текст запроса собирается «руками» как обычная многострочная строка. Проанализируем пример кода, который часто приводит к ошибкам:


СтрокаJSON = "{
                |    ""jsonrpc"":""2.0"", 
                |    ""method"":""host.get"",
                |    ""params"":{
                |        ""output"": [""hostid"", ""host""],
                |        ""selectInterfaces"": [
                |                    ""interfaceid"", ""ip""
                |                ]
                |            }
                |    },
                |  ""id"": 2,
                |  ""auth"": Аид
                | }";

В данном фрагменте кроются сразу три критические ошибки:

  1. Лишние знаки пунктуации: Обратите внимание на запятую и закрывающую фигурную скобку после блока params. В JSON структура должна быть строго иерархичной. Лишняя скобка разрывает объект раньше времени.
  2. Передача переменных: Идентификатор Аид написан прямо внутри строки. Для 1С это просто набор символов «А-и-д», а не значение переменной. Чтобы вставить значение переменной, нужно использовать конкатенацию.
  3. Отсутствие кавычек для строковых значений: Даже если мы соединим строки правильно, значение токена авторизации должно быть в кавычках (согласно стандарту JSON для строковых типов данных).

Способ 1: Исправление ручного формирования (не рекомендуется)

Если мы все же решим собирать строку вручную, исправленный вариант будет выглядеть так:


// Используем кавычки внутри строки и конкатенацию переменной Аид
СтрокаJSON = "{
    |""jsonrpc"": ""2.0"",
    |""method"": ""host.get"",
    |""params"": {
    |    ""output"": [""hostid"", ""host""],
    |    ""selectInterfaces"": [""interfaceid"", ""ip""]
    |},
    |""auth"": """ + Аид + """,
    |""id"": 2
|}";

Здесь мы используем конструкцию """ + Аид + """, чтобы обернуть строковое значение переменной в двойные кавычки, которые требует стандарт JSON. Однако такой метод крайне хрупок: любая опечатка в скобках или кавычках приведет к невалидности всего пакета.

Способ 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.Закрыть();

Почему это лучше? Платформа сама расставит все кавычки, правильно экранирует спецсимволы в строках, верно преобразует числа и булевы значения, а также гарантирует отсутствие лишних запятых. Этот код гораздо легче читать и модифицировать.

Важные дополнения для работы с Zabbix API

Выясним некоторые технические нюансы, которые помогут сделать вашу интеграцию более профессиональной.

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:

Использование встроенных функций сериализации ЗаписатьJSON и ПрочитатьJSON — это стандарт современной разработки на платформе 1С 8.3, который сводит вероятность синтаксических ошибок в запросах к нулю.

← На главную