При интеграции 1С с внешними системами через HTTP-запросы разработчики часто сталкиваются с ситуацией, когда сервер возвращает формально корректный, но фактически «пустой» ответ. Это может быть пустой массив [], пустой объект {} или даже литерал null. Обычная проверка на пустую строку в таких случаях не срабатывает, что может привести к ошибкам в логике программы или аварийному завершению кода.
В этой статье мы подробно разберем, как надежно определить, что тело JSON-ответа не содержит полезных данных, и как правильно выстроить алгоритм обработки входящих сообщений.
Прежде всего, проанализируем важный технический нюанс, который часто путает начинающих разработчиков. Как справедливо отмечено в обсуждении, строка "[]" — это не пустая строка. С точки зрения 1С, функция ПустаяСтрока() вернет Ложь, так как в строке присутствуют символы (квадратные скобки).
Когда мы используем метод ПрочитатьJSON(), парсер преобразует текст в объекты встроенного языка 1С:
"[]" превращается в объект типа Массив с количеством элементов 0."{}" превращается в объект типа Структура (или Соответствие) без свойств."null" превращается в литерал Null.Рассмотрим стандартный подход к чтению, предложенный в сообщении:
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Результат.ПолучитьТелоКакСтроку());
РезультатЧтенияJSON = ПрочитатьJSON(ЧтениеJSON, Истина);
Если ТипЗнч(РезультатЧтенияJSON) = Тип("Массив") И РезультатЧтенияJSON.Количество() = 0 Тогда
Сообщить("Получен пустой массив данных");
КонецЕсли;
Вместо того чтобы вручную проверять количество элементов в массиве или свойства в структуре, мы рекомендуем использовать встроенную функцию 1С ЗначениеЗаполнено(). Это наиболее «чистый» и универсальный способ в платформе 8.3.
Давайте выясним, почему это удобно:
ПрочитатьJSON вернул пустой массив [], функция ЗначениеЗаполнено() вернет Ложь.{}, результат также будет Ложь.Null функция также вернет Ложь.Таким образом, ваш код становится гораздо лаконичнее и устойчивее к изменениям API сервера. Если завтра сервер вместо массива начнет присылать null, ваша проверка продолжит работать корректно.
Проанализируем ситуацию с точки зрения протокола HTTP. Иногда нам даже не нужно пытаться парсить JSON, чтобы понять, что данных нет. Код состояния ответа (StatusCode) — это первый индикатор, на который стоит смотреть.
[], значит, поисковый запрос не нашел совпадений, но сам список сущностей существует.ПолучитьТелоКакСтроку() или пытаться читать JSON бессмысленно — это может привести к ошибке.Посмотрим на пример правильной предварительной проверки кода состояния:
Если Результат.КодСостояния = 204 Тогда
// Обрабатываем как пустой результат без чтения тела
Возврат;
ИначеЕсли Результат.КодСостояния <> 200 Тогда
// Обрабатываем ошибку сервера
ВызватьИсключение "Ошибка сервера: " + Результат.КодСостояния;
КонецЕсли;
// Только если код 200, переходим к парсингу
СтрокаJSON = Результат.ПолучитьТелоКакСтроку();
Рассмотрим ситуацию, когда сервер может вернуть абсолютно пустое тело (длина строки 0). Если мы передадим такую строку в ЧтениеJSON.УстановитьСтроку(), а затем вызовем ПрочитатьJSON(), платформа может выдать исключение, так как JSON не содержит корневого узла.
Поэтому мы рекомендуем всегда проверять строку перед парсингом:
ТелоОтвета = Результат.ПолучитьТелоКакСтроку();
Если ПустаяСтрока(ТелоОтвета) Тогда
// Здесь ПустаяСтрока сработает правильно для ""
Сообщить("Сервер прислал пустую строку вместо JSON");
Возврат;
КонецЕсли;
Попытка
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТелоОтвета);
Данные = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
Исключение
Сообщить("Ошибка формата JSON: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
Если вы ожидаете очень большие объемы данных и хотите лишь быстро проверить, не пуст ли массив, не обязательно загружать все дерево объектов в память через ПрочитатьJSON(). Мы можем использовать объект ЧтениеJSON в режиме последовательного чтения.
Разберем этот метод по шагам:
ЧтениеJSON.Прочитать(), чтобы перейти к первому узлу.НачалоМассива сразу идет КонецМассива, значит данных нет.Этот способ экономит оперативную память, так как 1С не создает тысячи объектов внутри коллекции, если нам нужно только убедиться в наличии хотя бы одного элемента.
Суммируя все вышесказанное, выделим идеальный алгоритм обработки ответа от сервера в 1С:
Шаг 1. Проверяем КодСостояния. Если он равен 204, считаем результат пустым и завершаем работу.
Шаг 2. Получаем тело ответа как строку и проверяем ее через ПустаяСтрока(). Если строка пуста — парсинг не запускаем.
Шаг 3. Оборачиваем вызов ПрочитатьJSON в блок Попытка...Исключение, чтобы защититься от некорректного формата данных.
Шаг 4. Полученный результат проверяем через ЗначениеЗаполнено(). Если функция вернула Истина, переходим к обработке данных. Если вернула Ложь (для [], {} или null) — информируем пользователя или логируем пустой результат.
Применяя эти правила, вы создадите надежную систему обмена данными, которая не «упадет» при малейшем изменении в ответах внешнего сервиса.