![]() |
![]() |
![]() |
|
Как убить процесс 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) вот и разберись - почему у тебя глючит.
а то придумал себе проблему... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |