Выгрузка в Эксель, управляемые формы



Как-то раз меня попросили сделать обработку выгрузки в эксель и тут возникли проблемы то с сохранением файла на сервере, то с заполнением данными на клиенте. В итоге я решил заполнить файл на сервере как обычный табличный документ, а записать его на клиенте. 

Сначала создаем обработку с реквизитом ПапкаСохранения, тип строка

Создаем форму отчета и переносим реквизит на форму:

Создание формы

Затем в процедуру НачалоВыбора этого реквизита впишем код:

 Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог";

Если ДиалогОткрытия.Выбрать() Тогда
ПутьККаталогу = ДиалогОткрытия.Каталог;
КонецЕсли;
Если Прав(Элемент.ТекстРедактирования,1) <> "" Тогда
Отчет.ПапкаСохранения = ПутьККаталогу+"";
Иначе
Отчет.ПапкаСохранения = ПутьККаталогу;
КонецЕсли;

Создаем команду для запуска нашей обработки и переносим ее на форму:

команда

Добавляем в модуль формы две процедуры:

&НаКлиенте
Процедура КнопкаСформировать(Команда)

//Для уникальности имени файла добавим к его имени дату и время создания
ДатаВремя = СтрЗаменить(ТекущаяДата(),":",".");
ИмяФайла = "Выгрузка_"+ДатаВремя;
//Добавим выбранный каталог к к именя файла
ПолноеИмяФайла = Отчет.ПапкаСохранения+ИмяФайла+".xls";

//Создадим табличный документ
ТабДок = Новый ТабличныйДокумент;

//Создадим файл эксель: Запишем нашу вновь созданную таблицу в файл
ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);

//Заполним таблицу на сервере
КнопкаСформироватьНаСервере(ТабДок);

//Запишем заполненную таблицу в этот же файл
ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);


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

&НаСервере
Процедура КнопкаСформироватьНаСервере(ТабДок)
//Прочитаем наш отчет на сервере, чтобы стали доступны процедуры из модуля объект этого отчета
Документ = РеквизитФормыВЗначение("Отчет");
//Вызовем нашу процедуру заполнения
Документ.ЗаполнитьТаблицуНаСервере(ТабДок);

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

Далее создаем макет и заполняем его данными в экспортной процедуре из модуля объекта:


Процедура ЗаполнитьТаблицуНаСервере(ТабДок) Экспорт
Макет = ПолучитьМакет("МакетВыгрузки");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");

ТабДок.Вывести(ОбластьЗаголовок);

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Наименование,
| Контрагенты.НаименованиеПолное
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;


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

В итоге у нас получается такая вот обработка:

обработка

10 Comments

  1. user858649

    Здравствуйте. Подскажите пожалуйста, где именно прописать Процедуру ЗаполнитьТаблицуНаСервере(ТабДок) Экспорт

    Я скачал файл, открыл, и не могу понять где описывается это экспортная функция,

    Тоесть, где писать код:

    Процедура ЗаполнитьТаблицуНаСервере(ТабДок) Экспорт
    Макет = ПолучитьМакет(«МакетВыгрузки»);
    ОбластьЗаголовок = Макет.ПолучитьОбласть(«Заголовок»);
    ОбластьСтрока = Макет.ПолучитьОбласть(«Строка»);
    
    ТабДок.Вывести(ОбластьЗаголовок);
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Контрагенты.Наименование,
    | Контрагенты.НаименованиеПолное
    |ИЗ
    | Справочник.Контрагенты КАК Контрагенты»;
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    ОбластьСтрока.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
    ТабДок.Вывести(ОбластьСтрока);
    КонецЦикла;
    
    
    КонецПроцедуры

    Показать

    Reply
  2. virtmon

    Код нужно писать в модуле объекта. В данном случае в модуле нашей обработки.

    Reply
  3. Istur
    ТабДок = Новый ТабличныйДокумент;
    ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);
    КнопкаСформироватьНаСервере(ТабДок);
    ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);

    Все это избыточно. Достаточно:

    ТабДок = КнопкаСформироватьНаСервере();
    ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);

    где табличный документ полностью формируется на сервере и отдается на клиент, а не формируется на клиенте, записывается, передается на сервер и возвращается.Что за ересь.

    Reply
  4. Evgeny12

    Добрый день!

    Заценил неперадаваемое «ФормаСформировать» и «КнопкаСформировать», еще «Сформировать».

    Не смог повторить такое на внешнем отчете, что сделал не так, не пойму?

    Reply
  5. virtmon

    Скачай обработку, да посмотри

    Reply
  6. int_vera4ka

    Добрый день! файл у меня создался, но почемуто пустой . не подскажете в чем дело? Спасибо.

    Reply
  7. int_vera4ka

    (6)Вопрос снят .

    Reply
  8. user615675_lllveritaslll

    (7) Здравствуйте. Подскажите в чем была проблема? тоже создается пустой файл

    Reply
  9. int_vera4ka

    (8) Добрый день! Я заплутала в наименованиях отчета , и реквизитов .

    все должно быть как в прикрепленном файле.

    Reply
  10. virtmon

    (9) Извините за долгий ответ. Я был в круизе) В моем примере файлик записывается 2 раза: сначала пустой, потом заполненный. Если файл у вас записывается пустой, то либо он не заполняется данными либо второй раз попросту не записывается.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *