Предположим, у нас есть сформированный ранее JSON-файл (листинг 6.18) и нам нужно прочитать из него информацию, изменить ее и записать в новый файл. Хотя сделать все это можно и на клиенте, более правильно – передать файл на сервер (поместить его на сервере во временное хранилище), обработать там содержимое файла, вернуть адрес измененных данных на клиент и затем по этому адресу получить файл.
Листинг 6.18. Исходный JSON-файл
{
"Контрагент": "ОАО Топаз",
"ОбъемПродаж": 5000000,
"Адрес": "Страна: Россия, Индекс: 112233, Город: Москва",
"Поставщик": false
}
Например, в показанном выше файле с информацией о контрагенте нам нужно заменить вывод значений true/false поля Поставщик (типа Булево) на более привычные Да/Нет.
Для решения этой задачи добавим команду ОбработатьФайлНаСервере. Обработчик команды заполним следующим образом (листинг 6.19).
Листинг 6.19. Обработчик команды «ОбработатьФайлНаСервере»
&НаКлиенте
Процедура ОбработатьФайлНаСервере(Команда)
ОповещениеОЗавершении = Новый ОписаниеОповещения("ОбработатьФайлНаСервереЗавершение", ЭтотОбъект);
НачатьПомещениеФайлаНаСервер(ОповещениеОЗавершении, , , "", , УникальныйИдентификатор);
//НачатьПомещениеФайлаНаСервер(ОповещениеОЗавершении, , , "", "c:\temp\example.json", УникальныйИдентификатор);
КонецПроцедуры
В этом обработчике с помощью метода глобального контекста НачатьПомещениеФайлаНаСервер() мы начинаем помещение файла с данными из локальной файловой системы во временное хранилище.
При этом пользователю предлагается диалог для выбора помещаемого файла. Параметры этого диалога мы можем описать и передать в пятом параметре метода. Но это будет сделано в следующем примере. В данном случае мы опускаем этот параметр, но диалог все равно будет показан.
Можно также использовать вариант вызова этого метода с указанием в пятом параметре имени помещаемого файла (см. закомментированный фрагмент кода), но следует иметь в виду, что для работы этого метода в веб-клиенте потребуется установить расширение для работы с файлами. В то время как в первом случае это расширение не требуется.
В метод НачатьПомещениеФайлаНаСервер() первым параметром мы передаем описание оповещения, указывающее на экспортную процедуру ОбработатьФайлНаСервереЗавершение(), которая будет выполнена, после того как файл с данными будет помещен во временное хранилище (листинг 6.20).
Листинг 6.20. Процедура «ОбработатьФайлНаСервереЗавершение()»
&НаКлиенте
Процедура ОбработатьФайлНаСервереЗавершение(ОписаниеПомещенногоФайла, Дополнительно) Экспорт
ПомещенныйФайл = ОписаниеПомещенногоФайла.СсылкаНаФайл.Файл;
ПолучаемыйФайл = ПомещенныйФайл.Путь + ПомещенныйФайл.ИмяБезРасширения + "_2" + ПомещенныйФайл.Расширение;
АдресДокументаВХранилище = ОбработкаФайла(ОписаниеПомещенногоФайла.Адрес);
//НачатьПолучениеФайлаССервера(АдресДокументаВХранилище);
НачатьПолучениеФайлаССервера(, АдресДокументаВХранилище, ПолучаемыйФайл);
КонецПроцедуры
После того как файл будет помещен, в параметре ОписаниеПомещенногоФайла будет содержаться описание помещенного файла (адрес данных в хранилище и ссылка на файл). Адрес помещенного файла (ОписаниеПомещенногоФайла.Адрес) мы передаем в серверную функцию ОбработкаФайла(), в которой данные по этому адресу получаются из временного хранилища, записываются во временный файл и производится чтение файла (листинг 6.21).
Листинг 6.21. Функция «ОбработкаФайла()»
&НаСервереБезКонтекста
Функция ОбработкаФайла(АдресДокументаВХранилище)
ДанныеДокумента = ПолучитьИзВременногоХранилища(АдресДокументаВХранилище);
ИмяФайла = КаталогВременныхФайлов() + "temp.xml";
ДанныеДокумента.Записать(ИмяФайла);
Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл(ИмяФайла);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
Запись.ЗаписатьНачалоОбъекта();
Пока Чтение.Прочитать() Цикл
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.ИмяСвойства Тогда
Если Чтение.ТекущееЗначение = "Поставщик" Тогда
Чтение.Прочитать();
Запись.ЗаписатьИмяСвойства("Поставщик");
Запись.ЗаписатьЗначение(Строка(Чтение.ТекущееЗначение));
Иначе
Запись.ЗаписатьИмяСвойства(Чтение.ТекущееЗначение);
КонецЕсли;
КонецЕсли;
Если Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Число Или
Чтение.ТипТекущегоЗначения = ТипЗначенияJSON.Строка Тогда
Запись.ЗаписатьЗначение(Чтение.ТекущееЗначение);
КонецЕсли;
КонецЦикла;
Чтение.Закрыть();
Запись.ЗаписатьКонецОбъекта();
СтрокаJSON = Запись.Закрыть();
Возврат ПоместитьВоВременноеХранилище(СтрокаJSON);
КонецФункции
В данной функции в режиме потокового чтения и записи производятся чтение, изменение и запись данных в формате JSON. Этот вопрос подробно рассматривался в разделе «» и здесь приведен просто в качестве примера.
Отметим лишь, что для поля Поставщик типа Булево мы записываем строковое представление значения, в результате значения true/false будут заменены на Да/Нет.
В заключение в функции ОбработкаФайла() измененные данные записываются в строку JSON, которая помещается во временное хранилище, и адрес этих данных в хранилище возвращается в процедуру ОбработатьФайлНаСервереЗавершение(), приведенную выше (см. листинг 6.20).
Затем в этой процедуре с помощью метода глобального контекста НачатьПолучениеФайлаССервера() мы начинаем получение файла по адресу во временном хранилище и сохраняем файл в локальную файловую систему пользователя. При этом мы явно указываем имя получаемого файла.
Отметим, что для работы этого варианта метода (с указанием имени получаемого файла) в веб-клиенте требуется установить расширение работы с файлами.
Для формирования имени получаемого файла мы на основе описания помещенного файла (ОписаниеПомещенногоФайла.СсылкаНаФайл.Файл) создаем объект Файл. Используя свойства этого объекта: Путь, ИмяБезРасширения и Расширение, мы формируем имя сохраняемого файла с постфиксом «_2».