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


Пользователи часто просят сохранить им стопиццот отчетов в один файл 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 и сохраняет файлы со всех закладок в одну книгу. Реализовать данную обработку вы можете в качестве домашнего задания…

24 Comments

  1. Ibrogim

    Кассно. Можно ещё с этим совместить https://infostart.ru/public/607750/

    Reply
  2. starik-2005

    (1) а Вы, кстати, можете прикрутить туда этот вариант сохранения в Excel (ссылка на данную статью подразумевается) )))

    Reply
  3. kote

    Свои названия листам можно давать?

    Reply
  4. starik-2005

    (3) можно.

    Reply
  5. script

    Капец. Как я мог это пропустить?

    Reply
  6. acanta

    Супер. А в стандартной пакетной печати счет фактура + счет + накладная сохранение в екселе отдельно каждый файл если не ошибаюсь.

    Reply
  7. German_Tagil

    надо попробывать

    Reply
  8. John_d

    Век живи — век учись.

    Reply
  9. starik-2005

    (6)

    А в стандартной пакетной печати счет фактура + счет + накладная сохранение в екселе отдельно каждый файл если не ошибаюсь.

    Есть мнение, что разработчики типовых сами не знают весь функционал 1С.

    Reply
  10. Ibrogim

    (0),

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

    Чтото я у этого объекта не вижу метода Записать() …

    Сорри, старая платформа )

    Reply
  11. starik-2005

    (10)

    Сорри, старая платформа )

    Очень старая )))

    Reply
  12. Ibrogim

    (2) Прикрутил Ссылку на вас вставил. Спасибо! Хорошая статья про хорошую технологию !

    Reply
  13. Serega456

    К сожалению данный функционал доступен только с 8.3.12

    Reply
  14. starik-2005

    (13) так 8.3.12 уже морально устарела. Для бухни типовой уже 8.3.13 нужна.

    Reply
  15. kirillkr

    Спасибо, отличное рабочее решение. Если бы можно уже имеющийся многостраничный файл Excel загрузить в массив табличных документов, то можно было бы добавлять страницы в уже имеющийся файл Excel.

    Reply
  16. kirillkr

    (14) Пока еще 8.3.12.1685.

    Reply
  17. starik-2005

    (15)

    Если бы можно уже имеющийся многостраничный файл Excel загрузить в массив табличных документов, то можно было бы добавлять страницы в уже имеющийся файл Excel.

    В действительности при загрузке Excel в табличный документ, в нем уже в коллекции областей содержатся поименованные области, соответствующие странице Excel. Можно вывести эти области по-одной в новый табличный документ и получить таким образом массив:

    МассивТабДокументов = Новый Массив;
    Для каждого Область ИЗ ТабличныйДокумент.Области Цикл
    НовыйТабДок = Новый ТабличныйДокумент;
    НовыйТабДок.Вывести(Область);
    МассивТабДокументов.Добавить(НовыйТабДок);
    КонецЦикла;
    

    Не скажу, что вот именно такой код получится, но где-то тут.

    Reply
  18. kirillkr

    (17)

    МассивТабДокументов = Новый Массив;

    Для каждого Область ИЗ ТабличныйДокумент.Области Цикл

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

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

    МассивТабДокументов.Добавить(НовыйТабДок);

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

    К сожалению потерялась вся структура исходного листа. Да еще и съехала на несколько сот строк ниже. Интересно, можно ли как-нибудь прочитать многостраничный Excel с его группировками в Табличный документ без самого Excel или это фантастика?

    Reply
  19. Oleg_nsk

    Если кто не знал еще одна фича пакета отображаемых документов: при сохранении нескольких табличных документов в Word можно добиться чередования книжной и альбомной ориентации страниц в одном документе

    Reply
  20. makaorel

    (4) подскажите, пожалуйста, как присвоить имена листам?

    Reply
  21. makaorel

    (20) нашла сама -ЭлементПакетаОтображаемыхДокументов.Наименование

    Reply
  22. СергейК

    (18) Подскажите так и не нашли способ прочитать многостраничный Excel ?

    Нужно открыть Книгу Excel, прочитать данные, кое что изменить и записать обратно без порчи файла.

    Reply
  23. kirillkr

    (22) к сожалению, нет. В 14 и 15 платформе не проверял, но в 12 форматирование не сохраняется.

    Reply
  24. kraspila

    Полезная информация, плюс автору за раскрытие и минус справке 1С за примитивность

    Reply

Leave a Comment

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