Запись одной книги Excel на нескольких листах средствами 1С (без внешних компонент)

Публикация № 979007

Обмен - Загрузка и выгрузка в Excel

Excel Пакет Табличный Документ Одна Книга COM

126
Пользователи часто просят сохранить им стопиццот отчетов в один файл Excel, чтобы отчеты были в одном файле. Ну или клиент хочет счет, накладную и счет-фактуру получить в одном документе. 1С умеет это делать без всяких там COM-объектов. Давайте разберемся, куда нажимать и что крутить.

Сохранение нескольких табличных документов в одну книгу Excel

ВВЕДЕНИЕ

В 1С миллион лет назад появилась возможность сохранять табличный документ в Excel. А с версии 8.3.какой-то там еще и читать Excel в этот самый табличный документ. При этом прочитать 1С может документ с произвольным количеством закладок (книг), а вот если записать табличный документ обратно, то все содержимое будет помещено в лист "TDSheet" (ну или как-то так).

Меня давно мучила мысль о том, почему 1С не может записать несколько листов в одну книгу. Оказалось, что может. Давайте разберемся, каким образом она это делает...

НОВЫЕ СТАРЫЕ ОБЪЕКТЫ

Уже давно в 1С существует такой объект, как "ПакетОтображаемыхДокументов". Если зайти в синтаксис-помощник, то толку от этого будет мало - скудность информации зашкаливает...

Что же делает этот объект? Он позволяет записать несколько файлов в один. Как оказалось, среди типов записываемых документов есть и Excel.

Познакомился я с этим замечательным объектом при осуществлении поддержки механизма автоматической печати документов, который прекрасно жил на моей прошлой работе до часа Х. Час Х настал тогда, когда сохраняемые 1С PDF перестали сохраняться в том виде, в котором они должны были бы быть напечатаны. До какого-то времени PDF из табличного документа сохранялись таким образом, что количество экземпляров для печати становилось количеством повторов в PDF-файле в соответствии с настройками печати конкретного табличного документа. И вот пришел час Х - обновили платформу и автопечать выплюнула все документы в одном экземпляре. Этакая подстава от 1С (кстати, последняя подстава от желтых была в последней версии, и связана она с тем, что теперь нельзя редактировать строку табличной части, если выделено более одной строки, а кое-кто пользовался редактированием выделенных строк для того, чтобы установить всем выделенным строкам отредактированное значение - это было очень удобно, спасибо что лишили нас этого), которую совсем не ждешь. Стали разбираться и нашли в документации, что теперь для сохранения PDF в том виде, в котором должен быть напечатан документ, следует использовать новый метод объекта "ПакетОтображаемыхДокументов", который пишет как раз PDF-файл (и никакой другой).

Вообще, на просторах желтого сайта есть пример использования данного объекта. Смотрите здесь. Давайте разберемся, как это поможет нам сохранить несколько табличных документов в одну книгу.

ОПИСАНИЕ ОБЪЕКТА

Сам по себе пакет отображаемых документов по большому состоит из коллекции "Состав", имеющей тип "ЭлементПакетаОтображаемыхДокументов", в который, как следует из информации по ссылке выше, можно поместить в том числе и пакет отображаемых документов. Т.е. возможности коллекции достаточно большие - можно поместить в нее несколько пакетов, для которых количество печатаемых экземпляров будет отличаться, в итоге можно напечатать 10 экземпляров для первого документа, и 3 для второго. Также у этого объекта есть парочка методов сохранения - для PDF и для всего на свете. Ну и их экземпляры для асинхронной работы тоже наличествуют.

Для создания объекта существует простой конструктор:

ОднаКнига = Новый ПакетОтображаемыхДокументов;

Создав объект "ОднаКнига", мы можем в его состав поместить несколько табличных документов каким-то таким образом:

Элт = ОднаКнига.Состав.Добавить();
Элт.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент);

А сохранить в одну книгу все это хозяйство можно так:

ОднаКнига.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);

ЗАКЛЮЧЕНИЕ

Данный метод работает в Linux - у меня на скриншоте как раз конфигуратор, открытый на Ubuntu 18.4, в котором я и отлаживал тестовый примерчик. В итоге получилась замечательная обработка, которая создает столько закладок, сколько вам нужно, открывает в закладке файл Excel и сохраняет файлы со всех закладок в одну книгу. Реализовать данную обработку вы можете в качестве домашнего задания...

