Как правильно проверить JSON-ответ на пустоту в 1С?

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

При интеграции 1С с внешними системами через HTTP-запросы разработчики часто сталкиваются с ситуацией, когда сервер возвращает формально корректный, но фактически «пустой» ответ. Это может быть пустой массив [], пустой объект {} или даже литерал null. Обычная проверка на пустую строку в таких случаях не срабатывает, что может привести к ошибкам в логике программы или аварийному завершению кода.

В этой статье мы подробно разберем, как надежно определить, что тело JSON-ответа не содержит полезных данных, и как правильно выстроить алгоритм обработки входящих сообщений.

Различие между пустой строкой и пустым JSON-объектом

Прежде всего, проанализируем важный технический нюанс, который часто путает начинающих разработчиков. Как справедливо отмечено в обсуждении, строка "[]" — это не пустая строка. С точки зрения 1С, функция ПустаяСтрока() вернет Ложь, так как в строке присутствуют символы (квадратные скобки).

Когда мы используем метод ПрочитатьJSON(), парсер преобразует текст в объекты встроенного языка 1С:

Рассмотрим стандартный подход к чтению, предложенный в сообщении:


ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
РезультатЧтенияJSON = ПрочитатьJSON(ЧтениеJSON, Истина);

Если ТипЗнч(РезультатЧтенияJSON) = Тип("Массив") И РезультатЧтенияJSON.Количество() = 0 Тогда
    Сообщить("Получен пустой массив данных");
КонецЕсли;

Универсальный способ проверки: функция ЗначениеЗаполнено()

Вместо того чтобы вручную проверять количество элементов в массиве или свойства в структуре, мы рекомендуем использовать встроенную функцию 1С ЗначениеЗаполнено(). Это наиболее «чистый» и универсальный способ в платформе 8.3.

Давайте выясним, почему это удобно:

  1. Если ПрочитатьJSON вернул пустой массив [], функция ЗначениеЗаполнено() вернет Ложь.
  2. Если вернулась пустая структура {}, результат также будет Ложь.
  3. Для значения Null функция также вернет Ложь.

Таким образом, ваш код становится гораздо лаконичнее и устойчивее к изменениям API сервера. Если завтра сервер вместо массива начнет присылать null, ваша проверка продолжит работать корректно.

Анализ HTTP-кодов состояния

Проанализируем ситуацию с точки зрения протокола HTTP. Иногда нам даже не нужно пытаться парсить JSON, чтобы понять, что данных нет. Код состояния ответа (StatusCode) — это первый индикатор, на который стоит смотреть.

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


Если Результат.КодСостояния = 204 Тогда
    // Обрабатываем как пустой результат без чтения тела
    Возврат; 
ИначеЕсли Результат.КодСостояния <> 200 Тогда
    // Обрабатываем ошибку сервера
    ВызватьИсключение "Ошибка сервера: " + Результат.КодСостояния;
КонецЕсли;

// Только если код 200, переходим к парсингу
СтрокаJSON = Результат.ПолучитьТелоКакСтроку();

Безопасное чтение «сырого» тела

Рассмотрим ситуацию, когда сервер может вернуть абсолютно пустое тело (длина строки 0). Если мы передадим такую строку в ЧтениеJSON.УстановитьСтроку(), а затем вызовем ПрочитатьJSON(), платформа может выдать исключение, так как JSON не содержит корневого узла.

Поэтому мы рекомендуем всегда проверять строку перед парсингом:


ТелоОтвета = Результат.ПолучитьТелоКакСтроку();

Если ПустаяСтрока(ТелоОтвета) Тогда
    // Здесь ПустаяСтрока сработает правильно для ""
    Сообщить("Сервер прислал пустую строку вместо JSON");
    Возврат;
КонецЕсли;

Попытка
    Чтение = Новый ЧтениеJSON;
    Чтение.УстановитьСтроку(ТелоОтвета);
    Данные = ПрочитатьJSON(Чтение);
    Чтение.Закрыть();
Исключение
    Сообщить("Ошибка формата JSON: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

Оптимизация: Потоковое чтение для проверки содержимого

Если вы ожидаете очень большие объемы данных и хотите лишь быстро проверить, не пуст ли массив, не обязательно загружать все дерево объектов в память через ПрочитатьJSON(). Мы можем использовать объект ЧтениеJSON в режиме последовательного чтения.

Разберем этот метод по шагам:

  1. Инициализируем ЧтениеJSON.
  2. Вызываем метод Прочитать(), чтобы перейти к первому узлу.
  3. Проверяем тип узла. Если после НачалоМассива сразу идет КонецМассива, значит данных нет.

Этот способ экономит оперативную память, так как 1С не создает тысячи объектов внутри коллекции, если нам нужно только убедиться в наличии хотя бы одного элемента.

Итоговый рекомендуемый алгоритм

Суммируя все вышесказанное, выделим идеальный алгоритм обработки ответа от сервера в 1С:

Шаг 1. Проверяем КодСостояния. Если он равен 204, считаем результат пустым и завершаем работу.

Шаг 2. Получаем тело ответа как строку и проверяем ее через ПустаяСтрока(). Если строка пуста — парсинг не запускаем.

Шаг 3. Оборачиваем вызов ПрочитатьJSON в блок Попытка...Исключение, чтобы защититься от некорректного формата данных.

Шаг 4. Полученный результат проверяем через ЗначениеЗаполнено(). Если функция вернула Истина, переходим к обработке данных. Если вернула Ложь (для [], {} или null) — информируем пользователя или логируем пустой результат.

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

← На главную