|
|
|
Сохранение присоединенных файлов | ☑ | ||
|---|---|---|---|---|
|
0
Trezvy
26.07.24
✎
10:26
|
Добрый день!
Есть задача выгрузки присоединенных файлов в к выбранным документам и сохранение реквизитов документов. Реквизиты документов сохраняю в таблице, для выгрузки файлов пробую использовать стандартные функции из РаботаСФайламиКлиент или ФайловаяСиситемаКлиент. Не совсем понятно, какую информацию о сохраняемых файлах нужно передавать с серверной процедуры в клиентскую.
&НаКлиенте
Процедура Выгрузить(Команда)
КаталогКаталогВыгрузки = "D:\Выгрузка\"
СписокДокументов = СписокДокументовДляВыгрузки();
//ФайловаяСистемаКлиент.СохранитьФайлы(Неопределено, СписокДокументов, КаталогВыгрузки);
Для Счетчик = 0 по СписокДокументов.ВГраница() Цикл
Документ = СписокДокументов[Счетчик].Ссылка;
ФайловаяСистемаКлиент.СохранитьФайл(Неопределено, Документ, КаталогВыгрузки, Неопределено);
// ДанныеФайла = ПараметрыВыполнения.ДанныеСохраняемыхФайлов.СписокДанныхФайлов[ПараметрыВыполнения.НомерФайла].Значение;
// СохранитьФайлНаДиск(ДанныеФайла, Файл.ПолноеИмя, ПараметрыВыполнения.АдресФайла, Файл, ПараметрыВыполнения.ПутьКФайлуВКеше, ПараметрыВыполнения.СохранятьСРасшифровкой);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СписокДокументовДляВыгрузки(ТабДок) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВнутренниеДокументы.Ссылка КАК Ссылка,
| ВнутренниеДокументы.Код КАК Код,
| ВнутренниеДокументы.Наименование КАК Наименование,
| ВнутренниеДокументы.ВидДокумента КАК ВидДокумента
|ИЗ
| Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы
|ГДЕ
| ВнутренниеДокументы.ВидДокумента = &ВидДокумента
| И ВнутренниеДокументы.ДатаРегистрации МЕЖДУ &ДатаС И &ДатаПо";
Запрос.УстановитьПараметр("ВидДокумента", ЭтаФорма.ВыборВидаДокумента);
Запрос.УстановитьПараметр("ДатаС", ЭтаФорма.ДатаНачала );
Запрос.УстановитьПараметр("ДатаПо", ЭтаФорма.ДатаКонца);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
МассивВыгружаемыхФайлов = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Документ = ВыборкаДетальныеЗаписи.Ссылка;
// получить список файлов документа
СписокФайлов = Новый Массив;
СписокФайлов = РаботаСФайламиСлужебный.ВсеПодчиненныеФайлы(ВыборкаДетальныеЗаписи.Ссылка);
Для Счетчик = 0 по СписокФайлов.ВГраница() Цикл
ФайлОбъект = СписокФайлов[Счетчик].Ссылка.ПолучитьОбъект();
СтруктураФайла = РаботаСФайламиСлужебный.ФайлОбъект(СписокФайлов[Счетчик]);
МассивВыгружаемыхФайлов.Добавить(СтруктураФайла);
//МассивВыгружаемыхФайлов.Добавить(ФайлОбъект);
КонецЦикла;
КонецЦикла;
Возврат(МассивВыгружаемыхФайлов);
КонецФункции
|
|||
|
1
Chameleon1980
27.07.24
✎
20:14
|
с серверной процедуры в клиентскую ?
|
|||
|
2
Мимохожий Однако
28.07.24
✎
08:09
|
(0) Что не получается?
|
|||
|
3
Chameleon1980
28.07.24
✎
09:20
|
ну перейди к функции и почитай описание или примеры посмотри в типовой.
|
|||
|
4
Trezvy
29.07.24
✎
07:09
|
(1) Мне нужно сохранить присоединенные файлы на локальном диске пользователя. А серверная процедура, как я понимаю, сохраняет файлы на сервере. Поэтому я пытаюсь, получив данные о присоединенных файлах на сервере, передать их в клиентскую процедуру.
Получаю список присоединенных файлов и формирую массив, вопрос, что передавать в массиве на клиента, чтобы успешно сохранить файл? Объект, структуру? Пока получаю ДанныеФайла функцией ДанныеДляСохранения из РаботаСФайламиСлужебныйВызовСервера. СписокФайлов = РаботаСФайламиСлужебный.ВсеПодчиненныеФайлы(ВыборкаДетальныеЗаписи.Ссылка);
//Для каждого Наименование Из СписокФайлов Цикл
Для Счетчик = 0 по СписокФайлов.ВГраница() Цикл
Если СписокФайлов[Счетчик].ПометкаУдаления = Ложь Тогда
//СписокФайлов[Счетчик].Ссылка.УстановитьПометкуУдаления(Истина);
ФайлОбъект = СписокФайлов[Счетчик].Ссылка.ПолучитьОбъект();
СтруктураФайла = РаботаСФайламиСлужебный.ФайлОбъект(СписокФайлов[Счетчик]);
// получаем данные файла
ДанныеФайла = РаботаСФайламиСлужебныйВызовСервера.ДанныеФайлаДляСохранения(СписокФайлов[Счетчик].Ссылка, Неопределено, Неопределено);
МассивВыгружаемыхФайлов.Добавить(ДанныеФайла);
//МассивВыгружаемыхФайлов.Добавить(ФайлОбъект);
КонецЕсли;
КонецЦикла;
|
|||
|
5
d4rkmesa
29.07.24
✎
08:27
|
(4) См. НачатьПолучениеФайловССервера(...)
|
|||
|
6
Trezvy
31.07.24
✎
06:11
|
(5) Работает так:
&НаКлиенте
Процедура Выгрузить(Команда)
СписокДокументов = СписокДокументовДляВыгрузки(ТабДок);
Для Счетчик = 0 по СписокДокументов.ВГраница() Цикл
Адрес = СписокДокументов[Счетчик];
НачатьПолучениеФайлаССервера(Неопределено, Адрес, КаталогВыгрузки + <<имя_файла>>);
КонецЦикла;
КонецПроцедуры
&НаСервере
Функция СписокДокументовДляВыгрузки() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ... ";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
МассивВыгружаемыхФайлов = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СписокФайлов = Новый Массив;
СписокФайлов = РаботаСФайламиСлужебный.ВсеПодчиненныеФайлы(ВыборкаДетальныеЗаписи.Ссылка);
Для Счетчик = 0 по СписокФайлов.ВГраница() Цикл
Если СписокФайлов[Счетчик].ПометкаУдаления = Ложь Тогда
ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СписокФайлов[Счетчик]);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
МассивВыгружаемыхФайлов.Добавить(Адрес);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат(МассивВыгружаемыхФайлов);
КонецЕсли;
КонецФункции
Осталось настроить передачу на клиента еще имени файла. |
|||
|
7
Мультук
31.07.24
✎
07:50
|
(6)
Интересно, а можно ли вместо МассивВыгружаемыхФайлов.Добавить(Адрес); делать так МассивВыгружаемыхФайлов.Добавить(Новый Структура("Адрес, ИмяФайла", Адрес, ИмяФайла)); |
|||
|
8
Trezvy
31.07.24
✎
09:59
|
Получилось такое решение:
&НаКлиенте
Процедура Выгрузить(Команда)
СписокДокументов = СписокДокументовДляВыгрузки();
НачатьПолучениеФайловССервера(Неопределено, СписокДокументов, КаталогВыгрузки);
КонецПроцедуры
&НаСервере
Функция СписокДокументовДляВыгрузки() Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
...";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
МассивВыгружаемыхФайлов = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СписокФайлов = Новый Массив;
СписокФайлов = РаботаСФайламиСлужебный.ВсеПодчиненныеФайлы(ВыборкаДетальныеЗаписи.Ссылка);
Для Счетчик = 0 по СписокФайлов.ВГраница() Цикл
Если СписокФайлов[Счетчик].ПометкаУдаления = Ложь Тогда
ДвоичныеДанные = РаботаСФайлами.ДвоичныеДанныеФайла(СписокФайлов[Счетчик]);
Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
ИмяСРасширением = ВыборкаДетальныеЗаписи.Код + "\" + СписокФайлов[Счетчик].ПолноеНаименование + "." + СписокФайлов[Счетчик].ТекущаяВерсияРасширение;
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(ИмяСРасширением, Адрес);
МассивВыгружаемыхФайлов.Добавить(ОписаниеПередаваемогоФайла);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат(МассивВыгружаемыхФайлов);
КонецФункции |
|||
|
9
Trezvy
31.07.24
✎
10:04
|
(7) Да, получается, что оптимальнее использовать
НачатьПолучениеФайловССерверавместо НачатьПолучениеФайлаССервераТам есть ОписаниеПередаваемогоФайлакуда можно засунуть имя файла с подкаталогом (в качестве подкаталога использую код документа). |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |