Принцип такой:
Формируем файл на сервере. Имя генерируем ПолучитьИмяВременногоФайла();. Потом передаем временный файл в хранилище и удаляем его на сервере.
На клиенте получаем файл из хранилища с помощью ОписаниеПередаваемогоФайла и НачатьПолучениеФайлов
&НаКлиенте
Процедура СформироватьФайл(Команда)
АдресФайлаВоВременномХранилище = СформироватьФайлНаСервере();
Если АдресФайлаВоВременномХранилище = "" Тогда
Сообщить("Не смогли получить файл с сервера");
Возврат;
КонецЕсли;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект);
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(СокрЛП(ФайлДляВыгрузки), // куда сохранять на клиента
АдресФайлаВоВременномХранилище // адрес в хранилище на сервере
)
);
НачатьПолучениеФайлов(ОповещениеОЗавершении,ПолучаемыеФайлы,,Ложь ); // неинтерактивно
КонецПроцедуры
// обработка события после закачки
&НаКлиенте
Процедура ВыполнитьПослеПолученияФайлов(ПолученныеФайлы, ДополнительныеПараметры) Экспорт
Для Каждого Файл Из ПолученныеФайлы Цикл
Сообщить("Сформирован файл " + Файл.Имя);
КонецЦикла;
КонецПроцедуры
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
С платформы 8.3.15 не рекомендуется использовать процедуру НачатьПолучениеФайлов. Вместо её предлагают использовать НачатьПолучениеФайловССервера().
Минус нового метода в том, что оно всегда интерактивно и нельзя задать маску для сохранения файла.
Так как функция всегда интерактивна, то не заморачиваемся выводом диалога выбора имени файла. Вместо отсутствующей маски для выбора имени файла сразу пишем имя файла в ОписаниеПередаваемогоФайла:
&НаКлиенте
Процедура СформироватьФайл(Команда)
АдресФайлаВоВременномХранилище = Неопределено;
СформироватьФайлНаСервере(АдресФайлаВоВременномХранилище);
Если АдресФайлаВоВременномХранилище = "" Тогда
Сообщить("Не смогли получить файл с сервера");
Возврат;
КонецЕсли;
ПолучаемыеФайлы = Новый Массив;
ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла("Выгрузка.csv", АдресФайлаВоВременномХранилище));
НачатьПолучениеФайловССервера(ПолучаемыеФайлы);
КонецПроцедуры
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
&НаСервере
Функция СформироватьФайлНаСервере()
АдресФайла ="";
ПеренестиВХранилище = Истина;
обработка(АдресФайла, ПеренестиВХранилище);
Возврат АдресФайла;
КонецФункции
&НаСервере
Процедура обработка(АдресФайла = "", ПеренестиВХранилище = Ложь) Экспорт
Запрос = СформироватьЗапрос();
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
// получаем имя временного файла
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("csv");
//Формируем файл
Текст = Новый ЗаписьТекста;
Текст.Открыть(ИмяВременногоФайла, КодировкаТекста.OEM);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
СтрокаТекста = ВыборкаДетальныеЗаписи.ЛицевойСчет + ";" + Формат(ВыборкаДетальныеЗаписи.ДатаВыполнения,"ДФ=dd.MM.yyyy");
Текст.ЗаписатьСтроку(СтрокаТекста);
КонецЦикла;
Текст.Закрыть();
//передаем файл в хранилище
УникальныйИдентификатор = Новый УникальныйИдентификатор();
Если ПеренестиВХранилище Тогда
Двоичное=Новый ДвоичныеДанные(ИмяВременногоФайла);
АдресФайла=ПоместитьВоВременноеХранилище(Двоичное,УникальныйИдентификатор);
Попытка
//Удалем файл. Необязательно (файл сам удалиться системой), но желательно
УдалитьФайлы(ИмяВременногоФайла);
Исключение
//ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка удаления временного файла "+ ИмяФайлаОбменаНаСервер);
КонецПопытки;
КонецЕсли;
КонецПроцедуры
|