1с сохранить табличный документ в excel программно на разные листы

   shuhard

1 — 08.10.18 — 18:51

(0) ПРОЧЕЕ

Экспорт пакета отображаемых документов. Несколько табличных документов «1С:Предприятия» можно сохранить на разных листах результирующего документа, имеющего формат табличного процессора (XLS, XLSX, ODT). Эта возможность позволит, например, сохранять отчет, содержащий несколько разделов, в формате Microsoft Excel.

   shuhard

2 — 08.10.18 — 18:53

(1) +1

Реализована возможность экспорта пакета отображаемых документов в форматы XLS (Microsoft Excel 97-2003), Microsoft Office OpenXML (Microsoft Excel 2007 и старше) и ODT (OpenDocument). При этом реализована возможность сохранения каждого табличного документа пакета на отдельном листе результирующего документа.

Реализовано свойство ЭлементПакетаОтображаемыхДокументов.Наименование, которое используется для указания имени листа.

Для объекта ПакетОтображаемыхДокументов реализованы методы Записать() и НачатьЗапись().

   shuhard

3 — 08.10.18 — 18:58

(2)+1

https://its.1c.ru/db/metod8dev#content:5792:hdoc:_top:пакетотображаемыхдокументов

Особенности пакетной печати табличных документов

Режим пакетной печати предназначен для печати нескольких табличных документов. Для печати используются объекты встроенного языка: ПакетОтображаемыхДокументов, ЭлементыПакетаОтображаемыхДокументов, ЭлементПакетаОтображаемыхДокументов.

ПакетОтображаемыхДокументов – это собственно сам пакет, который содержит документы и настройки печати. У него есть свойство Состав, представляющее собой объект ЭлементыПакетаОтображаемыхДокументов – коллекцию объектов  ЭлементПакетаОтображаемыхДокументов.

ЭлементПакетаОтображаемыхДокументов – объект, который содержит либо адрес временного хранилища, в котором расположен табличный документ, либо объект ПакетОтображаемыхДокументов, обозначающий вложенный пакет документов.

Настройки печати устанавливаются для всего пакета, индивидуальные настройки печати документов игнорируются. Доступны настройки КоличествоЭкземпляров, РазборПоКопиям, ИмяПринтера, ДвусторонняяПечать, ТочностьПечати, Вывод.

Чтобы установить индивидуальные параметры печати для конкретного документа, следует добавить вложенный пакет, поместить документ в него и установить параметры печати для этого вложенного пакета.

Например, необходимо распечатать 3 табличных документа, причем два из них по 5 экземпляров каждый, а третий — в 2 экземплярах:

Копировать в буфер обмена

// Создаем пакет

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

// Документы, находящиеся в этом пакете, печатаются в 5 экземплярах

Пакет.КоличествоЭкземпляров = 5;

// Добавляем документы в пакет

ЭлементПакета1 = Пакет.Состав.Добавить();

ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент1, УникальныйИдентификатор);

ЭлементПакета2 = Пакет.Состав.Добавить();

ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент2, УникальныйИдентификатор);

// Добавляем вложенный пакет для третьего документа

ВложенныйПакет = Новый ПакетОтображаемыхДокументов;

ЭлементПакета3 = Пакет.Состав.Добавить();

ЭлементПакета3.Данные = ВложенныйПакет;

// Документ во вложенном пакете печатается в 2 экземплярах

ВложенныйПакет.КоличествоЭкземпляров = 2;

// Добавляем документ во вложенный пакет

ЭлементВложенногоПакета1 = ВложенныйПакет.Состав.Добавить();

ЭлементВложенногоПакета1.Данные = ПоместитьВоВременноеХранилище(ТабличныйДокумент3, УникальныйИдентификатор);

// Печатаем пакет

Пакет.Напечатать();

Для вложенного пакета можно установить те же параметры печати, что и для всего пакета, при этом если какие-то параметры не установлены, то они определяются из параметров родительского пакета.

Пакет позволяет также экспортировать табличные документы в один PDF файл. Для этого предназначен метод пакета ЗаписатьФайлДляПечати(), которому передается полное имя файла.

   slasher

4 — 08.10.18 — 19:28

shuhard, спасибо огромное, выручил!!!

кому надо вот рабочий кусок кода, для сохранения в эксель

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

    Пакет.КоличествоЭкземпляров = 2;

    ЭлементПакета1 = Пакет.Состав.Добавить();

    ЭлементПакета1.Данные = ПоместитьВоВременноеХранилище(ТабДокРеестр);

    ЭлементПакета2 = Пакет.Состав.Добавить();

    ЭлементПакета2.Данные = ПоместитьВоВременноеХранилище(ТабДок);

    
    Пакет.Записать(СокрЛП(ИмяФайла)+».xls»,ТипФайлаПакетаОтображаемыхДокументов.XLS);

Dolphinbet

24.06.14 — 13:58

Maxus43

1 — 24.06.14 — 14:01

если ты думаешь что я буду читать там, а потом отвечать тут, когда даже не ты автор темы той — ошибаешся…
описывай проблему тут свою

f_vadim

2 — 24.06.14 — 14:06

если ты думаешь что я буду читать там, тут, а потом отвечать, когда даже не ты автор темы той — ошибаешся…
описывать проблему не нужно

Dolphinbet

3 — 24.06.14 — 14:09

1С 8.3.5 (32-битный). Excel 2010 (64-битный).
Создаю обработку с кодом:
&НаСервере

Процедура ТестExcel(ПутьКФайлу)
excel = Новый COMОбъект("Excel.Application");
excel.WorkBooks.Open(ПутьКФайлу);
КонецПроцедуры

Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу «c:Excel.xls»…

f_vadim

4 — 24.06.14 — 14:09

&НаСервере
не за что

Dolphinbet

5 — 24.06.14 — 14:10

(4) а что с сервером не так?

f_vadim

6 — 24.06.14 — 14:12

(5) всё так, читай теорию, пользуйся поиском, тема обсуждается 2 раза в неделю точно.

Dolphinbet

7 — 24.06.14 — 14:13

(6) погуглил, много разных советов но ничего не подходит. Решения проблемы не нашел в общем

GreatOne

8 — 24.06.14 — 14:13

Что ты хочешь делать с этим файлом дальше? Почему на сервере?

Kalambur

9 — 24.06.14 — 14:13

Доступ

Segate

10 — 24.06.14 — 14:13

(5) у тебя код &наСервере
а файл

>>Локально.
>>c:Excel.xls

Дальше объяснять?

ЗЫ и да, я прочитал тему по ссылке

Dolphinbet

11 — 24.06.14 — 14:14

(10) у меня локально = на сервере :)

Dolphinbet

12 — 24.06.14 — 14:14

Все крутится на одном компе в общем

Segate

13 — 24.06.14 — 14:15

(12) и у сервера есть доступ на диск C?

Dolphinbet

14 — 24.06.14 — 14:15

(9) доступ к файлу есть у всез пользователей

Dolphinbet

15 — 24.06.14 — 14:16

(13)конечно

GreatOne

16 — 24.06.14 — 14:16

ПИШИ НА КЛИЕНТЕ!!!

Dolphinbet

17 — 24.06.14 — 14:16

(15) + по крайней мере файлы создаются нормально

Dolphinbet

18 — 24.06.14 — 14:16

(16)мне надо в регламентном задании

f_vadim

19 — 24.06.14 — 14:17

(17) а если сделать &НаКлиенте ?

Dolphinbet

20 — 24.06.14 — 14:18

(19) все отрабатывает

Kalambur

21 — 24.06.14 — 14:18

(14) кроме него..

Dolphinbet

22 — 24.06.14 — 14:19

(21) у меня создается файл под этим же пользователем, как у него не может быть доступа на созданный файл?

Segate

23 — 24.06.14 — 14:20

(12) Объясню для людей которых забанили в гугле, на клиенте обращаешься к файлику, пихаешь во временное хранилище, и производишь манипуляции, данные передаешь на сервер и обрабатываешь

f_vadim

24 — 24.06.14 — 14:20

(22) база файловая?
или серверная?

Dolphinbet

25 — 24.06.14 — 14:20

(23) а смысл?

Dolphinbet

26 — 24.06.14 — 14:20

(24) серверная

Dolphinbet

27 — 24.06.14 — 14:21

кто-нибудь может сделать аналогичную простенькую обработку и проверить у себя?)

GreatOne

28 — 24.06.14 — 14:21

(25) нет смысла. Ты все правильно делаешь. 1С сырая еще

f_vadim

29 — 24.06.14 — 14:21

(26) у пользователя от которого запущен сервер не доступа к файлу

Dolphinbet

30 — 24.06.14 — 14:22

(29) я же говорю, что под этим же пользователем и создаю файл…

GreatOne

31 — 24.06.14 — 14:23

(29) на сервере))

GreatOne

32 — 24.06.14 — 14:24

(31) это к 30

f_vadim

33 — 24.06.14 — 14:24

(30) чудес не бывает
попробуй создай его 1с-кой &НаСервере

Dolphinbet

34 — 24.06.14 — 14:25

(32) да, создаю файл отчета в формате xls на сервере, и затем пытаюсь его открыть (на сервере)

Segate

35 — 24.06.14 — 14:26

(25) давай так, если я напишу твою обработку в течении сегодняшнего дня, используя гугл, и то что я тебе сказал, с пруфами конечно, то ты мне платишь 5000? Норм?

Dolphinbet

36 — 24.06.14 — 14:27

(35) а если нет, ты мне?)

f_vadim

37 — 24.06.14 — 14:28

курить права на каталог и файл
проверить, может файл захвачен в момент открытия

Dolphinbet

38 — 24.06.14 — 14:30

(37) это все проверено. У меня встречное предложение, чтобы кто-нибудь потратил 5 минут и написал подобную обработку и отписался о результатах :)

f_vadim

39 — 24.06.14 — 14:32

(38) написать не проблема — проверить негде )

а текстовый файл без COMа прочитает?

Dolphinbet

40 — 24.06.14 — 14:34

Полный код:

&НаСервере

Функция СформироватьОтчет()

ОтчетПоЦенам = Отчеты.ОтчетПоЦенамГоризонтальный.Создать();

ТабДок = Новый ТабличныйДокумент;
ОтчетПоЦенам.СкомпоноватьРезультат(ТабДок);

ПутьКФайлуотчета= ПутьКОтчету + "" + "ОтчетПоЦенам_" + Формат(ТекущаяДата() , "ДФ=yyyy-MM-dd") + ".XLSX";

ТабДок.Записать(ПутьКФайлуотчета, ТипФайлаТабличногоДокумента.XLSX);

excel = Новый COMОбъект("Excel.Application");
excel.DisplayAlerts = 0;
excel.EnableEvents = 0;
excel.WorkBooks.Open(ПутьКФайлуотчета);

КонецФункции

Dolphinbet

41 — 24.06.14 — 14:37

(39) да, читает

f_vadim

42 — 24.06.14 — 14:38

(41) а если паузу сделать перед


excel.WorkBooks.Open(ПутьКФайлуотчета);

?

Segate

43 — 24.06.14 — 14:39

(38) я уже написал, у меня все работает.
А тебе я советую читать гугл. У тебя 100 пудов 32 разрядный ексель и 64 разрядный 1с или наоборот, так что у меня все отработало без проблем, и это не значит что проблемы нет, но беглый гуглинг кинул меня на сайт где описан подобный метод:

To resolve this issue follow these steps
1. Login to the server as a administrator.
2. Go to «Start» -> «Run» and enter «taskmgr»
3. Go to the process tab in task manager and check «Show Processes from all users»
4. If there are any «Excel.exe» entries on the list, right click on the entry and select «End Process»
5. Close task manager.
6. Go to «Start» -> «Run» and enter «services.msc»
7. Stop the service automating Excel if it is running.
8. Go to «Start» -> «Run» and enter «dcomcnfg»
9. This will bring up the component services window, expand out «Console Root» -> «Computers» -> «DCOM Config»
10. Find «Microsoft Excel Application» in the list of components.
11. Right click on the entry and select «Properties»
12. Go to the «Identity» tab on the properties dialog.
13. Select «The interactive user.»
14. Click the «OK» button.
15. Switch to the services console
16. Start the service automating Excel
17. Test you application again.

hhhh

44 — 24.06.14 — 14:39

(40) но реально проверил пользователя usr1cv8?

Segate

45 — 24.06.14 — 14:40

(40) и вообще… есть тонна ВК, котоыре работают лучше и быстрее, чем ексель поднятый по ком, задумайтесь об этом.

Segate

46 — 24.06.14 — 14:42

+(44)так же предлагаю попробовать создать папки

C:WindowsSysWOW64configsystemprofileDesktop

C:WindowsSystem32configsystemprofileDesktop

Хз зачем, может пользователь из службы excel их исползует… не разбирался

Kalambur

47 — 24.06.14 — 14:43

ПутьКФайлуотчета неправельный

Dolphinbet

48 — 24.06.14 — 15:16

(45) Какие?)

Dolphinbet

49 — 24.06.14 — 15:19

(43) ну у меня вроде все так и есть.. только в службах у меня нет «service automating Excel»

Dolphinbet

50 — 24.06.14 — 15:20

(43) а com-объект запускается под «запускающим пользователем»

Dolphinbet

51 — 24.06.14 — 15:22

(50) о, поставил запускать под текущим пользователем и заработало!

Dolphinbet

52 — 24.06.14 — 15:26

Segate, спасибо!

Segate

53 — 24.06.14 — 15:28

