Поиск по блогу

четверг, 26 февраля 2015 г.

Перемещение файлов с Сервера на Клиент

Иногда так случается, что код, выполняемый на сервере, выгружает файлы во временную папку сервера, а они нужны на клиенте. А всё из-за разделения выполнения кода на два контекста: на сервере и на клиенте. Что бы побороть эту проблему, в арсенале платформы 1С имеются две функции: ПолучитьФайл и ПолучитьФайлы. Эти функции получают набор файлов и сохраняют их в локальную файловую систему пользователя. Более подробнее описание смотри в синтакс-помощнике.

Допустим, имеется обработка с макетами, которые хранят файлы в виде двоичных данных. Необходимо сохранить эти файлы во временную папку локального компьютера. Всё бы хорошо, только доступ к макетам доступен в контексте сервера. Приступим к реализации задачи.

Сперва, на сервере получаем двоичные данные файлов и помещаем их во временное хранилище, адреса файлов во временном хранилище записываем в массив:
// Функция помещает двоичные данные файлов во временное хранилище.
//
// Возвращаемое значение:
//   Массив   - массив с двоичными данными файлов.
//
&НаСервере
Функция ПолучитьФайлыИзМакетов()

АдресаВоВременномХранилище = Новый Массив;

ОбрОбъект = РеквизитФормыВЗначение("Объект");
ДД_Макет1 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет1, ЭтаФорма.УникальныйИдентификатор));
ДД_Макет2 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет2, ЭтаФорма.УникальныйИдентификатор));

Возврат АдресаВоВременномХранилище;

КонецФункции // ПолучитьФайлыИзМакетов()


Что такое РеквизитФормыВЗначение и с чем его едят читать здесь.

Далее все действия по получению файлов выполняем на клиенте, следующий код довольно самодокументируемый, поэтому описывать его принцип работы не буду:
&НаКлиенте
Процедура ОткрытьФайлы(Команда)

ФайлыМакетов = ПолучитьФайлыИзМакетов();

// Создаем описание получаемых файлов.
ОписанияФайлов = Новый Массив;
Для Каждого ФайлМакета Из ФайлыМакетов Цикл
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолучитьИмяВременногоФайла(), ФайлМакета);
ОписанияФайлов.Добавить(ОписаниеФайла);
КонецЦикла;

// Сохраняем файлы из временного хранилища в локальную файловую систему.
ПолученныеФайлы = Новый Массив;
ПолучитьФайлы(ОписанияФайлов, ПолученныеФайлы, , Ложь);

// Открываем файлы.
Для Каждого ПолученныйФайлы Из ПолученныеФайлы Цикл
ЗапуститьПриложение(ПолученныйФайлы.Имя);
КонецЦикла;

КонецПроцедуры


В учебных целях удаление фалов не писал, но об этом не стоит забывать!

2 комментария:

  1. Добрый день, имена файлов определяются на сервере, как можно передать имена с сервера и сохранить файлы с этими именами на клиенте?

    ОтветитьУдалить
    Ответы
    1. Добрый! Как вариант, возвращайте с сервера массив, элементы которого будут структуры. В структуру помещайте адрес временного хранилища и имя файла (см. функцию ПолучитьФайлыИзМакетов):
      Новый Структура("Адрес, Имя", АдресВременногоХранилища, "Имя");

      Удалить