Платформа 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С
При потоковом чтении или записи 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 также можно использовать функции восстановления, с настраиваемыми параметрами и свойствами для восстановления.
В результате будет получен объект справочника Валюты:
На этом все. Надеюсь, данная статья поможет вам освоить запись и чтение JSON средствами платформы 1С 8.3