Имя: Пароль:
1C
Админ
Не закрывается подключение 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
Ну не говори.
У меня используется для автоматического создания расхода в одной базе что в текущей можно было создавать приход.
Причем все должно быть в реальном времени.
Посему пришло таки юзать ОЛЮ.
Хотя отчеты и всякую хрень я делаю прямыми запросами в удаленные базы.