Как в 1С проверить наличие ключа или структуры при загрузке JSON?

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

При обмене данными через формат JSON программисты часто сталкиваются с ситуацией, когда структура файла может меняться. Например, в одном документе может быть заполнена табличная часть с товарами, а в другом — только с услугами. Если в коде просто обратиться к свойству, которого нет в прочитанном объекте (например, СтруктураJSON.Товары), система выдаст критическую ошибку. Разберем подробно, как правильно проверять входящие данные, чтобы сделать загрузку стабильной и универсальной.

Использование метода Свойство() для объектов типа Структура

Когда мы используем стандартную функцию ПрочитатьJSON(), содержимое файла чаще всего преобразуется в объект 1С Структура. Это наиболее удобный формат для работы, так как он позволяет обращаться к полям через точку. Чтобы проверить, существует ли в этой структуре нужный нам ключ (например, массив товаров), мы должны использовать встроенный метод Свойство(). Проанализируем типичный пример реализации:


// Предположим, ДанныеJSON - это структура, полученная после ПрочитатьJSON()
Если ДанныеJSON.Свойство("Товары") Тогда
    // Мы убедились, что ключ существует
    Для Каждого СтрокаТовара Из ДанныеJSON.Товары Цикл
        // Обработка данных
    КонецЦикла;
Иначе
    Сообщить("Секция 'Товары' отсутствует в файле");
КонецЕсли;

Этот метод возвращает булево значение (Истина или Ложь). Обратите внимание: проверка через Свойство() избавляет нас от необходимости использовать конструкцию Попытка...Исключение, что положительно сказывается на производительности и чистоте кода.

Нюансы работы с Соответствием (Map)

Рассмотрим ситуацию, когда ключи в JSON не соответствуют правилам именования переменных в 1С (например, начинаются с цифр или содержат пробелы). В этом случае функция ПрочитатьJSON() создаст не Структуру, а объект Соответствие. Метод Свойство() у соответствия отсутствует. Выясним, как проверить наличие ключа в этом случае:


// Если объект является Соответствием
ЗначениеСекции = ДанныеJSON.Получить("Товары");
Если ЗначениеСекции <> Неопределено Тогда
    // Секция найдена, можно работать со ЗначениеСекции
КонецЕсли;

Важно помнить, что если в самом JSON значение ключа явно прописано как null, то метод Получить() вернет Null, а не Неопределено. Это критически важно для корректной логики условий.

Проверка на Null и пустые коллекции

Частая ошибка начинающих разработчиков — проверять только наличие ключа, забывая о его содержимом. Если ключ в JSON есть, но его значение пустое ("Товары": null), метод Свойство() вернет Истина. Однако при попытке вызвать Количество() или перебрать такой объект в цикле, программа аварийно завершится. Разберем правильный алгоритм двойной проверки:


Если ДанныеJSON.Свойство("Товары") И ДанныеJSON.Товары <> Null Тогда
    // Теперь мы уверены, что свойство есть и оно не равно Null
    Если ТипЗнч(ДанныеJSON.Товары) = Тип("Массив") И ДанныеJSON.Товары.Количество() > 0 Тогда
        // Обрабатываем только заполненный массив
    КонецЕсли;
КонецЕсли;

Потоковое чтение для больших файлов

Если файл весит десятки или сотни мегабайт, загрузка его целиком в память через ПрочитатьJSON() может привести к зависанию сервера. В таких ситуациях мы рекомендуем использовать объект ЧтениеJSON для последовательного обхода. Проанализируем, как искать нужную структуру «на лету»:


Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("C:\temp\data.json");

Пока Чтение.Прочитать() Цикл
    Если Чтение.ТипУзла = ТипУзлаJSON.ИмяСвойства И Чтение.ТекущееЗначение = "Товары" Тогда
        // Мы нашли начало нужной секции
        // Читаем следующий узел, который должен быть началом массива
        Чтение.Прочитать(); 
        МассивТоваров = ПрочитатьJSON(Чтение); // Читаем только эту подструктуру
        Прервать; // Если нам нужны только товары, выходим из цикла
    КонецЕсли;
КонецЦикла;

Чтение.Закрыть();

Валидация через XDTO

Для проектов с жесткими требованиями к входящим данным наиболее профессиональным подходом будет использование XDTO. Вы можете описать схему данных (аналог XSD для XML), и система сама проверит JSON на соответствие этой схеме в момент чтения. Если структура нарушена, 1С выдаст ошибку еще на этапе парсинга, что гарантирует безопасность дальнейшей обработки данных. При необходимости организовать миграцию между базами 1С с несовпадающей структурой объектов обработка для переноса данных между похожими конфигурациями 1С позволяет настраивать правила сопоставления по произвольным полям поиска.

Функция восстановления (Default values)

Посмотрим на еще один продвинутый метод — использование параметра ФункцияВосстановления в методе ПрочитатьJSON. Это позволяет программно «подставлять» пустые массивы или значения по умолчанию прямо во время парсинга, если в исходном файле они отсутствуют. Это значительно упрощает основной код загрузки, так как вы всегда будете работать с объектом, в котором гарантированно есть все необходимые ключи.

Резюме: для простых задач достаточно метода Свойство(), но всегда дополняйте его проверкой на Null и проверкой типа данных (Массив/Структура), чтобы избежать ошибок выполнения.

← На главную