Перемещение файлов с Сервера на Клиент
Иногда так случается, что код, выполняемый на сервере, выгружает файлы во временную папку сервера, а они нужны на клиенте. А всё из-за разделения выполнения кода на два контекста: на сервере и на клиенте. Что бы побороть эту проблему, в арсенале платформы 1С имеются две функции: ПолучитьФайл и ПолучитьФайлы. Эти функции получают набор файлов и сохраняют их в локальную файловую систему пользователя. Более подробнее описание смотри в синтакс-помощнике.
Допустим, имеется обработка с макетами, которые хранят файлы в виде двоичных данных. Необходимо сохранить эти файлы во временную папку локального компьютера. Всё бы хорошо, только доступ к макетам доступен в контексте сервера. Приступим к реализации задачи.
Сперва, на сервере получаем двоичные данные файлов и помещаем их во временное хранилище, адреса файлов во временном хранилище записываем в массив:
Что такое РеквизитФормыВЗначение и с чем его едят читать здесь.
Далее все действия по получению файлов выполняем на клиенте, следующий код довольно самодокументируемый, поэтому описывать его принцип работы не буду:
В учебных целях удаление фалов не писал, но об этом не стоит забывать!
Допустим, имеется обработка с макетами, которые хранят файлы в виде двоичных данных. Необходимо сохранить эти файлы во временную папку локального компьютера. Всё бы хорошо, только доступ к макетам доступен в контексте сервера. Приступим к реализации задачи.
Сперва, на сервере получаем двоичные данные файлов и помещаем их во временное хранилище, адреса файлов во временном хранилище записываем в массив:
// Функция помещает двоичные данные файлов во временное хранилище.
//
// Возвращаемое значение:
// Массив - массив с двоичными данными файлов.
//
&НаСервере
Функция ПолучитьФайлыИзМакетов()
АдресаВоВременномХранилище = Новый Массив;
ОбрОбъект = РеквизитФормыВЗначение("Объект");
ДД_Макет1 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет1, ЭтаФорма.УникальныйИдентификатор));
ДД_Макет2 = ОбрОбъект.ПолучитьМакет("Макет1");
АдресаВоВременномХранилище.Добавить(ПоместитьВоВременноеХранилище(ДД_Макет2, ЭтаФорма.УникальныйИдентификатор));
Возврат АдресаВоВременномХранилище;
КонецФункции // ПолучитьФайлыИзМакетов()
Что такое РеквизитФормыВЗначение и с чем его едят читать здесь.
Далее все действия по получению файлов выполняем на клиенте, следующий код довольно самодокументируемый, поэтому описывать его принцип работы не буду:
&НаКлиенте
Процедура ОткрытьФайлы(Команда)
ФайлыМакетов = ПолучитьФайлыИзМакетов();
// Создаем описание получаемых файлов.
ОписанияФайлов = Новый Массив;
Для Каждого ФайлМакета Из ФайлыМакетов Цикл
ОписаниеФайла = Новый ОписаниеПередаваемогоФайла(ПолучитьИмяВременногоФайла(), ФайлМакета);
ОписанияФайлов.Добавить(ОписаниеФайла);
КонецЦикла;
// Сохраняем файлы из временного хранилища в локальную файловую систему.
ПолученныеФайлы = Новый Массив;
ПолучитьФайлы(ОписанияФайлов, ПолученныеФайлы, , Ложь);
// Открываем файлы.
Для Каждого ПолученныйФайлы Из ПолученныеФайлы Цикл
ЗапуститьПриложение(ПолученныйФайлы.Имя);
КонецЦикла;
КонецПроцедуры
В учебных целях удаление фалов не писал, но об этом не стоит забывать!
Добрый день, имена файлов определяются на сервере, как можно передать имена с сервера и сохранить файлы с этими именами на клиенте?
ОтветитьУдалитьДобрый! Как вариант, возвращайте с сервера массив, элементы которого будут структуры. В структуру помещайте адрес временного хранилища и имя файла (см. функцию ПолучитьФайлыИзМакетов):
УдалитьНовый Структура("Адрес, Имя", АдресВременногоХранилища, "Имя");