Для упрощения работы с JSON можно совмещать различные техники при формировании одного документа. Например, необходимо сформировать документ, который содержит некоторый набор структур и массив. В этом случае можно все оформление документа выполнять с помощью потоковой техники, а уже готовые структуры и массив записывать с помощью объектной техники.
Например, нам нужно записать в JSON-документ список оплат поставщикам за поступившие товары. Этот список должен содержать дату формирования и набор оплат (соответствующий некоторому критерию).
Каждая оплата поставщику характеризуется следующими параметрами:
Процедура, которая формирует JSON-документ, может иметь следующий вид (листинг 1.54).
Листинг 1.54. Пример сериализации в JSON-документ с применением смешанной техники
&НаСервереБезКонтекста
Процедура СовмещениеТехникНаСервере()
СписокОплат = Документы.ОплатаПоставщикам.Выбрать();
// Создать настройки сериализации для записи дат.
НастройкиСериализации = Новый НастройкиСериализацииJSON;
НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.УниверсальнаяДата;
НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
НастройкиСериализации.СериализовыватьМассивыКакОбъекты = Истина;
// Задать параметры записи JSON.
ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто, " ", Истина);
// Создать объект записи и открыть файл, в который будет выполняться запись.
Запись = Новый ЗаписьJSON;
Запись.ПроверятьСтруктуру = Истина;
Запись.ОткрытьФайл("c:\temp\combinedWrite.json", , , ПараметрыJSON);
// Выполнить запись значений с помощью объекта записи (Запись).
// Записать начало корневого объекта.
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("ДатаФормирования");
Запись.ЗаписатьЗначение(ЗаписатьДатуJSON(ТекущаяДата(), ФорматДатыJSON.ISO, ВариантЗаписиДатыJSON.УниверсальнаяДата));
Запись.ЗаписатьИмяСвойства("Оплаты");
// Создать массив структур с данными документа ОплатаПоставщикам.
Оплаты = Новый Массив;
Пока СписокОплат.Следующий() Цикл
ОплатаПоставщику = Новый Структура("Ссылка, Номер, Дата, Поставщик, Сумма");
ОплатаПоставщику.Ссылка = Строка(СписокОплат.Ссылка);
ОплатаПоставщику.Номер = СписокОплат.Номер;
ОплатаПоставщику.Дата = СписокОплат.Дата;
ОплатаПоставщику.Поставщик = Строка(СписокОплат.Поставщик);
ОплатаПоставщику.Сумма = СписокОплат.Сумма;
Оплаты.Добавить(ОплатаПоставщику);
КонецЦикла;
// Выполнить запись данных (Оплаты) с помощью объекта записи (Запись).
ЗаписатьJSON(Запись, Оплаты, НастройкиСериализации);
// Записать конец корневого объекта.
Запись.ЗаписатьКонецОбъекта();
// Завершить работу с файлом.
Запись.Закрыть();
КонецПроцедуры
В процедуре сначала создается объект Запись, который открывает файл для низкоуровневой записи. Затем с помощью потоковой техники в файл записывается дата формирования списка оплат как универсальная дата в формате ISO.
После этого создается массив Оплаты. Выборка документов ОплатаПоставщикам обходится в цикле, и на каждом шаге цикла структура ОплатаПоставщику, заполненная данными этой выборки, добавляется в массив Оплаты.
Затем с помощью объектной техники методом ЗаписатьJSON() массив Оплаты записывается в JSON-документ.
В результате сформированный JSON-документ будет иметь следующий вид (листинг 1.55).
Листинг 1.55. Содержимое JSON-документа
{
"ДатаФормирования": "2019-03-22T15:06:10Z",
"Оплаты": {
"0": {
"Ссылка": "Оплата поставщикам 000000003 от 05.03.2019 12:00:00",
"Номер": "000000003",
"Дата": "2019-03-05T09:00:00Z",
"Поставщик": "ООО \"Топаз\"",
"Сумма": 500500
},
"1": {
"Ссылка": "Оплата поставщикам 000000001 от 13.03.2019 12:00:00",
"Номер": "000000001",
"Дата": "2019-03-13T09:00:00Z",
"Поставщик": "ООО \"Стиль\"",
"Сумма": 300300
},
"2": {
"Ссылка": "Оплата поставщикам 000000002 от 20.03.2019 12:00:00",
"Номер": "000000002",
"Дата": "2019-03-20T09:00:00Z",
"Поставщик": "ОАО \"Фонтан\"",
"Сумма": 700700
}
}
}