Перейти к основному содержимому

JSON в интеграции 1С

Разработчику Архитектору

Зачем JSON в 1С

JSON (JavaScript Object Notation) — текстовый формат обмена данными. На платформе 8.3 он используется при вызове внешних REST API, в телах HTTP-сервисов, в конфигурационных файлах обмена и при интеграции с маркетплейсами, банками, сайтами.

Платформа даёт три уровня работы с JSON — от низкоуровневого потока до сериализации ссылок и документов. Выбор уровня зависит от объёма данных, типов в документе и требований контрагента.

УровеньОбъектыКогда применять
ПотоковыйЗаписьJSON, ЧтениеJSONБольшие файлы, ручной контроль структуры, ответ HTTP-сервиса «по кускам»
Объектный (коллекции)ЗаписатьJSON(), ПрочитатьJSON()Структура, Массив, Соответствие — типичный REST-обмен
Прикладные типыСериализаторXDTO.ЗаписатьJSON()Ссылки, объекты, наборы записей — обмен между базами 1С или строгий контракт

См. также Коллекции значений — типы, которые попадают в JSON на втором уровне.


Потоковая запись и чтение

Объекты ЗаписьJSON и ЧтениеJSON обходят документ поэлементно, без загрузки всего файла в память. Удобно для выгрузки больших выборок и формирования ответа HTTP-сервиса.

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("Наименование");
Запись.ЗаписатьЗначение("Товар А");
Запись.ЗаписатьКонецОбъекта();
СтрокаJSON = Запись.Закрыть();

Чтение — симметрично: ЧтениеJSON.УстановитьСтроку() или ОткрытьФайл(), затем цикл по Прочитать() с разбором типа текущего значения (ИмяСвойства, НачалоОбъекта, КонецОбъекта и т.д.).

Проверка структуры
По умолчанию ЗаписьJSON проверяет корректность вложенности. Для нестандартных схем можно отключить: Запись.ПроверятьСтруктуру = Ложь.


Объектная техника — коллекции

Методы глобального контекста ЗаписатьJSON() и ПрочитатьJSON() сериализуют примитивы и коллекции платформы целиком в память.

Запись:

Данные = Новый Структура;
Данные.Вставить("Контрагент", "ООО Пример");
Данные.Вставить("Сумма", 150000);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
СтрокаJSON = Запись.Закрыть();

Чтение возвращает Структура, Массив, Соответствие, числа, строки, булево, Неопределено, Дата.

Структура или соответствие

По умолчанию ключи читаются в структуру. Имена свойств с точками, пробелами или спецсимволами ("user.first", "Объем Продаж") в структуру не помещаются — нужно читать в соответствие:

Данные = ПрочитатьJSON(Чтение, Истина); // второй параметр — в соответствие

Функции преобразования

Если внешний API отдаёт телефоны в неудобном виде или даты в нестандартном формате, в ЗаписатьJSON / ПрочитатьJSON передают функцию преобразования и контекст (ЭтотОбъект). Для ускорения чтения больших файлов можно ограничить список свойств, для которых вызывается восстановление.

Даты

JSON не задаёт единый формат даты. Платформа поддерживает ФорматДатыJSON: ISO, JavaScript и др. При записи — через НастройкиСериализацииJSON; при чтении — параметры ИменаСвойствСоЗначениямиДата и формат.


Прикладные типы через XDTO

Коллекции не сериализуют ссылки на справочники и объекты документов. Для прикладных типов используют СериализаторXDTO:

Сериализатор = Новый СериализаторXDTO;
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Сериализатор.ЗаписатьJSON(Запись, ОбъектДокумента);
СтрокаJSON = Запись.Закрыть();

Чтение — СериализаторXDTO.ПрочитатьJSON(Чтение, Тип("СправочникОбъект.Номенклатура")). Подробнее про XML и XDTO-пакеты — в материалах фазы 3 (хаб интеграции).


Смешанная техника

На практике комбинируют уровни:

  • HTTP-сервис отдаёт список через потоковую запись в цикле по выборке (экономия памяти);
  • входящее тело POST разбирают ПрочитатьJSON в структуру;
  • выгрузка пакета для другой базы 1С — XDTO в файл.

Типичные ошибки

СимптомПричинаРешение
Ошибка при чтении в структуруНедопустимые символы в имени свойстваПрочитатьJSON(..., Истина) — в соответствие
Пустая ссылка после чтенияОжидали GUID, пришла строка представленияФункция восстановления или явный поиск по коду
«Память» при большой выгрузкеОбъектная техника держит весь JSON в RAMПотоковая запись ЗаписьJSON
Неверная дата в контрагентеРазные форматы ISO / JavaScriptЯвно задать ФорматДатыJSON и список полей-дат

Связанные материалы


Проверка себя

  • Когда выберете потоковую запись вместо ЗаписатьJSON?
  • В какой коллекции прочитаете JSON с ключом "поле №2"?
  • Чем сериализация через XDTO отличается от записи структуры с GUID в строке?

См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").