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

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

Лист = Неопределено;
Книга = Неопределено;
Эксель.Application.Quit();
Эксель = Неопределено;
5 vde69
 
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_РазорватьСвязь (СоответстиеЗагрузки);
6 Fedor-1971
 
23.10.17
09:22
(0) вот это: Книга.Save(); - оставит вопрос "Записать(перезаписать): да / нет?" - и все попытки  закрыть эксель ни к чему не приведут.
По памяти: Книга.Save(1); т.е. записывать без вопросов, почитай в инете какие параметры у записи есть
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан