При чтении из JSON функция восстановления может использоваться для того, чтобы преобразовать данные JSON в типы «1С:Предприятия», которые не могут являться результатом автоматического преобразования, либо чтобы просто изменить получаемые данные, если есть такая необходимость.
При использовании функции восстановления разработчик должен знать, какие данные и в каком виде находятся JSON-документе.
Например, требуется прочитать из JSON-документа, показанного в листинге 1.27, информацию о контрагенте и при этом представить телефоны контрагента в привычном формате: «999-99-99».
Листинг 1.27. Содержимое JSON-документа
{
"Контрагент": "ОАО Топаз",
"ОбъемПродаж": 5000000,
"Телефоны": [
"+71112223344",
"+79998887766"
],
"Поставщик": false
}
Для этого в метод ПрочитатьJSON() мы передаем имя функции восстановления и указываем, что она находится в том же модуле формы (ЭтотОбъект), что и процедура десериализации (листинг 1.28).
Листинг 1.28. Пример десериализации данных из JSON-документа с функцией восстановления
&НаСервере
Процедура ДесериализацияСФункциейВосстановленияНаСервере()
// Создать объект чтения и открыть файл, из которого будет выполняться чтение.
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("c:\temp\Serialisation_6.json");
// Выполнить чтение данных в структуру Данные с помощью объекта чтения (Чтение).
Данные = ПрочитатьJSON(Чтение, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект);
// Завершить работу с файлом.
Чтение.Закрыть();
// Вывести результат чтения в сообщение.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Контрагент: " + Данные.Контрагент + ", Объем продаж: " + Данные.ОбъемПродаж +
", Поставщик: "+ Данные.Поставщик + ", Телефоны: ";
Для Каждого Телефон Из Данные.Телефоны Цикл
Сообщение.Текст = Сообщение.Текст + Телефон + ", ";
КонецЦикла;
Сообщение.Сообщить();
КонецПроцедуры
Отличие от обычного чтения из JSON-документа заключается в том, что при чтении вызывается функция восстановления ФункцияВосстановленияЧтения(). Преобразованные с помощью функции восстановления данные сохраняются в структуру Данные. После этого структура данных выводится в сообщение пользователю.
В функции восстановления мы обходим массив телефонов и представляем каждый телефон в привычном виде. Результат восстановления возвращается в метод ПрочитатьJSON() (листинг 1.29).
Листинг 1.29. Функция восстановления
&НаСервере
Функция ФункцияВосстановленияЧтения(Свойство, Значение, ДополнительныеПараметры) Экспорт
Если Свойство = "Телефоны" И ТипЗнч(Значение) = Тип("Массив") Тогда
Телефоны = Новый Массив;
Для Каждого Телефон Из Значение Цикл
СтрокаТелефона = Лев(Телефон,2) + "-" + Сред(Телефон, 3, 3) + "-" + Сред(Телефон, 6, 3) + "-" +
"-" + Сред(Телефон, 9, 2) + "-" + Прав(Телефон,2);
Телефоны.Добавить(СтрокаТелефона);
КонецЦикла;
Возврат Телефоны;
КонецЕсли;
КонецФункции
Результат чтения JSON-документа, содержимое которого показано в листинге 1.27, будет выглядеть следующим образом (рис. 1.5).
Рис. 1.5. Чтение из JSON-документа с функцией восстановления
Однако необходимо учитывать, что функция восстановления будет вызвана для всех свойств, которые будут обнаружены в JSON-документе. Это не всегда удобно и, кроме того, существенно снижает производительность чтения JSON-документа, особенно если он большой.
Для того чтобы ускорить чтение JSON, можно передать в метод ПрочитатьJSON() массив имен свойств, для которых требуется вызывать функцию восстановления (листинг 1.30).
Листинг 1.30. Пример десериализации данных из JSON-документа с функцией восстановления
&НаСервере
Процедура ДесериализацияСФункциейВосстановленияНаСервере()
// Заполнить массив имен реквизитов для восстановления.
РеквизитыДляВосстановления = Новый Массив;
РеквизитыДляВосстановления.Добавить("Телефоны");
// Создать объект чтения и открыть файл, из которого будет выполняться чтение.
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("c:\temp\Serialisation_6.json");
// Выполнить чтение данных в структуру Данные с помощью объекта чтения (Чтение).
Данные = ПрочитатьJSON(Чтение, Ложь, , , "ФункцияВосстановленияЧтения", ЭтотОбъект, , РеквизитыДляВосстановления);
// Завершить работу с файлом.
Чтение.Закрыть();
// Вывести результат чтения в сообщение.
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Контрагент: " + Данные.Контрагент + ", Объем продаж: " + Данные.ОбъемПродаж +
", Поставщик: "+ Данные.Поставщик + ", Телефоны: ";
Для Каждого Телефон Из Данные.Телефоны Цикл
Сообщение.Текст = Сообщение.Текст + Телефон + ", ";
КонецЦикла;
Сообщение.Сообщить();
КонецПроцедуры
В результате чтение данных из JSON-документа будет выполнено быстрее, так как функция восстановления будет вызвана только для свойств, имена которых перечислены в массиве РеквизитыДляВосстановления.