|
Не закрывается подключение 1Cv7s.exe | ☑ | ||
---|---|---|---|---|
0
SHuRT
22.10.13
✎
15:45
|
Добрый день!
Имеется следующая проблема (семерка, конфигурации самописные). Из одной базы 7.7 подключаемся в другую 7.7: мСоединение = СоздатьОбъект(V77s.Application); //..... Указываем параметры базы ..... Соединяемся = мСоединение.Initialize(мСоединение.RMTrade + Каталог + Пользователь + Пароль + Немонопольный режим + без заставки); Получаем нужные нам данные, все замечательно, закрываем все базы и видим, что 1С больше не запускается, потому что в менеджере задач навечно зависает процесс 1Cv7s.exe, очевидно занятый этим соединением. Само не закрывается, его можно только убить из таск менеджера с последующей реиндексацией базы, к которой обращались. База файловая, то бишь не на скуле, до десятка пользователей, выполняется каждые 2 минуты, работать невозможно(( Подскажите пожалуйста, кто сталкивался, как его правильно программно закрыть? |
|||
1
ЧеловекДуши
22.10.13
✎
15:46
|
(0) мСоединение.ЗавершениеРаботыСеанса(0);
//При этом в БД прописываешь, что нудно выйти без вопросов :) Или //Пишешь... мСоединение = 0; |
|||
2
smaharbA
22.10.13
✎
15:52
|
||||
3
SHuRT
22.10.13
✎
16:59
|
(1) Замечательно работает при подключении в семерку из восьмеры, а из семерки в семерку к сожалению не идет, процесс остается висеть(
Процедуры ЗавершениеРаботыСеанса к сожалению нету - самописное нетиповое все.. Хотел попробовать вырвать из ТиСа, но в глобальном модуле таковой нету.. Может не там ищу или это фишка восьмерочных конфигураций? |
|||
4
SHuRT
22.10.13
✎
17:01
|
(2) Спасибо, но опять же, работает для подключения из восьмерки в семерку, а из семерки в семерку нет( висит процесс и никуда не девается..
|
|||
5
Rie
22.10.13
✎
17:01
|
(3) ЗавершитьРаботуСистемы()?
|
|||
6
varelchik
22.10.13
✎
17:07
|
(5) Для OLE эта процедура не отрабатывается!
|
|||
7
varelchik
22.10.13
✎
17:08
|
а вот ПриНачалеРаботыСистемы() отрабатывает.
|
|||
8
SHuRT
22.10.13
✎
17:09
|
(5) (7) в ТиСе из подобного есть только бесполезная
Процедура ПриЗавершенииРаботыСистемы() Если ПустоеЗначение(глЗначениеПоУмолчанию("НеЗапрашиватьПодтверждениеПриВыходе")) = 1 Тогда Если Вопрос("Закончить работу с программой?", "Да+Нет", 10)="Нет" Тогда СтатусВозврата(0); Возврат; КонецЕсли; КонецЕсли; ОткрытьФормуМодально("Обработка.ТорговоеОборудование", "Отключить"); КонецПроцедуры |
|||
9
SHuRT
22.10.13
✎
17:11
|
Я так понимаю, идеологически соединение, активируемое Initialize'м, должно как-то автоматически закрываться? Ведь у него есть метод инициализации (сам Initialize) а закрытия нету..
|
|||
10
Rie
22.10.13
✎
17:13
|
(9) Идеологически - оно имеет полное право висеть, пока не решит закрыться.
|
|||
11
Джордж1
22.10.13
✎
17:13
|
мСоединение = ""
Было? |
|||
12
Rie
22.10.13
✎
17:15
|
(6) А как вызываешь?
|
|||
13
Rie
22.10.13
✎
17:15
|
(11) _Разрешает_ соединению закрыться.
|
|||
14
ЧессМастер
22.10.13
✎
17:17
|
(0) мСоединение = "";
по идее так |
|||
15
arsik
гуру
22.10.13
✎
17:19
|
что бы соединение нормально закрылось надо все подчиненные оле процессы тоже убить.
|
|||
16
ЧессМастер
22.10.13
✎
17:19
|
ааа еще проще можно
если делаешь запуск ОЛЕ из обработки то для уничтожения объекта ОЛЕ достаточно закрыть связанную с ним форму. то есть делаешь так Форма.Закрыть() и твой экземлпляр ОЛЕ уничтожается |
|||
17
Rie
22.10.13
✎
17:23
|
(16) Не факт.
|
|||
18
Rie
22.10.13
✎
17:26
|
(12) И не только процессы. Хорошо ли, плохо ли, но 7-ка - сильно щепетильна в данном вопросе. Её легко "подвесить", просто не уничтожив созданный объект. (И есть много других способов её "подвесить").
|
|||
19
Rie
22.10.13
✎
17:26
|
(18)->(15)
|
|||
20
Джордж1
22.10.13
✎
17:26
|
(13)еще форму надо закрыть. да?
|
|||
21
Rie
22.10.13
✎
17:29
|
(20) Ещё может много чего быть создано. Пока не будет ясно, что именно - идёт гадание на кофейной гуще.
Она ведь не сразу закрывается. Смотрит, кто есть ху. И постепенно убивает, кого может. А если не может - ждёт. Посмотри через Sysinternals (да или через Диспетчер), как она веселится при закрытии. |
|||
22
SHuRT
22.10.13
✎
17:56
|
(21) да, спасибо, надо искать. На самом деле тут все вообще весело - это мСоединение создается и инициализируется в нескольких десятках функций и процедур, которые вызываю по сути не я, а некая Cleverence Mobile Smarts. При этом сложно определить, в каких местах вообще стоит отрубать ОЛЮ, в каких этого делать не следует.. Думаю, один из перечисленных способов "убийства" подходит, надо просто искать и экспериментировать, в каких местах его нужно "мочить".. В каком-то месте подчиненные процессы явно остаются..
|
|||
23
ЧессМастер
22.10.13
✎
18:00
|
(17) факт
|
|||
24
SHuRT
22.10.13
✎
18:02
|
(23) К сожалению, в моем случае это даже не важно, потому что (22) - никаких форм не открывается в принципе, "все само" и закрывать нечего :)
|
|||
25
Rie
22.10.13
✎
19:01
|
(23) Давай проверим. Создай объект и присвой его переменной глобального модуля.
|
|||
26
smaharbA
22.10.13
✎
19:02
|
(3)
Компьютер="."; Локатор=СоздатьОбъект("wbemscripting.swbemlocator"); Сервис=Локатор.ConnectServer(Компьютер,"root\cimv2"); СпОЛЕ=БазаОле.CreateObject("СписокЗначений"); СпОЛЕ.ДобавитьЗначение(БазаОле.CreateObject("WScript.Shell")); СпОЛЕ.ДобавитьЗначение(БазаОле.CreateObject("Shell.Explorer")); ТестИД=СпОЛЕ.ПолучитьЗначение(1).Exec(""""+СпОЛЕ.ПолучитьЗначение(2).fullname()+""" -Embedding").ProcessID; ТестИД=Формат(ТестИД,"ЧВН=; ЧДЦ=0; ЧГ=0"); Процесс=Сервис.Get("Win32_Process.Handle='"+ТестИД+"'"); ПроцессИДОЛЕ=Формат(Процесс.ParentProcessID,"ЧВН=; ЧДЦ=0; ЧГ=0");; Процесс.Terminate(0); Сервис.Get("Win32_Process.Handle="+ПроцессИДОЛЕ).Terminate(0); |
|||
27
smaharbA
22.10.13
✎
19:03
|
ТестИД=Формат(ТестИД,"ЧВН=; ЧДЦ=0; ЧГ=0");
лишнее ПроцессИДОЛЕ=Формат(Процесс.ParentProcessID,"ЧВН=; ЧДЦ=0; ЧГ=0");; Заменить на ПроцессИДОЛЕ=Процесс.ParentProcessID; |
|||
28
smaharbA
22.10.13
✎
19:04
|
(16) фигня муйня
|
|||
29
GreyK
22.10.13
✎
19:09
|
(0) Нужно обнулить все переменные связанные с оленькиной базой, тогда процесс закроется.
|
|||
30
minele
22.10.13
✎
19:14
|
На этот случай есть еще такая "процедура Попытка" - не пробовал?
|
|||
31
Rie
22.10.13
✎
19:15
|
(30) Ну и каким боком эта "процедура" (которая совсем не процедура) в данном случае?
|
|||
32
ЧессМастер
23.10.13
✎
09:16
|
(28) ну-ну
|
|||
33
varelchik
23.10.13
✎
09:22
|
(25) При чем тута глобальная переменная.
Он же пишет что закрывает все 1С а процесс висит. Тута чет у него невладах с системой. |
|||
34
Rie
23.10.13
✎
09:27
|
(33) _Как_ он "закрывает все 1С"? Через OLE?
Ну так OLE - тупо считает ссылки. И удаляет объекты, у которых после Release образовался 0. А если ссылка сохранилась - то будет её держать до посинения. 1С запускается не как dll, в адресном пространстве хост-процесса, а как процесс, то есть, как "хозяин памяти". |
|||
35
SHuRT
24.10.13
✎
13:14
|
Спасибо всем за советы. Похоже что решение выглядит примерно как
мСоединение.ExecuteBatch("ЗавершитьРаботуСистемы(0)"); мСоединение = ПолучитьПустоеЗначение(); Однако так и не удается найти подвисающий процесс. Но это уже должно быть мои "руки-голова из ж..." |
|||
36
Rie
24.10.13
✎
13:29
|
(35) А попробуй в ПриНачалеРаботыСистемы и ПриЗавершенииРаботыСистемы вставить отладочные сообщения в некий лог-файл.
|
|||
37
varelchik
24.10.13
✎
14:15
|
(36) Зачем в лог?
Достаточно этого: ЗаписьЖурналаРегистрации("Выход"); |
|||
38
varelchik
24.10.13
✎
14:16
|
со 100% уверенностью утверждаю
при использовании ОЛИ ПриЗавершенииРаботыСистемы() не вызывается! |
|||
39
varelchik
24.10.13
✎
14:21
|
(0)и вообще я же сказал это не базе проблема а в винде или 1С.
|
|||
40
varelchik
24.10.13
✎
14:22
|
(0) для начала спробуй переустановить 1С.
|
|||
41
varelchik
24.10.13
✎
14:23
|
вот токо щас спробовал, все красиво запускается и закрывается.
ничего не подвисает. |
|||
42
varelchik
24.10.13
✎
14:24
|
во.
еще момент. что пишет по этому пользователю журнал регистрации удаленной базы? Должен быть вход и выход. |
|||
43
varelchik
24.10.13
✎
14:25
|
а вот это
мСоединение.ExecuteBatch("ЗавершитьРаботуСистемы(0)"); мертвому припарка. |
|||
44
smaharbA
24.10.13
✎
16:00
|
(38) вызывается, еще как вызывается.
|
|||
45
varelchik
24.10.13
✎
16:17
|
Вставь в нее ЗаписьЖурналарегистрации()
и посмотри что будет. факт выхода фиксируется а заверщенияработыситемы() фиг! |
|||
46
smaharbA
24.10.13
✎
16:25
|
(45) вставь туда Предупреждение и посмотри
|
|||
47
Ёпрст
24.10.13
✎
16:25
|
(38)еще как вызывается
|
|||
48
Ёпрст
24.10.13
✎
16:26
|
+46 или еще проще - выведи на экран процесс, запущеный по оле и хоть в сообщить пиши
|
|||
49
varelchik
24.10.13
✎
16:57
|
да нехрена оно туда незаходит.
|
|||
50
Ёпрст
24.10.13
✎
17:42
|
(49) мне не в падлу я проверил,
усё заходит : в поделке ОЛЕ.ExecuteBatch("ЗавершитьРаботуСистемы(0)"); в базе Процедура ПриЗавершенииРаботыСистемы() ЗаписьЖурналаРегистрации("Вася "+ТекущееВремя()); КонецПроцедуры |
|||
51
varelchik
24.10.13
✎
17:43
|
А
|
|||
52
Ёпрст
24.10.13
✎
17:44
|
А ?
|
|||
53
varelchik
24.10.13
✎
17:45
|
не.
мы просто друг друга не поняли. я имел ввиду что когда этого не делать ОЛЕ.ExecuteBatch("ЗавершитьРаботуСистемы(0)"); от при уничтожениии ОЛЕ данныя процедура не вызывается. |
|||
54
Ёпрст
24.10.13
✎
17:45
|
и даже предупреждение воткнул и через шоу1с посмотрел на окошко в оле базе..
|
|||
55
Ёпрст
24.10.13
✎
17:45
|
дык (43) ..
|
|||
56
Ёпрст
24.10.13
✎
17:45
|
:)
|
|||
57
Ёпрст
24.10.13
✎
17:47
|
(53) и так тоже срабатывает
|
|||
58
Ёпрст
24.10.13
✎
17:47
|
воткни предупреждение и любуйся окошком..
|
|||
59
varelchik
24.10.13
✎
17:48
|
т.е.
Путь=СокрЛП(глВернутьПараметрСтрПоКоду("ПутьКТере")); База=СоздатьОбъект("v77.Application"); Состояние("Подключение к базе: "+Путь); стат=База.Initialize(База.RMTrade, "/D"""+Путь+""" /NАгент /P123","NO_SPLASH_SHOW"); Если стат=0 Тогда Сообщить("Ошибка"); //Возврат 0; КонецЕсли; База.ExecuteBatch("Предупреждение(""Куку"")"); делает все как надо. при старте 1.фиксирует в журнале вход 2.отрабатывает ПриНачалеРаботыСистемы() 3.незаходит в ПриЗавершенииРаботыСистемы() 4.фиксирует в журнале выход пользователя |
|||
60
varelchik
24.10.13
✎
17:49
|
Ну Куку конечно выдает.
|
|||
61
Ёпрст
24.10.13
✎
17:50
|
а и ладно, оле дин хрен в топку..
|
|||
62
varelchik
24.10.13
✎
17:54
|
Ну не говори.
У меня используется для автоматического создания расхода в одной базе что в текущей можно было создавать приход. Причем все должно быть в реальном времени. Посему пришло таки юзать ОЛЮ. Хотя отчеты и всякую хрень я делаю прямыми запросами в удаленные базы. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |