Сохранение из 1С в EXCEL несколько листов

1. BARDER 38 02.05.20 10:56 Сейчас в теме
Доброго времени суток.
Объясню ситуацию:
Есть печатная форма в форме которой есть команда "сохранить в EXCEL"
Процедура ДействияФормыСохранитьВExcel(Кнопка)
	
	диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	диалог.Фильтр = "Файл Excel (*.xls)|*.xls|Файл Excel 2007 (*.xlsx)|*.xlsx";
	
	Если диалог.Выбрать() Тогда
		
		файл = Новый Файл(диалог.ПолноеИмяФайла);
		Если НРЕГ(файл.Расширение) = ".xlsx" Тогда
			ЭлементыФормы.Результат.Записать(диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX)
		Иначе
			ЭлементыФормы.Результат.Записать(диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS)
		КонецЕсли;
		
	КонецЕсли;
	
КонецПроцедуры
Показать

он сохраняет файл как положено, но в файле должно быть еще 2 листа,
создал еще 2 макета с данными, которые постоянные. их нужно добавить как отдельные листы файла Excel.

Вопрос: Как мне добавить остальные 2 макета к файлу в виде листов?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
9. starik-2005 3060 02.05.20 18:26 Сейчас в теме
https://infostart.ru/public/979007/ - вот решение. Странно, что человек из (2), плюсанувший эту статью, уже все забыл )))
12. BARDER 38 03.05.20 19:12 Сейчас в теме
(9)
диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	диалог.Фильтр = "Файл Excel (*.xls)|*.xls|Файл Excel 2007 (*.xlsx)|*.xlsx";
	
	Если диалог.Выбрать() Тогда
		
		ТабДок2Лист = ПолучитьВторойЛист();
		ОднаКнига = Новый ПакетОтображаемыхДокументов;
		Элт = ОднаКнига.Состав.Добавить();
		Элт.Наименование = "Заказ";
		Элт.Данные = ПоместитьВоВременноеХранилище(ЭлементыФормы.Результат.Данные);
		Элт2 = ОднаКнига.Состав.Добавить();
		Элт2.Наименование = "Образец заполнения";
		Элт2.Данные = ПоместитьВоВременноеХранилище(ТабДок2Лист);
		ОднаКнига.Записать(диалог.ПолноеИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
                КонецЕсли;
Показать

Выдает ошибку:
{ВнешняяОбработка.ПечатьЗаказа.Форма.ФормаОтчета.Форма(32)}: Ошибка при вызове метода контекста (Записать)
		ОднаКнига.Записать(диалог.ПолноеИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
по причине:
Ошибка экспорта табличного документа: Документ Excel 2007 не может содержать более 16384 колонок и 1048576 строк

В макете 16 колонок и 8 строк
13. starik-2005 3060 03.05.20 23:13 Сейчас в теме
(12)
ПоместитьВоВременноеХранилище(ЭлементыФормы.Результат.Данные);
Трудная жизнь 1С-негов...
14. BARDER 38 04.05.20 09:26 Сейчас в теме
(13) Возможно Вы правы какая у Вас жизнь...
Но давайте к сути... что не так тут: ПоместитьВоВременноеХранилище(ЭлементыФормы.Результат.Данные);
17. blandinko 16.03.21 17:10 Сейчас в теме
(12) Добрый день, столкнулась с такой же ошибкой, как у Вас при попытке использовать ПакетОтображаемыхДокументов для выгрузки нескольких табличных документов в одну Excel-книгу:
Ошибка экспорта табличного документа: Документ Excel 2007 не может содержать более 16384 колонок и 1048576 строк


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

Вы случайно не нашли причину появления этой ошибки и как ее исправить?
18. blandinko 16.03.21 17:55 Сейчас в теме
(12)
(17)

Помогло принудительное задание нового уникального идентификатора при помещении табличных документов во временное хранилище:

Соответствие.Вставить("АдресВХранилище", ПоместитьВоВременноеХранилище(ТабДок, Новый УникальныйИдентификатор));
m0zg153; vika64; user1673094; +3 Ответить
19. vika64 75 27.04.22 16:34 Сейчас в теме
2. acanta 02.05.20 11:02 Сейчас в теме
Оле- подключением к екселю или макросом в готовом екселе собирать файлы в книгу.
3. BARDER 38 02.05.20 11:39 Сейчас в теме
(2) Хорошо бы примерчик)
4. lefthander 02.05.20 11:49 Сейчас в теме
(3) Вот тут можно посмотреть
То о чем вы спросили выглядит так
Лист = Книга.WorkSheets.Add(); //Добавление нового листа в книгу.
6. BARDER 38 02.05.20 12:45 Сейчас в теме
В макетах есть такая фишка: Двоичные данные, может как то закачать шаблон и с ним работать, только не пойму как.

(4) тут мне не понятно как заполнить из имеющихся макетов лист 2 и лист 3.
Процедура ДействияФормыСохранитьВExcel(Кнопка)
	
	диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	диалог.Фильтр = "Файл Excel (*.xls)|*.xls|Файл Excel 2007 (*.xlsx)|*.xlsx";
	
	Если диалог.Выбрать() Тогда
		
		файл = Новый Файл(диалог.ПолноеИмяФайла);
		Если НРЕГ(файл.Расширение) = ".xlsx" Тогда
			ЭлементыФормы.Результат.Записать(диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX)
		Иначе
			ЭлементыФормы.Результат.Записать(диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS)
		КонецЕсли;
		
	КонецЕсли;
	
	Попытка
Эксель= СоздатьОбъект("Excel.Application");
Эксель.Visible = 0;
Исключение


Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
Возврат;

КонецПопытки;
Книга=Эксель.WorkBooks.Open(диалог.ПолноеИмяФайла);

Лист = Книга.WorkSheets.Add();
Лист.Лист = Книга.WorkSheets(2);
Лист.Name = "Образец заполнения";




Попытка
Книга.SaveAs(диалог.ПолноеИмяФайла);
Исключение

Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
Возврат;

КонецПопытки;
КонецПроцедуры
Показать
8. Sanario 27 02.05.20 15:08 Сейчас в теме
(6) Вам же посоветовали - воспользуйтесь добавлением листа. Правда скорее всего придется высчитать высоту таблицы в листе, чтобы правильно определить какие данные на какой лист пойдут
5. acanta 02.05.20 12:02 Сейчас в теме
(3) в екселе есть макрорекордер. Это такая кнопочка, которая записывает все ваши действия в екселе в виде кода. При использовании оле-соединения его придется отредактировать для вызова из 1с как в (4)
11. BARDER 38 03.05.20 18:34 Сейчас в теме
Ребят, подскажите как мне табличный документ полученый сохранить в эксель, не могу инфы найти нигде как сохранять несколько листов.
	диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	диалог.Фильтр = "Файл Excel (*.xls)|*.xls|Файл Excel 2007 (*.xlsx)|*.xlsx";
	
	Если диалог.Выбрать() Тогда
		ТабДокЛист2 = Новый ТабличныйДокумент;
		ТабДок2Лист = ПолучитьВторойЛист();
	Попытка
		Эксель= Новый COMОбъект("Excel.Application");
		Эксель.Visible = 0;
	Исключение
		Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
		Возврат;
	КонецПопытки;
	
	Попытка
		
		Книга = Эксель.WorkBooks.Add();
		Лист = Книга.WorkSheets.Add();
		Лист.Name = "Заказ";
		ЭлементыФормы.Результат.Записать(Лист);
		Лист = Книга.WorkSheets.Add();
		Лист.Name = "Образец заполнения";
		Лист = Книга.WorkSheets(2);
		ТабДок2Лист.Записать(Лист);
	 	Книга.SaveAs(диалог.ПолноеИмяФайла);
	Исключение
		Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
		Возврат;
	КонецПопытки;
	
КонецЕсли;
Показать

Выдает ошибку доступа к ComОбъект на строчке ЭлементыФормы.Результат.Записать(Лист);

Когда один лист нужно было, было проще: ЭлементыФормы.Результат.Записать(диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS);
7. acanta 02.05.20 12:52 Сейчас в теме
Как вариант, контейнер doc файла можно попробовать раззиповать и зазиповть с листами ексель и описанием.
10. BARDER 38 02.05.20 19:50 Сейчас в теме
диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	диалог.Фильтр = "Файл Excel (*.xls)|*.xls|Файл Excel 2007 (*.xlsx)|*.xlsx";
	
	Если диалог.Выбрать() Тогда
		
		файл = Новый Файл(диалог.ПолноеИмяФайла);
		Если НРЕГ(файл.Расширение) = ".xlsx" Тогда
			ЭлементыФормы.Результат.Записать(диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLSX)
		Иначе
			ЭлементыФормы.Результат.Записать(диалог.ПолноеИмяФайла, ТипФайлаТабличногоДокумента.XLS)
		КонецЕсли;
		
	КонецЕсли;
	ТабДокЛист2 = Новый ТабличныйДокумент;
	ТабДок2Лист = ПолучитьВторойЛист();
	Попытка
		Эксель= Новый COMОбъект("Excel.Application");
		Эксель.Visible = 0;
	Исключение
		
		
		Сообщить(ОписаниеОшибки() + " Программа Exсel не установлена на данном компьютере!");
		Возврат;
		
	КонецПопытки;
	Книга=Эксель.WorkBooks.Open(диалог.ПолноеИмяФайла);
	
	Лист = Книга.WorkSheets.Add();
	Лист.Name = "Образец заполнения";
	ТабДокЛист2.Записать(Лист);
	
	
	
	Попытка
		Книга.SaveAs(диалог.ПолноеИмяФайла);
	Исключение
		
		Сообщить(ОписаниеОшибки()+" Файл не сохранен!");
		Возврат;
		
	КонецПопытки;

Показать


Пишет ошибку:
Ошибка при вызове метода контекста (Записать)
ТабДокЛист2.Записать(Лист);
по причине:
Ошибка доступа к файлу 'COMОбъект'

Я что то неправильно сделал?
15. BARDER 38 04.05.20 12:37 Сейчас в теме
Сделал так:
диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	диалог.Фильтр = "Файл Excel (*.xls)|*.xls|Файл Excel 2007 (*.xlsx)|*.xlsx";
	
	Если диалог.Выбрать() Тогда
		
		ТабДок1Лист = ПечатьСчетаЗаказа("Заказ");
		ТабДок2Лист = ПолучитьВторойЛист("ЛистОбразецЗаполнения");
		ТабДок3Лист = ПолучитьВторойЛист("ЛистСправочник");
		ОднаКнига = Новый ПакетОтображаемыхДокументов;
		Элт = ОднаКнига.Состав.Добавить();
		Элт.Наименование = "Заказ";
		Элт.Данные = ПоместитьВоВременноеХранилище(ТабДок1Лист);
		Элт = ОднаКнига.Состав.Добавить();
		Элт.Наименование = "Образец заполнения";
		Элт.Данные = ПоместитьВоВременноеХранилище(ТабДок2Лист);
		Элт = ОднаКнига.Состав.Добавить();
		Элт.Наименование = "Справочники";
		Элт.Данные = ПоместитьВоВременноеХранилище(ТабДок3Лист);
		ОднаКнига.Записать(диалог.ПолноеИмяФайла, ТипФайлаПакетаОтображаемыхДокументов.XLSX);
                КонецЕсли;
Показать

Теперь новая проблема, 3 лист у меня идет с группировками, а сохраняет безгруппировок
Функция получения макета такая:
Функция ПолучитьВторойЛист(НаименованиеМакета)
	ТабДокумент = Новый ТабличныйДокумент;
	Макет = ПолучитьМакет(НаименованиеМакета);
	ОблЗаголовок = Макет.ПолучитьОбласть("Макет");
	ОблЗаголовок.НачатьАвтогруппировкуСтрок();
	ТабДокумент.Вывести(ОблЗаголовок);
	Возврат ТабДокумент;
КонецФункции
Показать
user1239818; +1 Ответить
16. BARDER 38 06.05.20 09:46 Сейчас в теме
20. Lok`Tar 89 27.02.24 17:03 Сейчас в теме
(16) не уверен актуально или нет, но можно попробовать закрыть автогруппировку после вывода области
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот