Чтение и запись в формате JSON
Одна из проблем ( или неудобств) работы в формате JSON связана с преобразованием строки в дату. На помощь этой проблемы, без необходимости написания собственных функций преобразований, приходят функции глобального контекста :
- ЗаписатьДатуJSON(<Дата>, <Формат>, <ВариантЗаписиДаты>) – Преобразовывает дату в строку для последующей записи в формат JSON
- ПрочитатьДатуJSON(<Строка>, <Формат>) – Выполняет преобразование строки, прочитанной в JSON-формате, в значение типа Дата.
Главное – записать дату в том же формате ФорматДатыJSON , в котором будете прочитать. Формат, в котором представлена дата в строке, подлежащей преобразованию имеет следующие значения:
- ФорматДатыJSON.ISO – формат вида: “ГГГГ-ММ-ДДTЧЧ:ММ:ССZ”, Например: “2009-02-15T00:00:00Z”.
- ФорматДатыJSON.JavaScript – формат вида : “1234656000000”.
- ФорматДатыJSON.Microsoft – Формат вида: “/Date(123456000000)/”.
Более подробный теоретический материал о работе в формате JSON можно прочитать здесь
Для демонстрации механизм чтения и записи в формате Json я создал обработку выгрузки и загрузки документа “Заявки” на ремонт оборудования (См рис 1).
Эти Заявки создаются в пункте приема оборудования различных граждан. Оборудование курьером ( доверенным лицом или представителем ) оправляется к исполнителю ( авторизированному сервисному центру, далее АСЦ). В заявке указываются данные оборудования и его владельца для открытия заказ-наряда в АСЦ.
Программный код процедуры записи заявки в текстовом файле в формате JSON показан в следующем фрагменте модуля управляемой формы обработки ( Для упрощения демонстрации примера сокращены количество выгружаемых данных ) :
&НаСервере
Процедура ВыгрузитьНаСервере(Заявка,Папка)
ПолноеИмяФайла = Папка+ "Заявка_"+Заявка.Номер+".txt";
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
Запись = Новый ЗаписьJSON;
Запись.ПроверятьСтруктуру = Истина;
Запись.ОткрытьФайл(ПолноеИмяФайла, , , ПараметрыJSON);
Запись.ЗаписатьНачалоОбъекта();
//записываем Номер и дата заявки
Запись.ЗаписатьИмяСвойства("ДатаЗаявки");
Запись.ЗаписатьЗначение(ЗаписатьДатуJSON(Заявка.Дата, ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата));
Запись.ЗаписатьИмяСвойства("НомерЗаявки");
Запись.ЗаписатьЗначение(Заявка.Номер);
//Записываем данные Представителя (данные сокращены до ссылки и наименования)
Запись.ЗаписатьИмяСвойства("Представитель");
ОписаниеПредставителя = Новый Структура("Ссылка,Наименование");
ОписаниеПредставителя.Ссылка = Строка(Заявка.Представитель.УникальныйИдентификатор());
ОписаниеПредставителя.Наименование = Заявка.Представитель.Наименование;
ЗаписатьJSON(Запись,ОписаниеПредставителя);
// Записываем данные Исполнителя заявки ((данные сокращены до ссылки и наименования)
Запись.ЗаписатьИмяСвойства("Исполнитель");
ОписаниеИсполнителя = Новый Структура("Ссылка,Наименование");
ОписаниеИсполнителя.Ссылка = Строка(Заявка.Исполнитель.УникальныйИдентификатор());
ОписаниеИсполнителя.Наименование = Заявка.Исполнитель.Наименование;
ЗаписатьJSON(Запись,ОписаниеИсполнителя);
// Записываем данные табличной части заявки - данные оборудования и его владельца сокращены
Запись.ЗаписатьИмяСвойства("ФизическиеЛица");
ФизическиеЛица = Новый Массив;
Для каждого СтрокаТабличнойчасти Из Заявка.Оборудования Цикл
ОписаниеЗаказа = Новый Структура("ФИОСсылка,ФИО,ДатаРождения");
ОписаниеЗаказа.ФИОСсылка = Строка(СтрокаТабличнойчасти.ФизическоеЛицо.УникальныйИдентификатор());
ОписаниеЗаказа.ФИО = Строка(СтрокаТабличнойчасти.ФизическоеЛицо);
ОписаниеЗаказа.ДатаРождения =ЗаписатьДатуJSON(СтрокаТабличнойчасти.ФизическоеЛицо.ДатаРождения, ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата);
ФизическиеЛица.Добавить(ОписаниеЗаказа);
КонецЦикла;
ЗаписатьJSON(Запись, ФизическиеЛица);
Запись.ЗаписатьКонецОбъекта();
Сообщить("Создан файл "+ ПолноеИмяФайла);
Запись.Закрыть();
КонецПроцедуры
Обратите внимание, что для записи данных типа даты я использую метод глобального контекста языка 1С ЗаписатьДатуJSON
Созданный текстовый файл выгрузки в формате JSON выгладит в следующем образом:
Загрузка этого файла выполняется на закладке Загрузка созданной для этой цели обработки (см рис 3):
Обработанные данные после чтения я записываю в табличный документ для проверки распознавания данных. Программный код чтения файла показан в следующем фрагменте:
&НаСервере
Процедура ЗагрузитьНаСервере(ИмяФайлаЗагрузки)
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл(ИмяФайлаЗагрузки);
Реквизиты = Новый Массив;
Реквизиты.Добавить("ДатаЗаявки");
Реквизиты.Добавить("ДатаРождения");
Данные = ПрочитатьJSON(Чтение, Ложь,Реквизиты,ФорматДатыJSON.ISO);
Чтение.Закрыть();
ДатаЗаявки = Данные.ДатаЗаявки;
НомерЗаявки = Данные.НомерЗаявки;
Представитель = Данные.Представитель.Наименование;
Испольнитель = Данные.Исполнитель.Наименование;
ТаблицаЗаказов.Очистить();
Для каждого Стр Из Данные.ФизическиеЛица Цикл
ЗаполнитьЗначенияСвойств(ТаблицаЗаказов.Добавить(),Стр);
КонецЦикла;
КонецПроцедуры
В этом фрагменте программного кода чтения следует обратить внимание на то, что я нигде не использую метод ПрочитатьДатуJSON для строки, прочитанной в JSON-формате, в значение типа Дата. Дело в том, что в параметрах метода ПрочитатьJSON я передаю массив реквизитов, которые нужно преобразовать в дату из формата ФорматДатыJSON.ISO :
Данные = ПрочитатьJSON(Чтение, Ложь,Реквизиты,ФорматДатыJSON.ISO);
В более сложных задачах выгрузки возможно потребуется использовать функции восстановления чтения данных, например:
Данные = ПрочитатьJSON(Чтение, Ложь,,,"ФункцияВосстановленияЧтения",ЭтотОбъект,Реквизиты);
В данном случае , преобразование даты из строки осуществляется в функции восстановления ФункцияВосстановленияЧтения
&НаКлиенте
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
Возврат ПрочитатьДатуJSON(Значение, ФорматДатыJSON.ISO );
КонецФункции
Данная функция вызывается при чтении каждого свойства и должна иметь следующие параметры:
- <Свойство> – значение типа Строка, указывается только при чтении объектов JSON,
- <Значение> – значение допустимого для сериализации типа,
- <ДополнительныеПараметры>.
Теоретический материал о работе в формате JSON можно прочитать здесь