Вход | Регистрация

1С:Предприятие ::

Метки: 

Не получается убить процесс Excel из 1С

Я
   marshalbratsk
 
23.10.17 - 04:24
Не получается убить процесс из 1С. Перепробовал уже всякие способы, инфа, которую находил не помогает. Кажется, что проблема в том, что файл создаётся новый, сохраняется через SaveAs и поэтому может быть не удаляется.
Код:
 
        Эксель = Новый COMОбъект("Excel.Application"); 
          
        Книга = Эксель.WorkBooks.Add();
        Лист = Книга.WorkSheets(1); 
    //    Лист = Книга.Sheets.Add(); 

        
        КоличествоКолонок = ТаблицаРезультата.Колонки.Количество();
        КоличествоСтрок = ТаблицаРезультата.Количество();
        
        Для Инд=1 по КоличествоКолонок Цикл
            Лист.Cells(1, Инд).Value = ТаблицаРезультата.Колонки[Инд-1].Заголовок;
        КонецЦикла;
        
        МассивКом = Новый COMSafeArray("VT_VARIANT",КоличествоКолонок,КоличествоСтрок);
        
        Для индСтрок = 0 по КоличествоСтрок - 1 Цикл
            СтрокаТаблицы = ТаблицаРезультата[индСтрок];
            Для индКолонок = 0 по КоличествоКолонок - 1 Цикл
                МассивКом.SetValue(индКолонок, индСтрок, ?(ТипЗнч(СтрокаТаблицы[индКолонок])=Тип("Дата"),Строка(СтрокаТаблицы[индКолонок]),СтрокаТаблицы[индКолонок]));
            КонецЦикла;
        КонецЦикла;
        КонецДиапазона=КоличествоСтрок+1;
        
        Лист.Range(Лист.Cells(2,1), Лист.Cells(КонецДиапазона,КоличествоКолонок)).Value = МассивКом;
        Лист.Rows("2:"+Формат(КонецДиапазона, "ЧГ=")).RowHeight = 12;
            
        Попытка
            Книга.SaveAs(Путь_SRC_OUT_PAYMENT); 
        Исключение
            Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); 
        КонецПопытки;
        
        
        Книга.Save();
        Эксель.DisplayAlerts = 0;
        Эксель.ActiveWorkbook.Close(1);
    //    Эксель.Application.Quit();

        Эксель.Quit();
        Эксель = 0;
 
 
   marshalbratsk
 
1 - 23.10.17 - 06:02
Путь:
Путь_SRC_OUT_PAYMENT = "C:\SRC_OUT_PAYMENT_"+Формат(Период, "ДФ=dd_MM_yyyy_HH_mm")+".xls";
   marshalbratsk
 
2 - 23.10.17 - 06:31
Почему-то процесс не уходил до возврата функции. Не могу понять в чём причина. В итоге процесс ушёл, использовал следующую конструкцию

        Эксель.DisplayAlerts = 0;
        Эксель.Application.Quit();
        Эксель = Неопределено;
   Масянька
 
3 - 23.10.17 - 08:28
(0)
Книга.Close(); - закрывает текущий файл.
Эксель.Quit(); - закрывает приложение.
   v77
 
4 - 23.10.17 - 09:17
Может так попробовать?
Лист = Неопределено;
Книга = Неопределено;
Эксель.Application.Quit();
Эксель = Неопределено;
   vde69
 
5 - 23.10.17 - 09:22
http://catalog.mista.ru/public/57401/

// функция устанавливает связь с EXCEL

// в качестве параметра требуется имя открываемого файла
// в случае удачи возвращает соответствие из обьектов ОЛЕ, в случае не удачи - неопределено

Функция   EXCELУстановитьСвязь (ИмяФайла)Экспорт
    
    Результат = Неопределено;
    #Если Клиент Тогда

        Состояние("Идет установка связи, ждите.....");
    #КонецЕсли

    
    Попытка
        Результат = Новый Соответствие();
        
        BaseOLE = Новый COMОбъект("Excel.Application");
        Результат.Вставить("EXCEL", BaseOLE);
        
        ExcelФайл = BaseOLE.WorkBooks.Open (ИмяФайла);
        Результат.Вставить("ExcelФайл", ExcelФайл);
                                
        МассивЛистов = Новый Массив();
        КоличествоЛистов = ExcelФайл.Sheets.Count;
        Для е = 1 по КоличествоЛистов Цикл
            МассивЛистов.Добавить(ExcelФайл.Sheets(е));            
        КонецЦикла;
        
        Результат.Вставить("Листы", МассивЛистов);

    Исключение
        Результат = Неопределено;
        #Если Клиент Тогда

            Сообщить("Ошибка создания обьекта Microsoft Excel" + ОписаниеОшибки());
        #КонецЕсли

    КонецПопытки;
    
    Возврат Результат;
КонецФункции

// функция разрывает связь с 1с 7.7

// в качестве параметра требуеться структура созданая при установке соединения 
Процедура EXCELРазорватьСвязь (Соответстие) Экспорт
    Попытка
        Соответстие["EXCEL"].DisplayAlerts = 0;
        Соответстие["ExcelФайл"].Close();
        Соответстие["EXCEL"].DisplayAlerts = 1;
        Соответстие["EXCEL"].Quit(); 
        Соответстие["EXCEL"] = Неопределено;
    Исключение
        #Если Клиент Тогда

            Сообщить(ОписаниеОшибки());
        #КонецЕсли

    КонецПопытки;                  
КонецПроцедуры


// функция получает данные ячейки и возвращаеть структуру соответствий, или неопределено в случае неудачи

//
// В любом случае возвращаем соостветствие "Значение" и "ЭтоФормула", остальное по флагам

//
Функция EXCELПолучитьЗначениеЯчейки (ExcelЛист, НомерСтроки, НомерКолонки, ПолучатьТекстФормулы = ложь, ПолучатьОформление = ложь) 
    Результат = Новый Соответствие();
    
    Попытка
        ТекущееЗначениеФормулы = ExcelЛист.Cells(НомерСтроки, НомерКолонки).Formula;
        Если ТекущееЗначениеФормулы <> "" Тогда
            Если Лев(ТекущееЗначениеФормулы, 1) <> "=" Тогда 
                Результат.Вставить("ЭтоФормула", Ложь);
                Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
            Иначе
                Результат.Вставить("ЭтоФормула", Истина);
                Если Лев(СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).text),1) = "#" Тогда 

                    Результат.Вставить("ЗначениеЯчейки", Неопределено);
                Иначе
                    Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
                КонецЕсли;

                Если ПолучатьТекстФормулы Тогда  
                    Результат.Вставить("ТекстФормулы", СокрЛП(ТекущееЗначениеФормулы));
                КонецЕсли;
            КонецЕсли; 
        Иначе
            Результат.Вставить("ЭтоФормула", Ложь);
            Результат.Вставить("ЗначениеЯчейки", ExcelЛист.Cells(НомерСтроки, НомерКолонки).value);
        КонецЕсли;    
        
        Если ПолучатьОформление Тогда
            Результат.Вставить("ЦветЯчейки", СокрЛП(ExcelЛист.Cells(НомерСтроки, НомерКолонки).Interior.ColorIndex));
            // здесь можно добавить и другие....

        КонецЕсли;
        
    Исключение
        Результат = Неопределено;
    КонецПопытки;
    
    Возврат Результат;
КонецФункции

// функция получает данные ячейки и значение

//
// В любом случае возвращаем соостветствие "Значение" и "ЭтоФормула", остальное по флагам

//
Функция EXCELПолучитьЗначениеЯчейки2 (ExcelЛист, НомерСтроки, НомерКолонки) 
    Результат = EXCELПолучитьЗначениеЯчейки (ExcelЛист, НомерСтроки, НомерКолонки);
    
    Если Результат = Неопределено Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Возврат Результат["ЗначениеЯчейки"];
КонецФункции


//

// пример использования:
//



// будем подключаться

СоответстиеЗагрузки = EXCELУстановитьСвязь (ТекущийФайл.ПолноеИмя);
        
Если СоответстиеЗагрузки = Неопределено тогда
    Возврат;
КонецЕсли;
        
Для каждого ТекущаяСтраница из СоответстиеЗагрузки["Листы"] Цикл
    ЗначениеX1Y1 = EXCELПолучитьЗначениеЯчейки2 (ТекущаяСтраница, 1, 1);
КонецЦикла;

// теперь отключаемся...

EXCEL_РазорватьСвязь (СоответстиеЗагрузки);
   Fedor-1971
 
6 - 23.10.17 - 09:22
(0) вот это: Книга.Save(); - оставит вопрос "Записать(перезаписать): да / нет?" - и все попытки  закрыть эксель ни к чему не приведут.
По памяти: Книга.Save(1); т.е. записывать без вопросов, почитай в инете какие параметры у записи есть


Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует