Как правильно распарсить JSON и заполнить табличную часть документа в 1С

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

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

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

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


{
    "count": 8974,
    "data": [
        {
            "ID": 343106,
            "Стоимость": 4452687,
            ...
        },
        ...
    ]
}

Обратим внимание на важный нюанс: корень JSON — это не массив, а объект (соответствие в терминах 1С). Сами записи о квартирах или товарах находятся внутри свойства data. Это типичная структура для API таких систем, как Profitbase или Домопланер. Если мы попытаемся перебирать корень через цикл Для каждого, мы получим всего два элемента: count и data, а не список объектов. Именно это стало первой преградой для автора вопроса.

Разбор типичных ошибок в алгоритме

Рассмотрим исходный код и выясним причины его неработоспособности. Проанализируем фрагмент:


Для каждого ОбъектСт Из ДанныеСтроки Цикл
    ДокУстановкаЦенИДолей = Документы.УстановкаЦенДолейИПомещений.СоздатьДокумент();
    ...
    СтрокаТЧ = ДокУстановкаЦенИДолей.Цены.Добавить();
    Для каждого ТекущееСвойство Из ДанныеСтроки Цикл
        ...
    КонецЦикла; 
    ДокУстановкаЦенИДолей.Записать();
КонецЦикла; 

Здесь мы видим сразу три критические ошибки:

  1. Создание документа внутри цикла. Если в массиве 1000 элементов, система попытается создать 1000 отдельных документов, в каждом из которых будет всего одна строка. Это катастрофически замедляет работу и засоряет базу.
  2. Неверная итерация. Цикл запускается по переменной ДанныеСтроки (корню JSON), а не по вложенному массиву data.
  3. Вложенный цикл по той же коллекции. Во внутреннем цикле автор снова перебирает ДанныеСтроки вместо того, чтобы обрабатывать свойства конкретного объекта из массива.

Шаг 1: Правильное чтение JSON

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


Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТелоОтвета);

// Второй параметр "Истина" означает, что данные будут прочитаны в Соответствие.
// Это важно, так как ключи JSON могут содержать кириллицу или спецсимволы.
ДанныеJSON = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();

Выясним причину использования Соответствие вместо Структура. В 1С Структура требует, чтобы имена ключей соответствовали правилам именования переменных (без пробелов, не начинаться с цифр). Поскольку в JSON от внешних систем ключи могут быть любыми (например, "ID_внешней_системы"), Соответствие — более надежный выбор.

Шаг 2: Доступ к массиву данных

После прочтения нам нужно «провалиться» внутрь ключа data. Проанализируем, как это сделать правильно:


// Проверяем наличие ключа "data" и то, что это массив
Если ДанныеJSON.Получить("data") <> Неопределено Тогда
    МассивОбъектов = ДанныеJSON["data"];
Иначе
    Возврат; // Или обработка ошибки
КонецЕсли;

Теперь переменная МассивОбъектов содержит коллекцию, которую действительно нужно перебирать в цикле для заполнения строк документа.

Шаг 3: Оптимизированное заполнение документа

Разберем, как правильно организовать создание документа и заполнение его табличной части. В то время как мы учимся импортировать данные, стоит помнить, что существует и обратная задача — экспорт любых документов базы в JSON. Вынесем создание объекта ДокументОбъект за пределы цикла:


ДокОбъект = Документы.УстановкаЦенДолейИПомещений.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Ответственный = Пользователи.ТекущийПользователь();
// Заполняем остальные реквизиты шапки...

Для каждого ДанныеОбъекта Из МассивОбъектов Цикл
    
    // Добавляем новую строку в табличную часть
    НоваяСтрока = ДокОбъект.Цены.Добавить();
    
    // Используем заранее подготовленное соответствие полей
    Для каждого Путь Из СоответствиеПолей Цикл
        КлючJSON = Путь.Ключ;
        ИмяРеквизита = Путь.Значение;
        
        // Получаем значение из объекта JSON
        Значение = ДанныеОбъекта.Получить(КлючJSON);
        
        // Важно: обрабатываем Null, так как в JSON он часто встречается
        Если Значение = Null Тогда
            Продолжить;
        КонецЕсли;
        
        НоваяСтрока[ИмяРеквизита] = Значение;
    КонецЦикла;
    
КонецЦикла;

// Записываем документ один раз после заполнения всех строк
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);

Важные нюансы при работе с типами данных

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

Итоговый алгоритм решения

Подведем итог. Чтобы успешно решить задачу, мы должны:

  1. Прочитать строку JSON в Соответствие, чтобы корректно обработать все имена полей.
  2. Обратиться к конкретному узлу-массиву (например, Данные["data"]).
  3. Создать один экземпляр документа до начала цикла.
  4. Внутри цикла по массиву добавлять строки в документ Док.Цены.Добавить().
  5. Осуществить поиск ссылочных объектов в базе 1С по идентификаторам из JSON.
  6. Записать готовый документ одним вызовом метода Записать().

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

← На главную