Получить консультацию

Работа с JSON в 1С 8.3.

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

Содержание

Немного о формате JSON

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

Некоторые варианты применения JSON в 1С:

  • Обмен с веб-приложениями и внешними системами при помощи HTTP-интерфейсов
  • Построение своего HTTP-интерфейса прикладного решения
  • Формирование и обмен файлами JSON, например, файлами настроек и конфигураций

Формат JSON является более компактным, по сравнению с XML. Он легко читаем, занимает меньший объем, является весьма простым в освоении и использовании. За счет своей лаконичности, JSON хорошо подходит для сериализации сложных структур с большим уровнем вложенности.

Текст в формате JSON может содержать в себе одну из двух структур:

  • Множество пар Ключ: Значение, заключенное в фигурные скобки {}
  • Упорядоченный массив значений, заключенный в квадратные скобки []

Объектный подход

Язык 1С позволяет конвертировать в JSON примитивные типы и некоторые коллекции значений: структуры, соответствия, массивы и их фиксированные варианты (ФиксированныйМассив и т.п.). Преимуществом данного подхода является очень небольшое количество требуемого кода.

Объектная запись JSON

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

МассивЗначений = Новый Массив;
МассивЗначений.Добавить(1);
МассивЗначений.Добавить("два");
МассивЗначений.Добавить(ТекущаяДата());
СоответствиеЗначенией = Новый Соответствие;
СоответствиеЗначенией.Вставить("123", 123);
МассивЗначений.Добавить(СоответствиеЗначенией);
ЗначениеДляЗаписи = Новый ФиксированныйМассив(МассивЗначений);

Сам же код формирования JSON очень короткий. Мы используем объект ЗаписьJSON и метод глобального контекста ЗаписатьJSON. Чтобы получить на выходе текст JSON в виде строки, используем метод УстановитьСтроку.

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

В результате получим строку следующего вида:

[
1,
"два",
"2022-02-27T18:10:00",
{
"123": 123
}
]

Кроме строки, ЗаписьJSON может поместить полученный JSON текст в файл либо в поток в памяти.

Объектное чтение JSON

В качестве входного текста JSON используем текст, полученный в предыдущем разделе. Десериализуем его вновь в массив значений:

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

ЧтениеJSON может в качестве входного объекта получать строку, файл или поток в памяти. Обратите внимание, т.к. в файле JSON есть пара “123”:123, ключ “123” не является валидным ключом структуры в 1С, поэтому десериализация в структуру невозможна. Но платформа предусматривает возможность чтения в соответствие – за это отвечает второй параметр в методе ПрочитатьJSON.

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

{
"key": "value1",
"key": "value2",
"key": "value3"
}

ЧтениеJSON из рассмотренного выше примера в этом случае вернет соответствие с одной единственной парой: “key”:”value3″. Т.е. при наличии в исходном JSON-объекте повторяющихся ключей, 1С будет использовать самую последнюю запись с повторяющимся ключом.

Функции восстановления и работа с датами в JSON

Следующий нюанс который стоит рассмотреть при чтении JSON – это т.н. функции восстановления и работа с датами. Поскольку формат JSON используется в самых различных системах, то и значения даты могут в нем содержаться в разных форматах. 1С поддерживает три формата: ISO, JavaScript и Microsoft.

Функции восстановления же используются для реализации более сложных алгоритмов преобразования JSON объектов в объекты 1С. Рассмотрим пример получения курса валюты в виде JSON объекта следующего вида:

{
"base": "USD",
"date": "2022-02-27T00:00:00",
"rate": 100
}

Для восстановления даты из строки воспользуемся параметрами ИменаСвойствСоЗначениямиДата и ОжидаемыйФорматДаты. Для восстановление ссылки на валюту воспользуемся параметрами ИмяФункцииВосстановления и МодульФункцииВосстановления. В качестве модуля передадим текущую форму (ЭтотОбъект). Если не указать явно состав имен свойств, которые будут передаваться в функцию восстановления, будут обработаны все свойства. И в этом случае будет проигнорированы параметры восстановления даты.

Соответственно, понадобится реализовывать код восстановления даты непосредственно в функции восстановления. Но можно пойти другим путем, и указать конкретные имена свойств, которые будут обрабатываться – в нашем примере только свойство “base”. В итоге получим следующий код:

ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
МассивИменВосстановления = Новый Массив;
МассивИменВосстановления.Добавить("base");
ОбъектИзJSON = ПрочитатьJSON(ЧтениеJSON, , "date", ФорматДатыJSON.ISO, "ФункцияВосстановленияЧтениеКурса", ЭтотОбъект,,МассивИменВосстановления);
ЧтениеJSON.Закрыть();
&НаКлиенте
Функция ФункцияВосстановленияЧтениеКурса(Свойство, Значение, ДополнительныеПараметры) Экспорт
	Если Свойство = "base" Тогда
		Возврат ПолучитьВалюту(Значение);
	КонецЕсли;
