При обмене данными через формат JSON программисты часто сталкиваются с ситуацией, когда структура файла может меняться. Например, в одном документе может быть заполнена табличная часть с товарами, а в другом — только с услугами. Если в коде просто обратиться к свойству, которого нет в прочитанном объекте (например, СтруктураJSON.Товары), система выдаст критическую ошибку. Разберем подробно, как правильно проверять входящие данные, чтобы сделать загрузку стабильной и универсальной.
Когда мы используем стандартную функцию ПрочитатьJSON(), содержимое файла чаще всего преобразуется в объект 1С Структура. Это наиболее удобный формат для работы, так как он позволяет обращаться к полям через точку. Чтобы проверить, существует ли в этой структуре нужный нам ключ (например, массив товаров), мы должны использовать встроенный метод Свойство(). Проанализируем типичный пример реализации:
// Предположим, ДанныеJSON - это структура, полученная после ПрочитатьJSON()
Если ДанныеJSON.Свойство("Товары") Тогда
// Мы убедились, что ключ существует
Для Каждого СтрокаТовара Из ДанныеJSON.Товары Цикл
// Обработка данных
КонецЦикла;
Иначе
Сообщить("Секция 'Товары' отсутствует в файле");
КонецЕсли;
Этот метод возвращает булево значение (Истина или Ложь). Обратите внимание: проверка через Свойство() избавляет нас от необходимости использовать конструкцию Попытка...Исключение, что положительно сказывается на производительности и чистоте кода.
Рассмотрим ситуацию, когда ключи в JSON не соответствуют правилам именования переменных в 1С (например, начинаются с цифр или содержат пробелы). В этом случае функция ПрочитатьJSON() создаст не Структуру, а объект Соответствие. Метод Свойство() у соответствия отсутствует. Выясним, как проверить наличие ключа в этом случае:
// Если объект является Соответствием
ЗначениеСекции = ДанныеJSON.Получить("Товары");
Если ЗначениеСекции <> Неопределено Тогда
// Секция найдена, можно работать со ЗначениеСекции
КонецЕсли;
Важно помнить, что если в самом JSON значение ключа явно прописано как null, то метод Получить() вернет Null, а не Неопределено. Это критически важно для корректной логики условий.
Частая ошибка начинающих разработчиков — проверять только наличие ключа, забывая о его содержимом. Если ключ в JSON есть, но его значение пустое ("Товары": null), метод Свойство() вернет Истина. Однако при попытке вызвать Количество() или перебрать такой объект в цикле, программа аварийно завершится. Разберем правильный алгоритм двойной проверки:
Если ДанныеJSON.Свойство("Товары") И ДанныеJSON.Товары <> Null Тогда
// Теперь мы уверены, что свойство есть и оно не равно Null
Если ТипЗнч(ДанныеJSON.Товары) = Тип("Массив") И ДанныеJSON.Товары.Количество() > 0 Тогда
// Обрабатываем только заполненный массив
КонецЕсли;
КонецЕсли;
Если файл весит десятки или сотни мегабайт, загрузка его целиком в память через ПрочитатьJSON() может привести к зависанию сервера. В таких ситуациях мы рекомендуем использовать объект ЧтениеJSON для последовательного обхода. Проанализируем, как искать нужную структуру «на лету»:
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\temp\data.json");
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипУзла = ТипУзлаJSON.ИмяСвойства И Чтение.ТекущееЗначение = "Товары" Тогда
// Мы нашли начало нужной секции
// Читаем следующий узел, который должен быть началом массива
Чтение.Прочитать();
МассивТоваров = ПрочитатьJSON(Чтение); // Читаем только эту подструктуру
Прервать; // Если нам нужны только товары, выходим из цикла
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Для проектов с жесткими требованиями к входящим данным наиболее профессиональным подходом будет использование XDTO. Вы можете описать схему данных (аналог XSD для XML), и система сама проверит JSON на соответствие этой схеме в момент чтения. Если структура нарушена, 1С выдаст ошибку еще на этапе парсинга, что гарантирует безопасность дальнейшей обработки данных. При необходимости организовать миграцию между базами 1С с несовпадающей структурой объектов обработка для переноса данных между похожими конфигурациями 1С позволяет настраивать правила сопоставления по произвольным полям поиска.
Посмотрим на еще один продвинутый метод — использование параметра ФункцияВосстановления в методе ПрочитатьJSON. Это позволяет программно «подставлять» пустые массивы или значения по умолчанию прямо во время парсинга, если в исходном файле они отсутствуют. Это значительно упрощает основной код загрузки, так как вы всегда будете работать с объектом, в котором гарантированно есть все необходимые ключи.
Резюме: для простых задач достаточно метода Свойство(), но всегда дополняйте его проверкой на Null и проверкой типа данных (Массив/Структура), чтобы избежать ошибок выполнения.