Работа с JSON в 1С (сериализация и десериализация)

Что такое JSON

JSON (JavaScript Object Notation) — это текстовый формат обмена данными, основанный на синтаксисе языка JavaScript. Несмотря на происхождение, JSON давно стал универсальным стандартом передачи данных между различными системами и языками программирования. По сравнению с XML он более лаконичен и занимает меньше места. Все современные браузеры имеют встроенные средства для работы с JSON, что делает его идеальным выбором для веб-интеграций. Платформа 1С:Предприятие предоставляет развитые средства для работы с этим форматом, начиная с версии 8.3.6.

JSON строится на двух основных структурах данных:

  1. Коллекция пар «ключ — значение» (в разных языках реализуется как объект, структура, словарь или ассоциативный массив)
  2. Упорядоченный список значений (реализуется как массив, список или вектор)

В JSON поддерживаются следующие типы данных:

ТипОписаниеПример
СтрокаТекст в двойных кавычках"Привет"
ЧислоЦелое или с плавающей точкой123, 45.67
БулевоЛогическое значениеtrue, false
nullПустое значениеnull
ОбъектКоллекция пар «ключ: значение» в фигурных скобках{"имя": "Иван"}
МассивУпорядоченный список значений в квадратных скобках[1, 2, 3]

Пример JSON документа:

 {
    "имя": "Иван Петров",
    "возраст": 35,
    "женат": true,
    "телефоны": ["+7-999-123-45-67", "+7-916-987-65-43"],
    "адрес": null
  }

JSON обладает несколькими важными преимуществами:

  • человекочитаемый формат;
  • компактность по сравнению с XML;
  • поддерживается практически всеми современными технологиями;
  • легко преобразуется в структуры данных большинства языков программирования.

Работа с JSON в 1С

Поддержка JSON появилась в платформе 1С:Предприятие 8.3 и постепенно расширялась от версии к версии.

При работе с JSON постоянно встречаются два понятия — сериализация и десериализация.

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

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

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

Потоковая работа с JSON

Потоковый способ — самый низкоуровневый и одновременно самый гибкий. Для него используются объекты:

  • ЗаписьJSON;
  • ЧтениеJSON.

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

{ 
"name": "Иван", 
"age": 30 
}

Сформировать его можно следующим образом:

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

Запись.ЗаписатьНачалоОбъекта(); 

Запись.ЗаписатьИмяСвойства("name"); 
Запись.ЗаписатьЗначение("Иван"); 
Запись.ЗаписатьИмяСвойства("age"); 
Запись.ЗаписатьЗначение(30); 

Запись.ЗаписатьКонецОбъекта(); 

СтрокаJSON = Запись.Закрыть();

Преимущество такого подхода — полный контроль над получаемым JSON. Мы сами решаем, какие свойства записывать, в каком порядке и в какой момент. Но за эту гибкость приходится платить количеством кода. Если нужно просто преобразовать обычную структуру 1С в JSON, вручную записывать каждое свойство обычно нет смысла.

Еще одно преимущество потокового способа — возможность работать с документом последовательно, не формируя его целиком в памяти. Поэтому он особенно полезен для больших JSON-файлов и других случаев, когда объем данных значителен.

Объектная работа с JSON

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

Например:

Данные = Новый Структура; 
Данные.Вставить("name", "Иван"); 
Данные.Вставить("age", 30); 
Данные.Вставить("online", Истина);

Для сериализации можно использовать ЗаписатьJSON():

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

В результате получится:

{ 
"name": "Иван", 
"age": 30, 
"online": true 
}

В потоковом варианте мы сами записывали каждое свойство. Здесь же мы сначала создали готовую структуру 1С, а ЗаписатьJSON() уже самостоятельно преобразовал ее в JSON.

Также можно работать с вложенными структурами и массивами:

Заказ = Новый Структура; 
Заказ.Вставить("number", "000001"); 

Товары = Новый Массив; 

Товар = Новый Структура; 
Товар.Вставить("name", "Ноутбук"); 
Товар.Вставить("quantity", 2); 

Товары.Добавить(Товар); 
Заказ.Вставить("items", Товары);

После сериализации получим:

{ 
"number": "000001", 
"items": [ 
     { 
     "name": "Ноутбук", 
     "quantity": 2 
     } ] 
}

При чтении происходит обратный процесс. Допустим, внешняя система вернула:

{ 
"success": true, 
"orderId": 157 
}

Прочитать его можно так:

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

После этого результат можно использовать как обычную структуру.

Начиная с платформы 8.3.23 появился еще более простой вариант объектной работы: ЗаписатьЗначениеJSON и ПрочитатьЗначениеJSON. Здесь вообще не нужно самостоятельно создавать ЗаписьJSON или ЧтениеJSON.

То есть вместо:

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

можно просто написать:

СтрокаJSON = ЗаписатьЗначениеJSON(Данные);

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

Сериализация через XDTO

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

  • СправочникСсылка.Номенклатура
  • ДокументОбъект.ЗаказКлиента
  • ТаблицаЗначений
  • СписокЗначений

Если нужно сериализовать такие данные с сохранением информации об их типах, используется механизм XDTO.

Это третий уровень работы с JSON, который появился именно для сериализации прикладных типов 1С. Платформа позволяет сериализовать через XDTO ссылки, объекты, наборы записей и другие типы, для которых поддерживается XDTO-сериализация.

Здесь важно поговорить красто о двух связанных понятиях — ФабрикаXDTO и СериализаторXDTO.

ФабрикаXDTO содержит описание доступных XDTO-пакетов и типов, позволяет создавать XDTO-объекты и работать с их моделью. Говоря просым языком мы создаем некий шаблон модели или ее чертеж.

СериализаторXDTO используетсяЮ когда нужно непосредственно превратить обычный объект 1С в JSON и затем восстановить его обратно. Можно сказать, что это инструмент, который создает объект по шаблону или чертежу фабрики.

Например:

Номенклатура = Справочники.Номенклатура.НайтиПоКоду("000001"); 
НоменклатураОбъект = Номенклатура.ПолучитьОбъект(); 
Запись = Новый ЗаписьJSON; 
Запись.УстановитьСтроку(); 
СериализаторXDTO.ЗаписатьJSON( Запись, НоменклатураОбъект , НазначениеТипаXML.Явное ); 
СтрокаJSON = Запись.Закрыть();

При десериализации используется обратная операция:

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

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

Как выбрать, какой метод использовать

Ниже приведены случае, когда лучше использовать каждый из представленных методов

Потоковый метод:

  • JSON имеет сложную или нестандартную структуру;
  • требуется точно контролировать формируемый документ;
  • данные нужно записывать или читать постепенно;
  • JSON настолько большой, что нежелательно полностью загружать его в память.

Объектный метод:

  • REST API;
  • обмен с сайтом;
  • мобильные приложения;
  • получение данных от внешних сервисов;
  • отправка структурированных данных;
  • небольшие и средние JSON-документы.

Через объекты XDTO:

  • обмен данными между двумя информационными базами 1С, когда важно сохранить типы передаваемых значений;
  • передача ссылок на объекты 1С, например СправочникСсылка.Номенклатура или ДокументСсылка.ЗаказКлиента;
  • сериализация объектов 1С с большим количеством реквизитов без ручного преобразования каждого из них в структуру;
  • передача сложных прикладных типов 1С, которые нельзя напрямую представить обычными строками, числами, структурами и массивами

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправьте форму и мы вам перезвоним

Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу
Сайт itviar.ru использует cookie для персонализации и хранения настроек.
Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу