1С + Excel (печатная форма)

1. deutsch2008 07.12.17 21:10 Сейчас в теме +1 $m
Всем, привет! 1С 8.3 УТП. Типа сделал печную форму для документа "Договор". При формировании печатной формы по непонятным мне причинам открываются 3 Excel файла, а потом выдает ошибку!!!

{Документ.Договор.Форма.ФормаДокумента.Форма(2757)}: Ошибка при вызове метода контекста (Windows)
Книга.Windows(1).Visible = 1;
по причине:
Произошла исключительная ситуация (0x8002000b)

Но! Если у меня будет открыт какой-либо файл Excel на компьютере Тогда печатная форма сформируется без проблем без ошибок!

Исходный код простой

// Доп. соглашение (Добавление, Изменение программы ЗЛ) 
Процедура ОсновныеДействияФормыДействие4(Кнопка)
	
	Макет  = ПолучитьМакет("ДопСоглашенияДобИзменПрогрЗЛ");	 
	Книга  = Макет.Получить(); 	 
	Лист   = Книга.WorkSheets(1);
	
	
	Лист.Cells.Replace("[Дата]",      				Строка(Формат(Дата,"ДЛФ=DD")));
	Лист.Cells.Replace("[Номер]",      				Строка(Формат(Номер,"ДЛФ=DD")));
	Лист.Cells.Replace("[НомерКарты]",      		Строка(НомерКарты));
	Лист.Cells.Replace("[Контрагент]",      		        Строка(Контрагент.Наименование));
	Лист.Cells.Replace("[ДатаРождения]",  		Строка(Контрагент.ДатаРождения));
	Лист.Cells.Replace("[Адрес1]",					Строка(УправлениеКонтактнойИнформацией.ПолучитьАдресИзКонтактнойИнформации(Контрагент)));
	Лист.Cells.Replace("[Телефон]",					Строка(УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(Контрагент)));
	Лист.Cells.Replace("[ИНН]",      				Строка(Контрагент.ИНН));
	Лист.Cells.Replace("[ПрограммаСтрахования]",  Строка(ПрограммаСтрахования));
	Лист.Cells.Replace("[СтраховаяСумма]",  		Число(Сумма));
	Лист.Cells.Replace("[Премия]",  				Число(Премия));	
	
	Книга.Application.Visible = 1;
	Книга.Windows(1).Visible = 1;
	Книга.Activate();
КонецПроцедуры

Показать
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. YanTsys 12 07.12.17 22:02 Сейчас в теме
А так можно?
Там разве не должно быть чего-то такого:

Excel = Новый COMОбъект("Excel.Application");
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДвоичныеДанные = ПолучитьМакет("ДопСоглашенияДобИзменПрогрЗЛ");
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Книга = Excel.WorkBooks.Open(ИмяВременногоФайла);
Лист = Книга.WorkSheets(1);
3. vano-ekt 124 07.12.17 22:04 Сейчас в теме
ТемпФайл = ПолучитьИмяВременногоФайла("xlsx");
	ДД = ПолучитьМакет("ДопСоглашенияДобИзменПрогрЗЛ");
	ДД.Записать(ТемпФайл);
	
	Excel = Новый COMОбъект("Excel.Application");
	Excel.Visible = true;
	Попытка
		WorkBook = Excel.WorkBooks.Open(ТемпФайл);
		
		Лист = WorkBook.Sheets(1);
		Лист.Cells.Replace("[Дата]",                      Строка(Формат(Дата,"ДЛФ=DD")));
		Лист.Cells.Replace("[Номер]",                      Строка(Формат(Номер,"ДЛФ=DD")));
		Лист.Cells.Replace("[НомерКарты]",              Строка(НомерКарты));
		Лист.Cells.Replace("[Контрагент]",                      Строка(Контрагент.Наименование));
		Лист.Cells.Replace("[ДатаРождения]",          Строка(Контрагент.ДатаРождения));
		Лист.Cells.Replace("[Адрес1]",                    Строка(УправлениеКонтактнойИнформацией.ПолучитьАдресИзКонтактнойИнформации(Контрагент)));
		Лист.Cells.Replace("[Телефон]",                    Строка(УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(Контрагент)));
		Лист.Cells.Replace("[ИНН]",                      Строка(Контрагент.ИНН));
		Лист.Cells.Replace("[ПрограммаСтрахования]",  Строка(ПрограммаСтрахования));
		Лист.Cells.Replace("[СтраховаяСумма]",          Число(Сумма));
		Лист.Cells.Replace("[Премия]",                  Число(Премия));    
	Исключение
	КонецПопытки;
	
	WorkBook.Application.Visible = 1;
	WorkBook.Windows(1).Visible = 1;
	
	Excel.WindowState = -4140;
	Excel.WindowState = -4137;
