JSON в 1С

С выходом новой версии системы (платформы) 1С:Предприятие, а именно 8.36, были внесены новые полезные функции и обновления этой самой системы. Одним из таких нововведений стало появление возможности работы с JSON в виде встроенных объектов.
Здесь будет рассматриваться процесс работы с JSON в 1С:Предприятие стандартными средствами.
Формат JSON — это широко известный формат для обмена данными, который был впервые придуман для «JavaScript», но впоследствии перешел во многие современные языки программирования. Он является независимым типом, так что его можно использовать для обмена данными между разными языками без каких—либо неудобств и сложностей.
JSON — это быстрый формат, дающий ему заметные отличия от, допустим, XML.
Далее будет приведена выдержка основных особенностей с портала ИТС:
Формат JSON является универсальным способом представления при обмене данными. Данные в формате JSON представляют собой (в закодированном виде):
Объект – неупорядоченное множество пар ключ:значение, заключенный в фигурные скобки ({}). Пары ключ:значение разделяются запятыми (,);
Массив – множество значений. Массив заключается в квадратные скобки ([]). Значения разделяются запятыми (,);
Значение – может быть строкой, числом, объектом, массивов или литералом true, false, null:
Строка – набор символов, заключенный в двойные кавычки («»);
Число – сериализуется с разделителем точка (.). Точность числа не ограничена.
Исходя из вышеописанного, с помощью представленных элементов возможно описание объектов любой сложности, что даст возможность передачи данных с помощью формата JSON.
Рассмотрим запись с помощью формата JSON. Создадим простую структуру:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тЗапись = Новый ЗаписьJSON; тЗапись.ОткрытьФайл("D:\training.json"); тДанные = Новый Структура; тДанные.Вставить("ЧислоJSON", 250); тДанные.Вставить("СтрокаJSON", "training"); тДанные.Вставить("ДатаJSON", Дата(2019, 10, 05)); тНастройкиСериализации = Новый НастройкиСериализацииJSON; тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; //"ДатаJSON": "2019-10-06T17:17:28" //тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.JavaScript; "ДатаJSON": "new Date(1538705200000)" //тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.Microsoft; "ДатаJSON": "/Date(1538705200000)/" //тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата; "ДатаJSON": "2019-10-05T00:00:00" //тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением; "ДатаJSON": "2019-10-05T00:00:00+03:00" тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата; //"ДатаJSON": "2019-10-04T22:00:00Z" ЗаписатьJSON(тЗапись, тДанные, тНастройкиСериализации); тЗапись.Закрыть(); |
Здесь, с помощью использования двух свойств объекта «НастройкиСериализацииJSON» и системными перечислениями, что соответствуют «ФорматДатыJSON» и «ВариантЗаписиДатыJSON» было определено представление дат.
«JavaScript» и «Microsoft» формат даты имеет смысл указывать только тогда, когда этот формат — универсальная дата, в противном случае возникнет ошибка.
Далеко не каждый тип данных 1С может быть JSON—сериализуемым, эта проблема решается при помощи функции преобразования (здесь с помощью ключевого слова «Экспорт»). Формат сериализации придется написать самому, вручную. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тЗапись = Новый ЗаписьJSON; тЗапись.ОткрытьФайл("D:\training.json "); тДанные = Новый Структура; тДанные.Вставить("ЧислоJSON", 250); тДанные.Вставить("СтрокаJSON", "training"); тДанные.Вставить("ДатаJSON", Дата(2019, 10, 05)); тДанные.Вставить("uidJSON", Новый УникальныйИдентификатор); ЗаписатьJSON(тЗапись, тДанные, Новый НастройкиСериализацииJSON, "ФункцияПреобразования", ЭтотОбъект); тЗапись.Закрыть(); КонецПроцедуры &НаКлиенте Функция ФункцияПреобразования(Свойство, Значение, ДополнительныеПараметры, Отказ) Экспорт Если ТипЗнч(Значение) = Тип("УникальныйИдентификатор") Тогда Возврат Строка(Значение); КонецЕсли; Отказ = Истина; |
Случается, что в системе отсутствует готовый объект, нужный для записи, вместо этого мы располагаем такими данными, которым нужна предварительная обработка. Для того. что бы не пришлось изменять формат промежуточного объекта, стоит использовать возможностью потоковой записью:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина); тЗапись = Новый ЗаписьJSON; тЗапись.ПроверятьСтруктуру = Истина; тЗапись.ОткрытьФайл("C:\training.json", , , тПараметрыJSON); тЗапись.ЗаписатьНачалоОбъекта(); тЗапись.ЗаписатьИмяСвойства("ЧислоJSON"); тЗапись.ЗаписатьЗначение(250); тЗапись.ЗаписатьИмяСвойства("СтрокаJSON"); тЗапись.ЗаписатьЗначение("training"); тЗапись.ЗаписатьИмяСвойства("МассивJSON"); тЗапись.ЗаписатьНачалоМассива(); тЗапись.ЗаписатьЗначение(1); тЗапись.ЗаписатьЗначение(2); тЗапись.ЗаписатьКонецМассива(); тЗапись.ЗаписатьКонецОбъекта(); тЗапись.Закрыть(); КонецПроцедуры |
Здесь был использован объект «ПараметрыЗаписиJSON», который может указывать вид переноса строк, использование двойных кавычек, символ отступа и тд.
Далее следует чтение формата JSON. Например:
1 2 3 4 5 6 7 8 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\training.json"); тДанные = ПрочитатьJSON(тЧтение, Ложь); тДатаJSON = ПрочитатьДатуJSON(тДанные.ДатаJSON, ФорматДатыJSON.ISO); тЧтение.Закрыть(); КонецПроцедуры |
Для процесса чтения существует возможность воспользоваться функцией восстановления, как, собственно, и для записи:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\training.json"); тДанные = ПрочитатьJSON(тЧтение, Ложь, , , "ФункцияВосстановления", ЭтотОбъект); тЧтение.Закрыть(); КонецПроцедуры &НаКлиенте Функция ФункцияВосстановления(Свойство, Значение, ДополнительныеПараметры) Экспорт Если Свойство = "ДатаJSON"Тогда Возврат ПрочитатьДатуJSON(Значение, ФорматДатыJSON.ISO); КонецЕсли; Если Свойство = "СтрокаJSON" Тогда Возврат СокрЛП(Значение); КонецЕсли; Если Свойство = "uidJSON" Тогда Возврат Новый УникальныйИдентификатор(Значение); КонецЕсли; КонецФункции |
Для процесса чтения JSON возможно применять потоковый вариант, так же как для записи. Полезен он, когда размер JSON—данных большой (не может загрузить эти данные в память), а значение, которое ищется, находится в самом начале:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\training.json"); Пока тЧтение.Прочитать() Цикл Сообщить("Тип текущего элемента " + тЧтение.ТипТекущегоЗначения); Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда Сообщить("Имя = " + тЧтение.ТекущееЗначение); КонецЕсли; Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Булево ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Число ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Комментарий Тогда Сообщить("Значение = " + тЧтение.ТекущееЗначение); КонецЕсли; КонецЦикла; тЧтение.Закрыть(); КонецПроцедуры |
