Как правильно прочитать вложенную структуру JSON в 1С и избежать ошибок при обработке данных?

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

Работа с форматом JSON стала стандартом де-факто для обмена данными между 1С и внешними системами через HTTP-сервисы. Однако при обработке сложных, иерархических структур начинающие разработчики часто сталкиваются с ошибками доступа к полям объектов. В рамках данной статьи мы подробно разберем, как правильно десериализовать JSON, обращаться к вложенным массивам и настраивать среду для отладки подобных механизмов.

Анализируем структуру данных

Прежде чем приступать к написанию кода, крайне важно проанализировать входящую строку JSON. Рассмотрим типичный пример структуры, с которой часто возникают сложности:


[
  {
    "ДанныеДокумента": [
      {
        "НомДокКлиента": "4155-000000001",
        "ДатаДокКлиента": "2018-05-05T13:18:11",
        "ВидДокумента": "УПФПР",
        "КодУчреждения": "2530"
      }
    ],
    "ТабЧастьДокумента": [
      { "Столбец1": 1, "Столбец2": 2 }
    ]
  }
]

Проанализируем ситуацию: корень документа представляет собой массив (квадратные скобки []). Внутри этого массива находятся объекты (фигурные скобки {}). В каждом объекте есть ключи ДанныеДокумента и ТабЧастьДокумента, значениями которых снова являются массивы. Именно здесь кроется самая частая ошибка: попытка обратиться к полю КодУчреждения напрямую через объект верхнего уровня, игнорируя промежуточный массив.

Типичная ошибка: "Поле объекта не обнаружено"

Выясним причину ошибки, возникающей при выполнении следующего кода:


Для Каждого ТекДанный2 Из ДанныеДокументаJSON Цикл
    // ОШИБКА ТУТ: ТекДанный2.КодУчреждения — такого поля нет, 
    // так как внутри ТекДанный2 лежит массив "ДанныеДокумента"
    НайденнаяОрганизация = Справочники.Организации.НайтиПоРеквизиту("КодУчреждения", ТекДанный2.КодУчреждения);
КонецЦикла;

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

Правильный алгоритм чтения JSON

Разберем по шагам, как корректно прочитать и обработать такие данные. Мы будем использовать встроенные средства платформы: объект ЧтениеJSON и функцию ПрочитатьJSON().


// 1. Инициализируем чтение
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);

// 2. Преобразуем JSON в структуру 1С (Массивы и Соответствия/Структуры)
ДанныеИзJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

// 3. Обходим основной массив документов
Для Каждого ЭлементПакета Из ДанныеИзJSON Цикл
    
    // Получаем массив данных документа
    МассивДанных = ЭлементПакета.ДанныеДокумента;
    
    Для Каждого СтрокаДанных Из МассивДанных Цикл
        // Теперь мы находимся на уровне свойств конкретного документа
        КодОрг = СтрокаДанных.КодУчреждения;
        ВидДока = СтрокаДанных.ВидДокумента;
        
        // Поиск организации в базе
        НайденнаяОрганизация = Справочники.Организации.НайтиПоРеквизиту("КодУчреждения", СокрЛП(КодОрг));
        
        Если НЕ НайденнаяОрганизация.Пустая() Тогда
            // Логика создания документа
            Если ВидДока = "УПФПР" Тогда
                НовыйДокумент = Документы.УтвержденныйПланФинансированияПоРасходам.СоздатьДокумент();
            КонецЕсли;
            // Заполнение реквизитов...
        КонецЕсли;
    КонецЦикла;
    
    // Аналогично обрабатываем табличную часть
    МассивТабЧасти = ЭлементПакета.ТабЧастьДокумента;
    Для Каждого СтрокаТЧ Из МассивТабЧасти Цикл
        // Добавление строк в документ...
    КонецЦикла;
    
КонецЦикла;

Как правильно формировать JSON для отправки

Чтобы избежать проблем на стороне приемника, рассмотрим, как правильно формировать такую структуру программно. Рекомендуется использовать комбинацию Массив и Структура.


СписокВсехДокументов = Новый Массив;

Для Каждого ТекДок Из ВыборкаДокументов Цикл
    
    ОбъектПакета = Новый Структура;
    
    // Формируем массив для шапки (даже если там один элемент)
    МассивШапки = Новый Массив;
    ДанныеШапки = Новый Структура;
    ДанныеШапки.Вставить("НомДокКлиента", ТекДок.Номер);
    ДанныеШапки.Вставить("ВидДокумента", "УПФПР");
    МассивШапки.Добавить(ДанныеШапки);
    
    // Формируем массив для табличной части
    МассивТЧ = Новый Массив;
    Для Каждого Строка Из ТекДок.Состав Цикл
        СтрокаТЧ = Новый Структура("Столбец1, Столбец2", Строка.Цена, Строка.Количество);
        МассивТЧ.Добавить(СтрокаТЧ);
    КонецЦикла;
    
    ОбъектПакета.Вставить("ДанныеДокумента", МассивШапки);
    ОбъектПакета.Вставить("ТабЧастьДокумента", МассивТЧ);
    
    СписокВсехДокументов.Добавить(ОбъектПакета);
КонецЦикла;

// Конвертация в строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СписокВсехДокументов);
РезультатСтрокой = ЗаписьJSON.Закрыть();

Тонкости отладки и производительности

При работе с внешними запросами (HTTP-сервисами) программисты часто сталкиваются с тем, что точка останова в коде сервиса не срабатывает. Рассмотрим основные моменты, которые помогут наладить процесс:

  1. Настройка отладки на сервере: Убедитесь, что в файле публикации default.vrd в строке соединения прописан параметр debug="true". Без этого веб-сервер (IIS или Apache) не позволит конфигуратору "подцепиться" к процессу.
  2. Использование POST вместо GET: Если вы передаете большие JSON-строки, никогда не передавайте их через параметры URL (строка запроса). У веб-серверов есть жесткие лимиты на длину URL (например, в IIS это maximum query string). Используйте метод POST и передавайте данные в теле запроса. В 1С получить их можно методом Запрос.ПолучитьТелоКакСтроку().
  3. Безопасное чтение свойств: Чтобы код не падал при отсутствии какого-либо ключа в JSON, используйте метод Свойство(). Например: Если СтрокаДанных.Свойство("КодУчреждения") Тогда ... КонецЕсли;.
  4. Работа с датами: По умолчанию 1С считывает даты из JSON как строки. Чтобы они автоматически преобразовывались в тип Дата, в функции ПрочитатьJSON можно использовать массив имен полей, содержащих даты, в третьем параметре функции.

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

← На главную