КонецФункции

&НаСервере
Функция ПолучитьВалюту(Значение)
	Возврат Справочники.Валюты.НайтиПоНаименованию(Значение);
КонецФункции

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

JSON в 1С 8.3 - Функция восстановления

Потоковый подход к работе с JSON в 1С

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

Потоковая запись JSON

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

ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
ПострочнаяЗаписьJSON = Новый ЗаписьJSON;
//Чтобы запись осуществлялась быстрее, отключим встроенные проверки корректности JSON
ПострочнаяЗаписьJSON.ПроверятьСтруктуру = Ложь;

ПострочнаяЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
//Вариант 2 - запись в файл
//ПострочнаяЗаписьJSON.ОткрытьФайл("C:\test.json", , , ПараметрыJSON);
ПострочнаяЗаписьJSON.ЗаписатьНачалоОбъекта();
	ПострочнаяЗаписьJSON.ЗаписатьИмяСвойства("ЧислоJSON");
	ПострочнаяЗаписьJSON.ЗаписатьЗначение(777);
	ПострочнаяЗаписьJSON.ЗаписатьИмяСвойства("СтрокаJSON");
	ПострочнаяЗаписьJSON.ЗаписатьЗначение("Текстовая информация");
	ПострочнаяЗаписьJSON.ЗаписатьИмяСвойства("МассивJSON");
	ПострочнаяЗаписьJSON.ЗаписатьНачалоМассива();
		ПострочнаяЗаписьJSON.ЗаписатьЗначение(1);
		ПострочнаяЗаписьJSON.ЗаписатьЗначение(Истина);
	ПострочнаяЗаписьJSON.ЗаписатьКонецМассива();

	ПострочнаяЗаписьJSON.ЗаписатьИмяСвойства("ПовторяющийсяКлюч");
	ПострочнаяЗаписьJSON.ЗаписатьЗначение("Первое значение");
	ПострочнаяЗаписьJSON.ЗаписатьИмяСвойства("ПовторяющийсяКлюч");
	ПострочнаяЗаписьJSON.ЗаписатьЗначение("Второе значение");
ПострочнаяЗаписьJSON.ЗаписатьКонецОбъекта();
СтрокаJSON = ПострочнаяЗаписьJSON.Закрыть();

Получим JSON строку следующего вида:

{
"ЧислоJSON": 777,
"СтрокаJSON": "Текстовая информация",
"МассивJSON": [
1,
true
],
"ПовторяющийсяКлюч": "Первое значение",
"ПовторяющийсяКлюч": "Второе значение"
}

Потоковое чтение JSON

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

В рассмотренном примере ниже, мы используем вспомогательное соответствие, чтобы получать значения именно нужных свойств. Также используется вспомогательная переменная, которая определяет – вести запись в массив, либо же в соответствие. Разумеется, настоящий рабочий код построчного чтения JSON будет сложнее, и будет содержать большее количество условий и проверок.

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

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

ЧтениеJSON.Закрыть();

Сериализация прикладных объектов

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

Получение JSON-представления прикладного объекта

В рассмотренном ниже примере мы сериализуем предопределенный элемент справочника Валюты. Обратите внимание, чтобы получить все содержимое (реквизиты и табличные части), нам нужно обязательно получить сам объект. В противном случае, будет сериализована только ссылка.

ПараметрыJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);
//Вариант 2 - запись в файл
//ЗаписьJSON.ОткрытьФайл("C:\test.json", , , ПараметрыJSON);
СериализуемоеЗначение = Справочники.Валюты.USD.ПолучитьОбъект();
СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, СериализуемоеЗначение, НазначениеТипаXML.Явное);
СтрокаJSON = ЗаписьJSON.Закрыть();

В результате получим строку JSON:

{
	"#type": "jcfg:CatalogObject.Валюты",
	"#value": {
		"Ref": "22ddebc2-97eb-11ec-a0e8-2c4d5450919d",
		"DeletionMark": false,
		"Code": "000000001",
		"Description": "USD",
		"PredefinedDataName": "USD"
	}
}

Десериализация JSON в прикладной объект

Десериализация из JSON-представления снова в прикладной объект выполняется при помощи объектов ЧтениеJSON и СериализаторXDTO. Важно, чтобы считываемый JSON был именно полным представлением объекта со всеми реквизитами. Рассмотрим чтение строки JSON из предыдущего примера.

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

Это упрощенный пример – при помощи объекта СериализаторXDTO также можно использовать функции восстановления, с настраиваемыми параметрами и свойствами для восстановления.

В результате будет получен объект справочника Валюты:

1C Сериализация объекта JSON

На этом все. Надеюсь, данная статья поможет вам освоить запись и чтение JSON средствами платформы 1С 8.3

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

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

1 × 3 =

К НАЧАЛУ