Не за что.
Как я и говорил — 30 секунд гугла решило проблему. с тебя 5к )))

Dolphinbet

54 — 24.06.14 — 15:28

и все-таки что за ВК которые лучше excel?)

Dolphinbet

55 — 24.06.14 — 15:31

мне и самому не нравится excel по кому, но надо кое-что подправить в отчете…

Segate

56 — 24.06.14 — 15:40

Dolphinbet

57 — 24.06.14 — 16:00

(56) это чисто чтение, отформатировать содержимое документа там нельзя…

Segate

58 — 24.06.14 — 16:05

(57) не, тебя что, правда в гугле забанили? Ну поищи чуть чуть, найди нужную… может не нативную, но все же

Dolphinbet

59 — 24.06.14 — 16:07

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

С помощью объекта ПакетОтображаемыхДокументов

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










Процедура СформироватьФайлПакетом(ИмяФайла, МассивДанных)
	Пакет = Новый ПакетОтображаемыхДокументов;
  	Для Каждого ДанныеЛиста Из МассивДанных Цикл
		АдресВХранилище = ДанныеЛиста[«АдресВХранилище»];
		ЭлементПакета = Пакет.Состав.Добавить();
		ЭлементПакета.Наименование = ДанныеЛиста[«Имя»];
		ЭлементПакета.Данные = АдресВХранилище;
  	КонецЦикла;
 	Попытка
		Пакет.Записать(ИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
		ПоказатьПредупреждение(, «Файл выгружен в « + ИмяФайла);
  	Исключение
		ПоказатьПредупреждение(,«Ошибка выгрузки в « + ИмяФайла);
		Сообщить(ОписаниеОшибки());
  	КонецПопытки;
КонецПроцедуры 

ИмяФайла – имя файла в который будет сохранена книга. Можно перед вызовом функции предлагать пользователю указать каталог, куда будет сохраняться файл, и в параметр передать полный путь до файла, например “D:ФайлыМойФайлЭксель.xlsx”.

МассивДанных — массив соответствий с данными для формирования книги. Массив собираю на сервере. Соответствие представляет из себя коллекцию значений в связки с ключем. Ключи — Имя (имя листа в книге) и АдресВХранилище (адрес табличного документа во временном хранилище).

В отличие от второго варианта файл сохраняется значительно быстрее.

С помощью COM-объекта Excel.Application

Этот вариант подойдет тем, кому приходится работать со старыми версиями платформы. 1С позволяет сохранять табличный документ в эксель:

ТабличныйДокумента.Записать(<ИмяФайла>, <ТипФайлаТаблицы>);

Указав в качестве типа файла таблицы ТипФайлаТабличногоДокумента.XLSX в итоге получим файл Эксель, но в нем мы не увидим привычных листов, соответственно и сохранить несколько табличных документов в одну книгу не получится.

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

  1. Открываем Эксель;
  2. Создаем новую книгу с 1 листом (переменная Книга);
  3. В цикле каждое табличный документ сохраняем в файл с типом xlsx;
  4. Открываем файл с выгруженным табличным документом, и копируем лист в нашу рабочую книгу, вставляя последним листом;
  5. Закрываем временный файл, удаляем из временного хранилища и переходим к следующему табличному документу;
  6. Последним шагом — сохраняем книгу, закрываем эксель.
&НаКлиенте
Процедура СформироватьФайл(ИмяФайла, МассивДанных)		
	ОбъектЭксель = ПолучитьCOMОбъект("", "Excel.Application");
	ОбъектЭксель.SheetsInNewWorkbook = 1; 
	ОбъектЭксель.DisplayAlerts = False;
        Книга = ОбъектЭксель.Workbooks.Add();	
	Попытка		
		НомерЛиста = 1;
		Для Каждого ДанныеЛиста Из МассивДанных Цикл			
			АдресВХранилище = ДанныеЛиста["АдресВХранилище"];		
			ТабличныйДокумента = ПолучитьИзВременногоХранилища(АдресВХранилище);			
		 	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    		        ТабличныйДокумента.Записать(ИмяВременногоФайла, ТипФайлаТабличногоДокумента.XLSX);			
			ВременнаяКнига = ОбъектЭксель.Workbooks.Open(ИмяВременногоФайла);
			ЛистИсточник = ВременнаяКнига.WorkSheets(1);
			ЛистИсточник.Copy(Книга.WorkSheets(НомерЛиста));
			Книга.WorkSheets(НомерЛиста).Name = ДанныеЛиста["Имя"];
			ВременнаяКнига.Close(0);			
			УдалитьИзВременногоХранилища(АдресВХранилище);
			НомерЛиста = НомерЛиста + 1;			
		КонецЦикла;		
		Книга.Sheets(НомерЛиста).Delete();		
		ОбъектЭксель.Workbooks(1).Activate();
		Книга.Worksheets(1).Activate();
		Книга.SaveAs(ИмяФайла);	
		Книга.Close(0);		
		ОбъектЭксель.Quit();
		ОбъектЭксель = Неопределено;		
		ПоказатьПредупреждение(,"Файл выгружен в " + ИмяФайла);		
	Исключение		
		ПоказатьПредупреждение(,"Ошибка выгрузки в " + ИмяФайла);
		Сообщить(ОписаниеОшибки());		
		Если ОбъектЭксель <> Неопределено Тогда			
			ОбъектЭксель.Quit();
			ОбъектЭксель = Неопределено;			
		КонецЕсли;		
	КонецПопытки;	
КонецПроцедуры 

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

В ходе одного из проектов всплыло задание: отчёты должны быть скомпонованы в пачки и сохраняться в эксель вместе, каждый отчёт — на отдельный лист в файле. После некоторых происков с экселем и поисков с гуглом появилась обработка.

Алгоритм прост:

  • * открываем эксель,
  • * создаём новый файл,
  • * перебираем в цикле табличные документы:
    • — каждый документ сохраняем в эксель штатными средствами 1С,
    • — открываем файл экселем и
    • — копи-пастим оттуда первый (единственный) лист в наш сводный файл.
  • * сохраняемся, закрываем эксель

Разрабатывалось и тестировалось в условиях MS Office 2007 Standart. Под старые офисы можно и самим допилить. 

В приложенном файле нижеприведённый код и пример его использования.

Исходный код:

// СохранитьМногостраничныйФайл() Создаёт XLSX-файл с несколькими листами
//
// Параметры
//      ИмяФайла            — Имя выходного файла
//      СоответствиеЛистов  —
//                          (1) Соответствие:
//          Ключ            — Строка — Имя листа
//          Значение        — Табличный документ — Содержимое листа
//                          (2) Таблица значений с колонками Ключ и Значение.
//                              Может понадобиться, если требуется строгий порядок листов.
Процедура СохранитьМногостраничныйФайл(ИмяФайлаСоответствиеЛистов) Экспорт Х ПолучитьCOMОбъект(«»«Excel.Application»);
    
Х.SheetsInNewWorkbook 1// в новой книге создавать только 1 лист
    
Книга Х.Workbooks.Add(); Первый = Истина; // у нас уже есть один лист, надо использовать его
    
ПрошлыйЛист = Неопределено; 

    Для Каждого 

мЛист Из СоответствиеЛистов Цикл // Сохраняем табличный документ во временный файл
        
ИмяВременногоФайла ПолучитьИмяВременногоФайла(«xlsx»);
        
ТабДок мЛист.Значение;
        
ТабДок.Записать(ИмяВременногоФайлаТипФайлаТабличногоДокумента.XLSX); Х.CutCopyMode = False; // Сбрасываем старое копирование 

        // Копируем первый (единственный) лист временного файла

мКнига Х.Workbooks.Open(ИмяВременногоФайла);
        
мКнига.Worksheets(1).Cells.Select();
        
Х.Selection.Copy(); 

        Если 

Первый Тогда // Используем созданный автоматически
            
НовыйЛист Книга.Worksheets(1);
            
Первый = Ложь;
        Иначе 
// добавляем новый
            
НовыйЛист Книга.Worksheets.Add(, ПрошлыйЛист); // Добавляем новый лист после прошлого
        
КонецЕсли; НовыйЛист.Name мЛист.Ключ// Задаём имя
        
НовыйЛист.Paste(); // Вставляем содержимое 

        // Сбрасываем выделение с добавленного листа

НовыйЛист.Activate();
        
Х.Range(«A1»).Select(); ПрошлыйЛист НовыйЛист;

    КонецЦикла; 

// Для Каждого мЛист Из СоответствиеЛистов Цикл Х.DisplayAlerts = False; // Отключаем вывод предупреждений типа «Заменить файл?»
    
Книга.Worksheets(1).Activate(); // Активируем 1 лист из списка
    
Книга.SaveAs(ИмяФайла); Х.Quit();Х = Неопределено; 

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

// СохранитьМногостраничныйФайл()

Понравилась статья? Поделить с друзьями:
  • 1с сохранить ведомость в excel
  • 1с сохранить в excel на клиенте
  • 1с сохранить excel с листами
  • 1с сохранение табличного документа в файл excel
  • 1с сохранение печатной формы в word