Имя: Пароль:
1C
 
Как убить процесс Excel?
0 Domovoi
 
29.08.10
22:11
Произвожу загрузку данных из Excel в базу, используя схему.
Попытка
   Excel = Новый COMОбъект("Excel.Application");
Исключение
   Предупреждение("Не удалось инициализировать MS Excel.");
   Возврат;
КонецПопытки;
Попытка
   //ПроизврдитсяЗагрузка...
Исключение
   Excel.Application.Quit();
КонецПопытки

При этом если вылазит ошибка при загрузке, то процесс Excel не убивается, что делать?
1 aka AMIGO
 
29.08.10
22:17
ты уверен, что при ошибке загрузки ты попадешь в исключение?
2 aka AMIGO
 
29.08.10
22:23
+1 при ошибке процесса диалог обработки доступен?
3 Domovoi
 
29.08.10
22:34
(1)Да попадаю. Вроде Попытка исключение без глюков)
(2)Всмысле доступен?
4 aka AMIGO
 
29.08.10
23:09
(3) если прога сама не подвисает, можно попробовать бредовую идею: объявить переменную Excel общей, и нажать кнопку, обнуляющую эту переменную..

если это из категории бреда - тогда остается одно: выйти/зайти снова в 1С :)

ладно, не обращай внимания, завтра тебе точный рецепт дадут..
у меня висло раз с 1000, пока в режим вгоню.. перезагруз 1С помогал :)
5 Джордж1
 
29.08.10
23:09
Excel="" сделай
6 Domovoi
 
29.08.10
23:52
Я делал Excel = 0 не помогало но попробую
7 Domovoi
 
29.08.10
23:59
Прошу прощения.
(1)Действительно когда попадает туда все норм. Я делаю прерывание и в исключение не попадаю, поэтому и остается процесс.
8 Domovoi
 
30.08.10
00:01
А как тогда после или при выполнии прцедуры
ОбработкаПрерыванияПользователя()
Вырубить процесс Excel?
9 smaharbA
 
30.08.10
07:15
снова создай объект или получи объект и куит
10 Domovoi
 
30.08.10
14:59
(9)Куда вписывать удаление объекта?
11 le_
 
30.08.10
15:03
cmd /k taskkill /?
12 Domovoi
 
30.08.10
15:12
Да как удалить процесс я знаю куда написать чтоб сработало?
13 BuHu
 
30.08.10
15:12
+(11)  либо так либо через диспетчер задач
14 Domovoi
 
30.08.10
15:14
Оригинально мне пользоваетлю так и написать, после завершения работы обработки посмотрите не весит ли в процессах Excel и если висит то удалите)))
15 Blast
 
30.08.10
15:17
(0) Я обычно пишу Excel.Quit() - и всегда все нормально отрабатывает.
Попробуй написать так вместо Excel.Application.Quit();
16 Domovoi
 
30.08.10
15:19
Вы ветку читаете? Я знаю как вырубить, процесс куда это написать, если пользователь прерывает Ctrk+PauseBreak?

Попытка
   Excel = Новый COMОбъект("Excel.Application");
Исключение
   Предупреждение("Не удалось инициализировать MS Excel.");
   Возврат;
КонецПопытки;
Попытка
   //ПроизврдитсяЗагрузка...
   ОбработкаПрерыванияПользователя()  
Исключение
   Excel.Application.Quit();
КонецПопытки
17 Torquader
 
30.08.10
15:19
Excel.ActiveWorkbook.Close(-1,);// закрываем активную книгу
Excel.Quit();// завершаем процесс Excel
Excel=0;

также не забываем, что в случае изменения какой-то книги "умная" Excel задаст пользователю вопрос "А не сохранить ли то, что он отрыл".
18 Torquader
 
30.08.10
15:20
(16) Не стоит забывать, что в случае удачной попытки загрузки то, что написано в Исключении не выполнится.
То есть надо так:

Попытка
   Excel = Новый COMОбъект("Excel.Application");
Исключение
   Предупреждение("Не удалось инициализировать MS Excel.");
   Возврат;
КонецПопытки;
Попытка
   //ПроизврдитсяЗагрузка...
   ОбработкаПрерыванияПользователя()  
   Excel.Application.Quit();// не забываем, что мы должны его закрыть
Исключение
   Excel.Application.Quit();
КонецПопытки
19 le_
 
30.08.10
15:21
(16)
Объясни плиз, для чего такая конструкция нужна:
Попытка
   //ПроизврдитсяЗагрузка...
   ОбработкаПрерыванияПользователя()  
Исключение

?
20 Domovoi
 
