Работа с внешними API и обработка данных в формате JSON — одна из самых частых задач современного разработчика 1С. Для тех, кто только начинает погружение в тему обмена данными, будут полезны интерактивные курсы по работе с HTTP-запросами и JSON. Однако при обработке вложенных структур новички часто сталкиваются с тем, что данные «не видны» или документ заполняется некорректно. В этой статье мы подробно разберем, как правильно прочитать JSON, получить доступ к массиву объектов и оптимизировать процесс заполнения табличной части документа.
Прежде чем приступать к написанию кода, проанализируем структуру входящего сообщения. Чтобы наглядно представить иерархию полей, можно использовать обработку для просмотра данных JSON в дереве значений. В предоставленном примере мы видим объект, который содержит метаданные и основной массив данных:
{
"count": 8974,
"data": [
{
"ID": 343106,
"Стоимость": 4452687,
...
},
...
]
}
Обратим внимание на важный нюанс: корень JSON — это не массив, а объект (соответствие в терминах 1С). Сами записи о квартирах или товарах находятся внутри свойства data. Это типичная структура для API таких систем, как Profitbase или Домопланер. Если мы попытаемся перебирать корень через цикл Для каждого, мы получим всего два элемента: count и data, а не список объектов. Именно это стало первой преградой для автора вопроса.
Рассмотрим исходный код и выясним причины его неработоспособности. Проанализируем фрагмент:
Для каждого ОбъектСт Из ДанныеСтроки Цикл
ДокУстановкаЦенИДолей = Документы.УстановкаЦенДолейИПомещений.СоздатьДокумент();
...
СтрокаТЧ = ДокУстановкаЦенИДолей.Цены.Добавить();
Для каждого ТекущееСвойство Из ДанныеСтроки Цикл
...
КонецЦикла;
ДокУстановкаЦенИДолей.Записать();
КонецЦикла;
Здесь мы видим сразу три критические ошибки:
ДанныеСтроки (корню JSON), а не по вложенному массиву data.ДанныеСтроки вместо того, чтобы обрабатывать свойства конкретного объекта из массива.В 1С для парсинга мы используем объект ЧтениеJSON и функцию ПрочитатьJSON. Рассмотрим правильную настройку чтения:
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ТелоОтвета);
// Второй параметр "Истина" означает, что данные будут прочитаны в Соответствие.
// Это важно, так как ключи JSON могут содержать кириллицу или спецсимволы.
ДанныеJSON = ПрочитатьJSON(Чтение, Истина);
Чтение.Закрыть();
Выясним причину использования Соответствие вместо Структура. В 1С Структура требует, чтобы имена ключей соответствовали правилам именования переменных (без пробелов, не начинаться с цифр). Поскольку в JSON от внешних систем ключи могут быть любыми (например, "ID_внешней_системы"), Соответствие — более надежный выбор.
После прочтения нам нужно «провалиться» внутрь ключа data. Проанализируем, как это сделать правильно:
// Проверяем наличие ключа "data" и то, что это массив
Если ДанныеJSON.Получить("data") <> Неопределено Тогда
МассивОбъектов = ДанныеJSON["data"];
Иначе
Возврат; // Или обработка ошибки
КонецЕсли;
Теперь переменная МассивОбъектов содержит коллекцию, которую действительно нужно перебирать в цикле для заполнения строк документа.
Разберем, как правильно организовать создание документа и заполнение его табличной части. В то время как мы учимся импортировать данные, стоит помнить, что существует и обратная задача — экспорт любых документов базы в JSON. Вынесем создание объекта ДокументОбъект за пределы цикла:
ДокОбъект = Документы.УстановкаЦенДолейИПомещений.СоздатьДокумент();
ДокОбъект.Дата = ТекущаяДата();
ДокОбъект.Ответственный = Пользователи.ТекущийПользователь();
// Заполняем остальные реквизиты шапки...
Для каждого ДанныеОбъекта Из МассивОбъектов Цикл
// Добавляем новую строку в табличную часть
НоваяСтрока = ДокОбъект.Цены.Добавить();
// Используем заранее подготовленное соответствие полей
Для каждого Путь Из СоответствиеПолей Цикл
КлючJSON = Путь.Ключ;
ИмяРеквизита = Путь.Значение;
// Получаем значение из объекта JSON
Значение = ДанныеОбъекта.Получить(КлючJSON);
// Важно: обрабатываем Null, так как в JSON он часто встречается
Если Значение = Null Тогда
Продолжить;
КонецЕсли;
НоваяСтрока[ИмяРеквизита] = Значение;
КонецЦикла;
КонецЦикла;
// Записываем документ один раз после заполнения всех строк
ДокОбъект.Записать(РежимЗаписиДокумента.Запись);
Проанализируем ситуацию с типами данных. JSON — это слаботипизированный формат. В 1С мы должны строго следить за соответствием типов реквизитов. Чтобы организовать надежную интеграцию между 1С без боли и страданий, разработчики часто применяют специализированные фреймворки.
null. При попытке записать его в числовой реквизит 1С возникнет ошибка. Всегда используйте проверку или функцию ?(Значение = Null, 0, Значение).СправочникСсылка.Номенклатура). В этом случае перед записью в строку нужно выполнить поиск: НоваяСтрока.Объект = Справочники.Помещения.НайтиПоРеквизиту("ID", ЗначениеID);.Подведем итог. Чтобы успешно решить задачу, мы должны:
Соответствие, чтобы корректно обработать все имена полей.Данные["data"]).Док.Цены.Добавить().Записать().Использование отладчика на этапе получения ДанныеJSON позволит вам наглядно увидеть структуру полученного объекта и убедиться, что вы обращаетесь к правильным ключам. Помните, что работа с коллекциями в 1С требует четкого понимания того, какой объект находится в итерации в данный момент — корень ответа или конкретный элемент данных.