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