30.08.10
15:21
(19)А как по другому?
(18)Попробую
21 le_
 
30.08.10
15:23
(20) Что по-другому?
Для чего ты это написал-то?

Для чего обработка прерывания пользователя стоит в попытке?
22 Blast
 
30.08.10
15:24
+(17)
в случае изменения какой-то книги "умная" Excel задаст пользователю вопрос "А не сохранить ли то, что он отрыл"

Чтобы Excel не запрашивал подтверждения, сразу после создания объекта прописать

Excel.DisplayAlerts = 0;
23 Domovoi
 
30.08.10
15:25
(21)Блин даже не знаю как ответить. Ну если вдруг обработка покажет что загрузка будет происходить 2 часа, то у пользователя должна быть возможность прервать загрузку.
24 le_
 
30.08.10
15:26
(23) Ну а в попытке-то зачем?
И вообще, у тебя создание объектов Excel в цикле происходит?
Для чего там вообще ОбработкаПрерыванияПользователя()?
25 Torquader
 
30.08.10
15:28
(22) Это очень жестоко, так как при закрытии Excel мы ещё и закроем все документы, которые пользователь открыл между делом, и, если вопросов не будет - то пользователь потом долго будет задавать вопрос - а куда делись мои данные.
И закрывать Excel имеет смысл только если Excel.Workbooks.Count=1, если оно больше единицы, то нужно сделать только Excel.ActiveWorkbook.Close, чтобы закрыть нашу чудо книгу, а остальные оставить как есть.
26 Blast
 
30.08.10
15:30
(23) Кстати говоря, если предполагается загрузка большого объема данных, то лучше будет оформить это в транзакции - и выполняться будет быстрее и в случае исключительной ситуации изменения можно будет или принять или сделать откат.
(25) Согласен, но я предполагал, что во время загрузки не будут открыты другие книги Excel
27 Torquader
 
30.08.10
15:30
(23) Только прервать загрузку уже после её выполнения - не очень разумно.
28 Domovoi
 
30.08.10
15:31
(24)Во правильно сейчас допишу еще код. И тогда пример в (18) будет неподходящим.
Попытка                                            
   Excel = Новый COMОбъект("Excel.Application");
Исключение
   Предупреждение("Не удалось инициализировать MS Excel.");
   Возврат;
КонецПопытки;
Попытка
   //ПроизврдитсяЗагрузка...  
   Для н=НачСтр По КонСтр Цикл    
       //производится считывание строк из Excel и запись элементов...
       ОбработкаПрерыванияПользователя()  
   КонецЦикла;
Исключение
   Excel.Application.Quit();
КонецПопытки

Все что дополнитеотно пишете, большое спасибо, зарание предусмотрю, но проблема остается открытой.
29 Torquader
 
30.08.10
15:32
(26) Лучше сделать сразу правильно - и, в случае открытия других книг нужно сказать пользователю, что их лучше закрыть, иначе возможна ситуация, когда пользователь, запустив загрузку, продолжить работать с Excel, что может привести к разного рода "забавным" ситуациям.
30 Domovoi
 
30.08.10
15:35
+(28)Пользователь решит что ему сейчас нет столько времени на рату загрузки и захочет вырубить, нажмет Ctrl+Break и надо чтоб программа если нужно будет(как выяснилось в ходе ветки) вырубила Excel.
31 1CLama
 
30.08.10
15:39
Попытка
       Excel = Новый COMОбъект("Excel.Application");
   Исключение
       Сообщить("Не удалось инициализировать Excel");
       Возврат;
   КонецПопытки;
   
   ЗагрузкаТаблицыИзЭксель(Excel);
   
   Если Excel <> Null Тогда
       Excel.Quit();
       Excel = Null;
   КонецЕсли;
32 Domovoi
 
30.08.10
15:40
+(30)Если есть процедура обращения к Винде, то впринципе можно организовать перехват клавишь, если он есть в 1с, и самому вырубить.
33 le_
 
30.08.10
15:44
//можно сделать так:
Перем ПрерваноПользователем;
Перем Excel;

Процедура ВыполняетсяЗагрузка()
   Если ПрерваноПользователем Тогда
       Excel.Application.Quit();
       Excel = Неопределено;
       ОтключитьОбработчикОжидания("ВыполняетсяЗагрузка");
   КонецЕсли;
КонецПроцедуры

