Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Передача файлов между клиентом и сервером
Дальше: Передача нескольких файлов на сервер

Передача и получение одного файла с сервера

Предположим, у нас есть сформированный ранее 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».

Назад: Передача файлов между клиентом и сервером
Дальше: Передача нескольких файлов на сервер