126

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Ibrogim 1075 14.01.19 14:28 Сейчас в теме
2. starik-2005 1842 14.01.19 14:32 Сейчас в теме
(1) а Вы, кстати, можете прикрутить туда этот вариант сохранения в Excel (ссылка на данную статью подразумевается) )))
12. Ibrogim 1075 15.01.19 11:49 Сейчас в теме
(2) Прикрутил Ссылку на вас вставил. Спасибо! Хорошая статья про хорошую технологию !
3. kote 500 14.01.19 17:25 Сейчас в теме
Свои названия листам можно давать?
4. starik-2005 1842 14.01.19 17:40 Сейчас в теме
20. makaorel 54 29.04.19 16:13 Сейчас в теме
(4) подскажите, пожалуйста, как присвоить имена листам?
21. makaorel 54 29.04.19 16:59 Сейчас в теме
(20) нашла сама -ЭлементПакетаОтображаемыхДокументов.Наименование
starik-2005; +1 Ответить
5. script 199 14.01.19 23:42 Сейчас в теме
Капец. Как я мог это пропустить?
6. acanta 48 15.01.19 01:00 Сейчас в теме
Супер. А в стандартной пакетной печати счет фактура + счет + накладная сохранение в екселе отдельно каждый файл если не ошибаюсь.
9. starik-2005 1842 15.01.19 11:22 Сейчас в теме
(6)
А в стандартной пакетной печати счет фактура + счет + накладная сохранение в екселе отдельно каждый файл если не ошибаюсь.
Есть мнение, что разработчики типовых сами не знают весь функционал 1С.
izidakg; IgorS; rovenko.n; tano23; +4 Ответить
7. German_Tagil 6 15.01.19 05:40 Сейчас в теме
8. John_d 532 15.01.19 10:23 Сейчас в теме
10. Ibrogim 1075 15.01.19 11:29 Сейчас в теме
(0),
ОднаКнига.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
Чтото я у этого объекта не вижу метода Записать() ...
Сорри, старая платформа )
11. starik-2005 1842 15.01.19 11:39 Сейчас в теме
(10)
Сорри, старая платформа )
Очень старая )))
13. Serega456 9 16.01.19 11:57 Сейчас в теме
К сожалению данный функционал доступен только с 8.3.12
14. starik-2005 1842 16.01.19 14:52 Сейчас в теме
(13) так 8.3.12 уже морально устарела. Для бухни типовой уже 8.3.13 нужна.
16. kirillkr 28 17.01.19 14:29 Сейчас в теме
15. kirillkr 28 17.01.19 14:27 Сейчас в теме
Спасибо, отличное рабочее решение. Если бы можно уже имеющийся многостраничный файл Excel загрузить в массив табличных документов, то можно было бы добавлять страницы в уже имеющийся файл Excel.
17. starik-2005 1842 17.01.19 14:35 Сейчас в теме
(15)
Если бы можно уже имеющийся многостраничный файл Excel загрузить в массив табличных документов, то можно было бы добавлять страницы в уже имеющийся файл Excel.
В действительности при загрузке Excel в табличный документ, в нем уже в коллекции областей содержатся поименованные области, соответствующие странице Excel. Можно вывести эти области по-одной в новый табличный документ и получить таким образом массив:
  МассивТабДокументов = Новый Массив;
  Для каждого Область ИЗ ТабличныйДокумент.Области Цикл
    НовыйТабДок = Новый ТабличныйДокумент;
    НовыйТабДок.Вывести(Область);
    МассивТабДокументов.Добавить(НовыйТабДок);
  КонецЦикла;


Не скажу, что вот именно такой код получится, но где-то тут.
18. kirillkr 28 18.01.19 11:16 Сейчас в теме
(17)
МассивТабДокументов = Новый Массив;
Для каждого Область ИЗ ТабличныйДокумент.Области Цикл
НовыйТабДок = Новый ТабличныйДокумент;
НовыйТабДок.Вывести(Область);
МассивТабДокументов.Добавить(НовыйТабДок);
КонецЦикла;


НовыйТабДок.ВставитьОбласть(Область);

К сожалению потерялась вся структура исходного листа. Да еще и съехала на несколько сот строк ниже. Интересно, можно ли как-нибудь прочитать многостраничный Excel с его группировками в Табличный документ без самого Excel или это фантастика?
19. Oleg_nsk 153 23.01.19 05:38 Сейчас в теме
Если кто не знал еще одна фича пакета отображаемых документов: при сохранении нескольких табличных документов в Word можно добиться чередования книжной и альбомной ориентации страниц в одном документе
user774630; starik-2005; +2 Ответить
Оставьте свое сообщение