Процедура КнопкаСформироватьНажатие(Кнопка)
   Попытка                                            
       Excel = Новый COMОбъект("Excel.Application");
       ПодключитьОбработчикОжидания("ВыполняетсяЗагрузка", 0.1, Истина);
   Исключение
       Предупреждение("Не удалось инициализировать MS Excel.");
       Возврат;
   КонецПопытки;

   Для н = НачСтр По КонСтр Цикл
       ПрерваноПользователем = Истина;
       ОбработкаПрерыванияПользователя();
       ПрерваноПользователем = Ложь;
   КонецЦикла;
   
   Excel.Application.Quit();
   Excel = Неопределено;
КонецПроцедуры
34 le_
 
30.08.10
15:48
//Перед циклом добавь только еще:
ПрерваноПользователем = Ложь;
//а то ошибку выдаст...
35 Domovoi
 
30.08.10
15:49
(33)(34)Сейчас попробую
36 le_
 
30.08.10
15:53
//И после завершения цикла имеет смысл отключить обработчик ожидания:
ОтключитьОбработчикОжидания("ВыполняетсяЗагрузка");


//ИТОГО:
Перем ПрерваноПользователем;
Перем Excel;

Процедура ВыполняетсяЗагрузка()
   Если ПрерваноПользователем Тогда
       Excel.Application.Quit();
       Excel = Неопределено;
       ОтключитьОбработчикОжидания("ВыполняетсяЗагрузка");
   КонецЕсли;
КонецПроцедуры

Процедура КнопкаСформироватьНажатие(Кнопка)
   Попытка                                            
       Excel = Новый COMОбъект("Excel.Application");
       ПрерваноПользователем = Ложь;
       ПодключитьОбработчикОжидания("ВыполняетсяЗагрузка", 0.1, Истина);
   Исключение
       Предупреждение("Не удалось инициализировать MS Excel.");
       Возврат;
   КонецПопытки;
   
   Для н = НачСтр По КонСтр Цикл
       ПрерваноПользователем = Истина;
       ОбработкаПрерыванияПользователя();
       ПрерваноПользователем = Ложь;
   КонецЦикла;
   
   ОтключитьОбработчикОжидания("ВыполняетсяЗагрузка");
   
   Excel.Application.Quit();
   Excel = Неопределено;
КонецПроцедуры
37 le_
 
30.08.10
16:14
//Еще один ньюанс:  :)
Вот это:
ПодключитьОбработчикОжидания("ВыполняетсяЗагрузка", 0.1, Истина);
//надо заменить на это:
ПодключитьОбработчикОжидания("ВыполняетсяЗагрузка", 0.1, Ложь);
38 Domovoi
 
30.08.10
18:08
(37)Работает спасибо
39 Ковычки
 
30.08.10
18:26
бред какой то
40 Domovoi
 
30.08.10
18:53
(39)В чем бред?
41 NcSteel
 
30.08.10
18:57
(0) Грузи через Ado
42 Ковычки
 
30.08.10
19:05
во всем
43 Domovoi
 
30.08.10
19:15
(42)Конкретнее можно?
44 Domovoi
 
30.08.10
19:15
+(43)Сказать бред во всем = не сказать ничего.
45 FN
 
30.08.10
19:19
мда...
а в 8-ке есть процедура призакрытии()?
вот в этой процедуре и нужно "грохать" объект Excel с соблюдением правила из (25)
46 Domovoi
 
30.08.10
19:22
(45)Но ведь я могу и не закрыть форму, а процесс надо то вырубить.
47 FN
 
30.08.10
19:25
(46) Зачем?
48 Domovoi
 
30.08.10
19:26
(47)Вырубил я процесс. Форму не закрыл. Решил открыть Excel файл, но не смогу потомучто процесс не вырублен.
49 FN
 
30.08.10
19:30
(48) Почему не сможешь? Наоборот - процесс в памяти и его не надо лишний раз запускать.
50 Мимохожий Однако
 
30.08.10
19:33
Поставь обнуление переменной Excel в процедуру ПриЗакрытии() и пусть пользователь закрывает форму
51 Domovoi
 
30.08.10
19:40
(49)Заглючит. По крайней мере у меня не запучкается файл при запущенном процессе Excel, не знаю что он там делает.
(50)Пусть?) А кто должен подстраиваться пользователь под программу или программа под пользователя?)
52 Мимохожий Однако
 
30.08.10
19:41
(51)Пользователь под программу. Вариаций меньше
53 Domovoi
 
30.08.10
19:42
(52)У меня немного другие взгляды на то кто что должен) Поэтому ваш вариант мне не подходит.
54 Ковычки
 
30.08.10
19:43
запускаю сколько надо изолированных процессов екселя - дорого
подключаю к существующему процессу екселя - очень дорого
55 FN
 
30.08.10
19:53
(51) вот и разберись - почему у тебя глючит.
а то придумал себе проблему...
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн