Работа с форматом 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().
// 1. Инициализируем чтение
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
// 2. Преобразуем JSON в структуру 1С (Массивы и Соответствия/Структуры)
ДанныеИзJSON = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
// 3. Обходим основной массив документов
Для Каждого ЭлементПакета Из ДанныеИзJSON Цикл
// Получаем массив данных документа
МассивДанных = ЭлементПакета.ДанныеДокумента;
Для Каждого СтрокаДанных Из МассивДанных Цикл
// Теперь мы находимся на уровне свойств конкретного документа
КодОрг = СтрокаДанных.КодУчреждения;
ВидДока = СтрокаДанных.ВидДокумента;
// Поиск организации в базе
НайденнаяОрганизация = Справочники.Организации.НайтиПоРеквизиту("КодУчреждения", СокрЛП(КодОрг));
Если НЕ НайденнаяОрганизация.Пустая() Тогда
// Логика создания документа
Если ВидДока = "УПФПР" Тогда
НовыйДокумент = Документы.УтвержденныйПланФинансированияПоРасходам.СоздатьДокумент();
КонецЕсли;
// Заполнение реквизитов...
КонецЕсли;
КонецЦикла;
// Аналогично обрабатываем табличную часть
МассивТабЧасти = ЭлементПакета.ТабЧастьДокумента;
Для Каждого СтрокаТЧ Из МассивТабЧасти Цикл
// Добавление строк в документ...
КонецЦикла;
КонецЦикла;
Чтобы избежать проблем на стороне приемника, рассмотрим, как правильно формировать такую структуру программно. Рекомендуется использовать комбинацию Массив и Структура.
СписокВсехДокументов = Новый Массив;
Для Каждого ТекДок Из ВыборкаДокументов Цикл
ОбъектПакета = Новый Структура;
// Формируем массив для шапки (даже если там один элемент)
МассивШапки = Новый Массив;
ДанныеШапки = Новый Структура;
ДанныеШапки.Вставить("НомДокКлиента", ТекДок.Номер);
ДанныеШапки.Вставить("ВидДокумента", "УПФПР");
МассивШапки.Добавить(ДанныеШапки);
// Формируем массив для табличной части
МассивТЧ = Новый Массив;
Для Каждого Строка Из ТекДок.Состав Цикл
СтрокаТЧ = Новый Структура("Столбец1, Столбец2", Строка.Цена, Строка.Количество);
МассивТЧ.Добавить(СтрокаТЧ);
КонецЦикла;
ОбъектПакета.Вставить("ДанныеДокумента", МассивШапки);
ОбъектПакета.Вставить("ТабЧастьДокумента", МассивТЧ);
СписокВсехДокументов.Добавить(ОбъектПакета);
КонецЦикла;
// Конвертация в строку
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, СписокВсехДокументов);
РезультатСтрокой = ЗаписьJSON.Закрыть();
При работе с внешними запросами (HTTP-сервисами) программисты часто сталкиваются с тем, что точка останова в коде сервиса не срабатывает. Рассмотрим основные моменты, которые помогут наладить процесс:
default.vrd в строке соединения прописан параметр debug="true". Без этого веб-сервер (IIS или Apache) не позволит конфигуратору "подцепиться" к процессу.maximum query string). Используйте метод POST и передавайте данные в теле запроса. В 1С получить их можно методом Запрос.ПолучитьТелоКакСтроку().Свойство(). Например:
Если СтрокаДанных.Свойство("КодУчреждения") Тогда ... КонецЕсли;.Дата, в функции ПрочитатьJSON можно использовать массив имен полей, содержащих даты, в третьем параметре функции.Резюмируем: при работе с JSON в 1С главное — строгое соблюдение иерархии объектов. Всегда проверяйте, является ли значение ключа простым значением, структурой или массивом. Использование правильных инструментов отладки и потоковых методов чтения позволит вам создавать надежные и быстрые интеграционные решения.