Показать
5. Aitbay 08.12.17 06:41 Сейчас в теме
с вордом работаю вот так без проблем

Функция ПолучитьШаблонMSWord()
	Макет = ПолучитьМакет("Макет");
	MSWord = Макет.Получить(); 
	Попытка
		Документ = MSWord.Application.Documents(1);
		MSWord.Activate();
	Исключение
		Сообщить(ОписаниеОшибки());
		MSWord.Application.Quit();
	КонецПопытки;
	Возврат MSWord;
КонецФункции // ПолучитьШаблонMSWord()
Показать

в коде
Шаблон = ПолучитьШаблонMSWord();
		Шаблон.Variables("Номер").Value = СокрЛП(СсылкаНаОбъект.Номер);
		Шаблон.Variables("Город").Value = СокрЛП(Город);
		Шаблон.Variables("ДатаДок").Value = Формат(Стр.ДатаНачала,"ДФ=dd.MM.yyyy");

и т.д.
и в итоге
Шаблон.Fields.UpDate();
		Шаблон.ActiveWindow.View.ShowFieldCodes = False;
		Шаблон.Application.Visible = Истина;
Шаблон.Application.Quit();
9. deutsch2008 08.12.17 10:46 Сейчас в теме
(5) Так у меня не Word а Eccel
10. sssss_aaaaa_2011 08.12.17 10:50 Сейчас в теме
(1)
Книга.Application.Visible = 1;
Книга.Windows(1).Visible = 1;
Почему 1, а не Истина? Что за Windows? Каким он тут боком? Зачем?
11. Абушев 135 08.12.17 11:23 Сейчас в теме
(1) А если так?

Макет  = ПолучитьМакет("ДопСоглашенияДобИзменПрогрЗЛ");     
    Книга  = Макет.Получить();      
    Лист   = Книга.WorkSheets(1);
    
    
    Лист.Cells.Replace("[Дата]",                      Строка(Формат(Дата,"ДЛФ=DD")));
    Лист.Cells.Replace("[Номер]",                      Строка(Формат(Номер,"ДЛФ=DD")));
    Лист.Cells.Replace("[НомерКарты]",              Строка(НомерКарты));
    Лист.Cells.Replace("[Контрагент]",                      Строка(Контрагент.Наименование));
    Лист.Cells.Replace("[ДатаРождения]",          Строка(Контрагент.ДатаРождения));
    Лист.Cells.Replace("[Адрес1]",                    Строка(УправлениеКонтактнойИнформацией.ПолучитьАдресИзКонтактнойИнформации(Контрагент)));
    Лист.Cells.Replace("[Телефон]",                    Строка(УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(Контрагент)));
    Лист.Cells.Replace("[ИНН]",                      Строка(Контрагент.ИНН));
    Лист.Cells.Replace("[ПрограммаСтрахования]",  Строка(ПрограммаСтрахования));
    Лист.Cells.Replace("[СтраховаяСумма]",          Число(Сумма));
    Лист.Cells.Replace("[Премия]",                  Число(Премия));    
    
    Книга.Application.Visible = 1;
   
   Книга.Application.Workbooks(1).Activate();

    Книга.Windows(1).Visible = 1;
    Книга.Activate();
КонецПроцедуры

Показать
13. sandybaev 203 08.12.17 12:07 Сейчас в теме
Николай, можно так,

ну, один из очередных примеров скажем так,


У тебя есть Таб часть документа, выгрузи ее в ТаблицуЗначений, далее:

   
     
       ТабДок = Новый ТабличныйДокумент;
        
        Построитель = Новый ПостроительОтчета();
        
        Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТвояТаблицаЗначений);
        Построитель.ВыводитьЗаголовокОтчета = Ложь;
        Построитель.Вывести(ТабДок );
        
        ТабДок.Записать("C:\ФайлРезультат" + ".xlsx",ТипФайлаТабличногоДокумента.XLSX);
        //Допустим что имя файла: ФайлРезультат.xlsx        

Показать


далее, просто:

    
ЗапуститьПриложение("C:\ФайлРезультат.xlsx");



Зуб даю, не будет трех копий Excell-ля :))))
14. Vafla 08.12.17 15:38 Сейчас в теме
Ошибка на строке "Книга.Windows(1).Visible = 1;" судя по всему возникает, т.к. ещё нет открытых окон с Excel, а окну №1 уже присваивается видимость. Как-то так
15. Merc 40 11.12.17 08:10 Сейчас в теме
(1) Сорян, что делать с activex - не знаю, просто не надо так 8)

