Версия технологической платформы 8.3.6 принесла с собой встроенные объекты для работы с JSON, таки образом моя прошлая статья более не является актуальной, но все еще может пригодиться, если у Вас нет возможности использовать новые версии технологической платформы.
В этой статье будет рассмотрена работа с JSON в 1С стандартными средствами.
Напомню, что JSON — это популярный текстовый формат обмена данными. Несмотря на свое происхождения от JavaScript, JSON считается независимым форматом и может использоваться с практически любым языком программирования.
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 22 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тЗапись = Новый ЗаписьJSON; тЗапись.ОткрытьФайл("C:\test.json"); тДанные = Новый Структура; тДанные.Вставить("ЧислоJSON", 100); тДанные.Вставить("СтрокаJSON", "test"); тДанные.Вставить("ДатаJSON", Дата(2016, 1, 15)); тНастройкиСериализации = Новый НастройкиСериализацииJSON; тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; //"ДатаJSON": "2016-03-15T14:19:48" //тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.JavaScript; "ДатаJSON": "new Date(1452805200000)" //тНастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.Microsoft; "ДатаJSON": "/Date(1452805200000)/" //тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата; "ДатаJSON": "2016-01-15T00:00:00" //тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением; "ДатаJSON": "2016-01-15T00:00:00+03:00" тНастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата; //"ДатаJSON": "2016-01-14T21: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 22 | &НаКлиенте Процедура ЗаписатьВJSON(Команда) тЗапись = Новый ЗаписьJSON; тЗапись.ОткрытьФайл("C:\test.json"); тДанные = Новый Структура; тДанные.Вставить("ЧислоJSON", 100); тДанные.Вставить("СтрокаJSON", "test"); тДанные.Вставить("ДатаJSON", Дата(2016, 1, 15)); тДанные.Вставить("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:\test.json", , , тПараметрыJSON); тЗапись.ЗаписатьНачалоОбъекта(); тЗапись.ЗаписатьИмяСвойства("ЧислоJSON"); тЗапись.ЗаписатьЗначение(100); тЗапись.ЗаписатьИмяСвойства("СтрокаJSON"); тЗапись.ЗаписатьЗначение("test"); тЗапись.ЗаписатьИмяСвойства("МассивJSON"); тЗапись.ЗаписатьНачалоМассива(); тЗапись.ЗаписатьЗначение(1); тЗапись.ЗаписатьЗначение(2); тЗапись.ЗаписатьКонецМассива(); тЗапись.ЗаписатьКонецОбъекта(); тЗапись.Закрыть(); КонецПроцедуры |
В коде выше используется объект «ПараметрыЗаписиJSON» с помощью которого можно указать вид переноса строк, символ отступа, использование двойных кавычек, а так же необходимость экранирования различных символов.
При формировании документа JSON можно совмещать объектную и потоковую запись.
Теперь перейдем к чтению JSON, самый простой вариант:
1 2 3 4 5 6 7 8 9 10 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\test.json"); тДанные = ПрочитатьJSON(тЧтение, Ложь); тДатаJSON = ПрочитатьДатуJSON(тДанные.ДатаJSON, ФорматДатыJSON.ISO); тЧтение.Закрыть(); КонецПроцедуры |
В примере выше отдельно показано преобразование даты JSON в дату 1С.
Также как и для записи, для чтения существует вариант с т.н. функцией восстановления:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\test.json"); тДанные = ПрочитатьJSON(тЧтение, Ложь, , , "ФункцияВосстановления", ЭтотОбъект); тЧтение.Закрыть(); КонецПроцедуры &НаКлиенте Функция ФункцияВосстановления(Свойство, Значение, ДополнительныеПараметры) Экспорт Если Свойство = "ДатаJSON"Тогда Возврат ПрочитатьДатуJSON(Значение, ФорматДатыJSON.ISO); КонецЕсли; Если Свойство = "СтрокаJSON" Тогда Возврат СокрЛП(Значение); КонецЕсли; Если Свойство = "uidJSON" Тогда Возврат Новый УникальныйИдентификатор(Значение); КонецЕсли; КонецФункции |
Результат практически тот же самый, но «ДатаJSON» и «uidJSON» приведены к типам 1С.
Так же как и для записи, для чтения JSON можно применить потоковый вариант — он особенно полезен, когда объем JSON-данных велик (не загружает эти данные в память), а искомое значение находится в начале файла.
Простой вариант потокового чтения выглядит так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | &НаКлиенте Процедура ЧтениеИзJSON(Команда) тЧтение = Новый ЧтениеJSON; тЧтение.ОткрытьФайл("C:\test.json"); Пока тЧтение.Прочитать() Цикл Сообщить("Тип текущего элемента " + тЧтение.ТипТекущегоЗначения); Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда Сообщить("Имя = " + тЧтение.ТекущееЗначение); КонецЕсли; Если тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Булево ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Число ИЛИ тЧтение.ТипТекущегоЗначения = ТипЗначенияJSON.Комментарий Тогда Сообщить("Значение = " + тЧтение.ТекущееЗначение); КонецЕсли; КонецЦикла; тЧтение.Закрыть(); КонецПроцедуры |
На этом все, надеюсь эта статья Вам помогла.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Первая дельная статья на эту тему. Супер!
Очень полезная публикация!!!
Никак не описана передача дробного числа со значением после запятой, вот где главная засада.
Так дробные числа передаются без проблем, в крайнем случае можно преобразовывать в строку через Формат, или еще как вариант через кратность, например 3.456 * 1000, зная кратность, можно выполнить обратное преобразование 3456 / 1000, таким образом дробные числа превращаются в целые.
В примере чтения даты дата представлена строкой, а если дата представлена числом, например 1506550142409, как это чтение преобразовать в тип Дата?
Вот нашел решение:
СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON,,, ФорматДатыJSON.JavaScript);
Дата =ПрочитатьДатуJSON(«new Date(» + Формат(СтруктураОтвета.date, «ЧГ=») + «)», ФорматДатыJSON.JavaScript);
А если чтение json выполняется на стороне сервере, то как передать модуль востановления значений?
Чтение.ОткрытьФайл(«C:\test.json»);
А на диск С с дискетки его копировать?
Было бы здорово увидеть пример обработки json файла полученного через веб-запрос