Как-то раз меня попросили сделать обработку выгрузки в эксель и тут возникли проблемы то с сохранением файла на сервере, то с заполнением данными на клиенте. В итоге я решил заполнить файл на сервере как обычный табличный документ, а записать его на клиенте.
Сначала создаем обработку с реквизитом ПапкаСохранения, тип строка
Создаем форму отчета и переносим реквизит на форму:
Затем в процедуру НачалоВыбора этого реквизита впишем код:
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьККаталогу = ДиалогОткрытия.Каталог;
КонецЕсли;
Если Прав(Элемент.ТекстРедактирования,1) <> "" Тогда
Отчет.ПапкаСохранения = ПутьККаталогу+"";
Иначе
Отчет.ПапкаСохранения = ПутьККаталогу;
КонецЕсли;
Создаем команду для запуска нашей обработки и переносим ее на форму:
Добавляем в модуль формы две процедуры:
&НаКлиенте
Процедура КнопкаСформировать(Команда)
//Для уникальности имени файла добавим к его имени дату и время создания
ДатаВремя = СтрЗаменить(ТекущаяДата(),":",".");
ИмяФайла = "Выгрузка_"+ДатаВремя;
//Добавим выбранный каталог к к именя файла
ПолноеИмяФайла = Отчет.ПапкаСохранения+ИмяФайла+".xls";
//Создадим табличный документ
ТабДок = Новый ТабличныйДокумент;
//Создадим файл эксель: Запишем нашу вновь созданную таблицу в файл
ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);
//Заполним таблицу на сервере
КнопкаСформироватьНаСервере(ТабДок);
//Запишем заполненную таблицу в этот же файл
ТабДок.Записать(ПолноеИмяФайла,ТипФайлаТабличногоДокумента.XLS);
КонецПроцедуры
&НаСервере
Процедура КнопкаСформироватьНаСервере(ТабДок)
//Прочитаем наш отчет на сервере, чтобы стали доступны процедуры из модуля объект этого отчета
Документ = РеквизитФормыВЗначение("Отчет");
//Вызовем нашу процедуру заполнения
Документ.ЗаполнитьТаблицуНаСервере(ТабДок);
КонецПроцедуры
Далее создаем макет и заполняем его данными в экспортной процедуре из модуля объекта:
Процедура ЗаполнитьТаблицуНаСервере(ТабДок) Экспорт
Макет = ПолучитьМакет("МакетВыгрузки");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ТабДок.Вывести(ОбластьЗаголовок);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Наименование,
| Контрагенты.НаименованиеПолное
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
КонецПроцедуры
В итоге у нас получается такая вот обработка:
Здравствуйте. Подскажите пожалуйста, где именно прописать Процедуру ЗаполнитьТаблицуНаСервере(ТабДок) Экспорт
Я скачал файл, открыл, и не могу понять где описывается это экспортная функция,
Тоесть, где писать код:
Показать
Код нужно писать в модуле объекта. В данном случае в модуле нашей обработки.
Все это избыточно. Достаточно:
где табличный документ полностью формируется на сервере и отдается на клиент, а не формируется на клиенте, записывается, передается на сервер и возвращается.Что за ересь.
Добрый день!
Заценил неперадаваемое «ФормаСформировать» и «КнопкаСформировать», еще «Сформировать».
Не смог повторить такое на внешнем отчете, что сделал не так, не пойму?
Скачай обработку, да посмотри
Добрый день! файл у меня создался, но почемуто пустой . не подскажете в чем дело? Спасибо.
(6)Вопрос снят .
(7) Здравствуйте. Подскажите в чем была проблема? тоже создается пустой файл
(8) Добрый день! Я заплутала в наименованиях отчета , и реквизитов .
все должно быть как в прикрепленном файле.
(9) Извините за долгий ответ. Я был в круизе) В моем примере файлик записывается 2 раза: сначала пустой, потом заполненный. Если файл у вас записывается пустой, то либо он не заполняется данными либо второй раз попросту не записывается.