держи вариант с минимальными изменениями логики:
	ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xls");
	
	Макет  = ПолучитьМакет("Макет");
	Книга  = Макет.Получить(); 
	Лист   = Книга.WorkSheets(1);
	
	Лист.Cells.Replace("[Номер]", "123");
		
	Книга.SaveAs(ИмяВременногоФайла);
	Книга.Close();

	// если сильно хочется, открой через ком
	
    ЗапуститьПриложение(ИмяВременногоФайла);
Показать
16. obsfromekb 31 15.12.17 13:13 Сейчас в теме
(1) Попробуйте так:
// Доп. соглашение (Добавление, Изменение программы ЗЛ) 
Процедура ОсновныеДействияФормыДействие4(Кнопка)
    
    Макет  = ПолучитьМакет("ДопСоглашенияДобИзменПрогрЗЛ");     
    Книга  = Макет.Получить();      
    Лист   = Книга.WorkSheets(1);
    
    
    Лист.Cells.Replace("[Дата]",                      Строка(Формат(Дата,"ДЛФ=DD")));
    Лист.Cells.Replace("[Номер]",                      Строка(Формат(Номер,"ДЛФ=DD")));
    Лист.Cells.Replace("[НомерКарты]",              Строка(НомерКарты));
    Лист.Cells.Replace("[Контрагент]",                      Строка(Контрагент.Наименование));
    Лист.Cells.Replace("[ДатаРождения]",          Строка(Контрагент.ДатаРождения));
    Лист.Cells.Replace("[Адрес1]",                    Строка(УправлениеКонтактнойИнформацией.ПолучитьАдресИзКонтактнойИнформации(Контрагент)));
    Лист.Cells.Replace("[Телефон]",                    Строка(УправлениеКонтактнойИнформацией.ПолучитьТелефонИзКонтактнойИнформации(Контрагент)));
    Лист.Cells.Replace("[ИНН]",                      Строка(Контрагент.ИНН));
    Лист.Cells.Replace("[ПрограммаСтрахования]",  Строка(ПрограммаСтрахования));
    Лист.Cells.Replace("[СтраховаяСумма]",          Число(Сумма));
    Лист.Cells.Replace("[Премия]",                  Число(Премия));    
    
    Книга.Activate(); // сначала активируем
    //Книга.Application.Visible = 1;
    Книга.Windows(1).Visible = 1;
КонецПроцедуры
Показать
4. deutsch2008 07.12.17 22:11 Сейчас в теме +0.43 $m
Забыл уточнить! Тип макета у меня - "Active Document"
6. Vafla 08.12.17 10:27 Сейчас в теме
А как это должно работать?

Документ Excel в конце должен быть открыт? Должен быть записан?
8. deutsch2008 08.12.17 10:29 Сейчас в теме
7. Vafla 08.12.17 10:29 Сейчас в теме
12. Vafla 08.12.17 11:25 Сейчас в теме
Если нужно открыть не сохранённый Excel-файл, то:
EXCELApplication = Новый COMОбъект("Excel.Application");
EXCELApplication.Workbooks.Add();

Лист = EXCELApplication.ActiveSheet;

Лист.Cells.Replace...
...

EXCELApplication.Visible = Истина;
EXCELApplication.Application.Quit();//Система предложит сохранить файл перед закрытием. Вероятно, от этого не избавиться, пока документ не сохранён.
Показать


Лучше сделать так:
EXCELApplication = Новый COMОбъект("Excel.Application");
EXCELApplication.Workbooks.Add();

Лист = EXCELApplication.ActiveSheet;

Лист.Cells.Replace...
...

EXCELApplication.ActiveWorkbook.SaveAs(ИмяФайлаExcel);
EXCELApplication.ActiveWorkbook.Close(0);

EXCELApplication.Application.Quit();

ЗапуститьПриложение(ИмяФайлаExcel);
Показать


А ещё можно создать табличный документ, сохранить как Excel и открыть методом "ЗапуститьПриложение(ИмяФайлаExcel)"
17. пользователь 15.12.17 17:54
Сообщение было скрыто модератором.
...
18. bluntschi 03.11.23 16:04 Сейчас в теме
привет, у кого-нибудь получилось решить это?
та же самая ошибка, когда открыт Excel - открывает, закрыт - сворачивает, переменную добавляла в глобальные не помогло
Оставьте свое сообщение

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