Обычные формы.

Задача: Есть несколько ТабДоков, необходимо всех их выгрузить в одну книгу Excel, где для каждого ТабДока будет свой лист.

Решение есть, но оно очень медленное.

Комментарий к коду ниже - сохраняем ТабДок в во временный файл с форматом "xls", далее открываем такой файл экселем и копируем из него страницу, далее вставляем эту страницу в наш итоговый файл экселя, удаляем временный файл, создаем новый файл с новым ТабДоком - снова копируем страницу и вставляем в итоговый и пока не кончатся ТабДоки делаем это.

Ниже весь код данной процедуры

```1c
    ВременныйФайл = Папка_TEMP + "TEMP_XLS.XLS";

    КнигаОбщая = ОбъектЭкспорт.Workbooks.Add();

    КоличествоПервыхСтраниц = КнигаОбщая.WorkSheets.Count();

    p = 0;

    Для Каждого ТабДок из МасТабДоков Цикл

    ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.XLS97);

    Книга = ОбъектЭкспорт.Workbooks.Open(ВременныйФайл); //Очень медленная операция

    Книга.WorkSheets(1).Name = ТабДок.ИспользуемоеИмяФайла; // В "ИспользуемоеИмяФайла" строковое значение (которое я где-то не здесь установил)

    Книга.WorkSheets(1).Copy(, КнигаОбщая.WorkSheets(КоличествоПервыхСтраниц + p));

    Книга.Close(Ложь);

    Inc(p);

    УдалитьФайлы(ВременныйФайл); //Страница скопирована в итоговый файл, удаляем временный файл

    КонецЦикла;

    Для p = 1 по КоличествоПервыхСтраниц Цикл

    КнигаОбщая.WorkSheets(1).Delete();

    КонецЦикла;

    //Проверим чтобы в папке не было уже такого файла
    Если НайтиФайлы(ПутьКФайлу).Количество() > 0 Тогда

    УдалитьФайлы(ПутьКФайлу);

    КонецЕсли;

    //Сохраняем итоговый файл экселя
    ПутьКФайлу = Папка_TEMP + ИмяИтоговойКниги; //Папка_TEMP - объявлена в другом месте, ведет к временной папке на ПК, ИмяИтоговойКниги - строковое название файла, далее по коду я беру этот путь и прикрепляю файл вложением к письму в аутлуке.
    КнигаОбщая.SaveAs(ПутьКФайлу, 56);

    ОбъектЭкспорт.Quit();
```

Операция "Книга = ОбъектЭкспорт.Workbooks.Open(ВременныйФайл)" открывает один файл экселя примерно секунду, а общее время выполнения кода всего кода связанного с этой процедурой > 2 секунд и имея 10 ТабДоков - имеем повисшее предприятие на 20 секунд.

Решением я вижу сохранение ТабДоков в формате "xls" не на диске пользователя, а в оперативной памяти с помощью - "Новый ПотокВПамяти", но столкнулся с проблемой - ТабДок не может сохранится в оперативной памяти в формате xls (в любом xls - xls95, xls97, xlsx), в формате TXT сохраняется, а вот в экселевском формате не хочет.

Код сохранения ТабДока в формате xls в потоке:

```1c
    _Поток = Новый ПотокВПамяти();
    ТабДок.Записать(_Поток, ТипФайлаТабличногоДокумента.xls); //Если указать ТипФайлаТабличногоДокумента.TXT - то это работает
    //ДвоичныеДанныеФайла = _Поток.ЗакрытьИПолучитьДвоичныеДанные(); //Сюда не доходит, в строке выше - ошибка - "не верно передан второй параметр"
    //Текст = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанныеФайла, КодировкаТекста.UTF8);
```
---
, (4)

```1c
    ТабличныйДокумент1 = ПолучитьТабличныйДокумент1();
    ТабличныйДокумент2 = ПолучитьТабличныйДокумент2();
    ....
    Книга = Новый ПакетОтображаемыхДокументов;
    Лист1 = Книга.Состав.Добавить();
    Лист1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент1);
    Лист2 = Книга.Состав.Добавить();
    Лист2.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент2);
    .....
    Книга.Записать(ИмяФайлаXLSX, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
    Книга.Записать(ИмяФайлаXLS, ТипФайлаПакетаОтображаемыхДокументов.XLS);
```
---
Книга = ОбъектЭкспорт.Workbooks.Open(ВременныйФайл); //Очень медленная операция
На сколько я понял книга все время одна. Может ее открытие вынести за цикл, один раз открыть а потом табдоки прицеплять к новой странице.
---
Книга все время новая, это открывается тот временный файл с ТабДоком откуда мы копируем страницу в итоговую Книгу, насколько я понял метод Copy работает так

```1c
    Книга WorkSheets(1).Copy(, КнигаОбщая.WorkSheets(КоличествоПервыхСтраниц + p));
```

Копировать Лист в (Переменная(Номер Страницы куда будет помещена)),
Т.е Лист.Копировать(Книга(НомерСтраницы));

Вот код с подробными комментариями

```1c
    Для Каждого ТабДок из МасТабДоков Цикл

    ТабДок.Записать(ВременныйФайл, ТипФайлаТабличногоДокумента.XLS97); //Сохраняем ТабДок во временный файл с форматом xls

    Книга = ОбъектЭкспорт.Workbooks.Open(ВременныйФайл); //Открываем временный файл
    Лист = Книга.WorkSheets(1); //(1) - Номер листа к которому обращаемся во временном файле
    Лист.Name = ТабДок.ИспользуемоеИмяФайла; //задаем имя листу
    Лист.Copy(, КнигаОбщая.WorkSheets(КоличествоПервыхСтраниц + p)); //Копирование листа в общую книгу (КоличествоПервыхСтраниц + p) - номер страницу в общей книге куда будет скопирована
    Книга.Close(Ложь);

    Inc(p);

    УдалитьФайлы(ВременныйФайл); //Удаляем временный файл

    КонецЦикла;
```
---
я не про сору, а про Open говорил. У Вас копи применяется к листу книги.
---
Как скопировать лист временного файла экселя не открыв его?
---
думаю, что такое может быть ускорено, если подобная функциональность будет заложена в платформу...
---
, (4)

```1c
    ТабличныйДокумент1 = ПолучитьТабличныйДокумент1();
    ТабличныйДокумент2 = ПолучитьТабличныйДокумент2();
    ....
    Книга = Новый ПакетОтображаемыхДокументов;
    Лист1 = Книга.Состав.Добавить();
    Лист1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент1);
    Лист2 = Книга.Состав.Добавить();
    Лист2.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент2);
    .....
    Книга.Записать(ИмяФайлаXLSX, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
    Книга.Записать(ИмяФайлаXLS, ТипФайлаПакетаОтображаемыхДокументов.XLS);
```
---
Вот это шикарная вещь! Никаких Com-объектов, попробовал на тестовой базе на домашнем компе с платформой версии 8.3.13 и всё просто полетело, подключился к рабочему компу, а там платформа 8.3.10....а добавлен данный функционал в 8.3.12....
---
тогда продолжайте искать решение как начали, т.е. пляски с сом.
---
Пока оставлю как есть, а как только на нашем предприятии обновится платформа - воспользуюсь новыми возможностями. Спасибо за ответ.
---
Как вариант, сохранять в потоке как текстовый файл с разделителями строк, а потом поднимать в Excel как CSV-файл.

Но не факт, что сильно ускорится. Все равно COM...