Выгрузка в несколько листов/файлов Excel в УФ

Понадобилось выгрузить несколько отчетов в несколько листов Excel. Написал универсальную функцию, которая позволяет это сделать. Также есть вариант, который сохраняет отчеты в несколько файлов Excel.

 

Обработка, демонстрирующая функционал, выдает отчет по остаткам и продажам в УТ11 и сохраняет отчеты по отдельным видам номенклатуры в отдельные листы/файлы.

 

Обработка имеет вид:

 

После выгрузки выдается предупреждение:

 

Если не установлена галочка «Выгружать в Excel», то данные будут выгружаться в отчет:

 

Если выбран переключатель «В отдельные файлы», то выгрузка произойдет в отдельные файлы:

 

 

Если выбран переключатель «В отдельные листы», то выгрузка произойдет в отдельные листы одного файла:

 

 

Код по выгрузке в файлы имеет вид (СписокОтчетов – массив табличных документов):

&НаКлиенте
Процедура СохранитьОтчетыВФайлExcelСЛистами(СписокОтчетов, ИмяФайла) Экспорт
   
Эксель    = New COMObject("Excel.Application");

   
Первый = истина;

   
//Для защиты от дублей имен
   
СооИмена = Новый СписокЗначений();

   
//Перебираем отчеты в MXL
   
Для Каждого Элемент ИЗ СписокОтчетов Цикл
       
ТабДок = Элемент.Значение;
       
//ТабДок.Показать();
       
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("XLS");
       
ТабДок.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLS); //Сохраняем в временный файл

       
ТекКнига = Эксель.Workbooks.Open(ИмяВременногоФайла);
        Если
Первый Тогда
           
Книга = ТекКнига; //Первый файл и есть результат, чтобы сохранялись цвета
       
Иначе
           
ТекКнига.Sheets(1).Copy(, Книга.Sheets(Книга.Sheets.Count)); //Copy(Before, After)
       
КонецЕсли;


       
//Защита от одинаковых ярлыков
       
ТекБазаНаименование = Элемент.Представление;
       
ТекНаименование = ТекБазаНаименование; СчНаименований = 2;
        Пока
СооИмена.НайтиПоЗначению(ТекНаименование) <> Неопределено Цикл
           
ТекНаименование = ТекБазаНаименование + "(" + СчНаименований + ")";
           
СчНаименований = СчНаименований + 1;
        КонецЦикла;
       
СооИмена.Добавить(ТекНаименование);
       
Книга.Sheets(Книга.Sheets.Count).Name = ТекНаименование; //Переименовываем

       
Если Первый Тогда
           
//Делаем доступными ярлыки листов
           
Эксель.ActiveWindow.DisplayWorkbookTabs = 1;
           
Эксель.ActiveWindow.TabRatio = 0.6;
           
Первый = ложь;
        Иначе
           
ТекКнига.Close();
        КонецЕсли;

    КонецЦикла;

   
//Удаляем, чтобы не переспрашивал
   
Файл = Новый Файл(ИмяФайла);
    Если
Файл.Существует() Тогда
       
УдалитьФайлы(ИмяФайла);
    КонецЕсли;

   
Книга.SaveAs(ИмяФайла, -4143); //xlWorkbookNormal -4143 Workbook normal

   
Книга.Close();

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

&НаКлиенте
Процедура СохранитьОтчетыВФайлыExcel(СписокОтчетов, ИмяФайла) Экспорт
   
Ф = Новый Файл(ИмяФайла);


   
//Перебираем отчеты в MXL
   
Для Каждого КЗ ИЗ СписокОтчетов Цикл
       
ИмяТекущегоФайла = Ф.Путь + "\" + Ф.ИмяБезРасширения + "_" + КЗ.Представление + ".XLS";
       
КЗ.Значение.Записать(ИмяТекущегоФайла, ТипФайлаТабличногоДокумента.XLS); //Сохраняем в временный файл
   
КонецЦикла;

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

Скачать