Приветствую Вас ГостьПятница, 29.03.2024, 12:26

Каталог статей


Сформировать файл на сервере и передать на клиент

Принцип такой:

Формируем файл на сервере. Имя генерируем  ПолучитьИмяВременногоФайла();. Потом передаем временный файл в хранилище и удаляем его на сервере.

На клиенте получаем файл из хранилища  с помощью ОписаниеПередаваемогоФайла и НачатьПолучениеФайлов

&НаКлиенте
Процедура СформироватьФайл(Команда)
    
    АдресФайлаВоВременномХранилище = СформироватьФайлНаСервере();
    Если АдресФайлаВоВременномХранилище = "" Тогда
        Сообщить("Не смогли получить файл с сервера");
        Возврат;
    КонецЕсли;
    
    ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект);
    ПолучаемыеФайлы = Новый Массив;
    ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла(СокрЛП(ФайлДляВыгрузки), // куда сохранять на клиента
                            АдресФайлаВоВременномХранилище // адрес в хранилище на сервере
                                )
                            );
    НачатьПолучениеФайлов(ОповещениеОЗавершении,ПолучаемыеФайлы,,Ложь );  // неинтерактивно

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

// обработка события после закачки

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

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

С платформы 8.3.15 не рекомендуется использовать  процедуру НачатьПолучениеФайлов. Вместо её предлагают использовать НачатьПолучениеФайловССервера().

Минус нового метода в том, что оно всегда интерактивно и нельзя задать маску для сохранения файла.

Так как функция всегда интерактивна, то не заморачиваемся выводом диалога выбора имени файла. Вместо отсутствующей маски для выбора имени файла сразу пишем имя файла в ОписаниеПередаваемогоФайла:

&НаКлиенте
Процедура СформироватьФайл(Команда)
 
    АдресФайлаВоВременномХранилище = Неопределено;
    СформироватьФайлНаСервере(АдресФайлаВоВременномХранилище);
    Если АдресФайлаВоВременномХранилище = "" Тогда
        Сообщить("Не смогли получить файл с сервера");
        Возврат;
    КонецЕсли;
    
    ПолучаемыеФайлы = Новый Массив;
    ПолучаемыеФайлы.Добавить(Новый ОписаниеПередаваемогоФайла("Выгрузка.csv", АдресФайлаВоВременномХранилище));
    НачатьПолучениеФайловССервера(ПолучаемыеФайлы);

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

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

&НаСервере
Функция СформироватьФайлНаСервере()
    АдресФайла ="";
    ПеренестиВХранилище = Истина;
    обработка(АдресФайла, ПеренестиВХранилище);
    Возврат АдресФайла;
КонецФункции

&НаСервере

Процедура обработка(АдресФайла = "", ПеренестиВХранилище = Ложь) Экспорт
    
    Запрос = СформироватьЗапрос();        
    РезультатЗапроса = Запрос.Выполнить();    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();    

   // получаем имя временного файла
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("csv");    

    //Формируем файл

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

            //Удалем файл. Необязательно (файл сам удалиться системой), но желательно
            УдалитьФайлы(ИмяВременногоФайла);
        Исключение
            //ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка удаления временного файла  "+ ИмяФайлаОбменаНаСервер);
        КонецПопытки;
    КонецЕсли;
    
КонецПроцедуры

Категория: Формы | Добавил: leshic (10.07.2019)
Просмотров: 1010 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [40]
Администрирование [34]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [27]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0