Имя: Пароль:
1C
1С v8
Интервал закрытия сеансов
0 Jokerman
 
28.05.12
09:58
Здравствуйте всем, подскажите плз где выставляется таймаут соединений
Скульная база, платформа 8.2, а то надоело сеансы зависают у некоторых пользователей!
1 Jokerman
 
28.05.12
10:24
УПс
2 Jokerman
 
28.05.12
10:41
Нет или заезженный вопрос?
3 Jokerman
 
28.05.12
10:44
Или как отследить простой соединения
4 fisher
 
28.05.12
10:56
Кажись, нигде не выставляется. Где-то в доках описано, когда отстреливается. Вроде через пол-часа или около того.
Не отследить никак, вроде...
5 fisher
 
28.05.12
10:58
Хотя, в принципе, ничего не мешает построить собственный менеджер соединений.
Типа каждый клиент будет отписываться на сервер по обработке ожидания и проштрафившихся сервер будет килять через менеджер кластера.
6 Jokerman
 
28.05.12
11:01
(5) а по какому свойству соединения можно узнать проштрафившихся?
7 Jokerman
 
28.05.12
11:02
Такое прочитал в СП:
dbProcTookAt Тип: Дата.
Момент последнего захвата соединения с сервером баз данных.
8 fisher
 
28.05.12
11:04
(7) Если это то что нужно (а похоже на то), то прикольно. Буду знать. Все равно ведь пробовать будешь - отпишись по результатам.
9 fisher
 
28.05.12
11:07
Наверное, именно эту хрень показывает как "Последнюю активность" пользователя. ИМХО, вполне можно на неё завязаться.
10 Jokerman
 
28.05.12
11:09
Хорошо посмотрим, отпишусь как попробую
11 experimentator76
 
28.05.12
11:44
LastActiveAt работает хорошо для веб-клиента (и тонкого?)
для толстого работает что-то ниже = 0 если за 5 минут не было вызовов СУБД
durationLast5Min
durationLast5MinDBMS
12 experimentator76
 
28.05.12
11:47
LastActiveAt на толстом обновляется регулярно даже если пользователь не интерактивит
скорее всего обработчик ожидания воспринимается как активность клиента
13 experimentator76
 
28.05.12
11:47
на тонком у меня обработчика ожидания пока нет
14 Jokerman
 
13.06.12
14:41
Кое-что накопал, кому надо
Процедура ЗавершениеРаботыНеактивныхПользователей() Экспорт
   
   ПодстрокиСтрокиСоединения  = РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(),";");
   
   Если ПодстрокиСтрокиСоединения.Количество()> 1 и Лев(ПодстрокиСтрокиСоединения[0], 5) = "Srvr=" и Лев(ПодстрокиСтрокиСоединения[1], 4) = "Ref=" Тогда
   
       ИмяСервера = СтрЗаменить(Сред(ПодстрокиСтрокиСоединения[0],7, СтрДлина(ПодстрокиСтрокиСоединения[0]) - 7),":",Символы.ПС);
       ИмяБазы      = Сред(ПодстрокиСтрокиСоединения[1],6, СтрДлина(ПодстрокиСтрокиСоединения[1]) - 6);
       Порт = СтрПолучитьСтроку(ИмяСервера,2);
       Порт = Лев(Порт,СтрДлина(Порт)-1)+"0";
       ИмяСервера = СтрПолучитьСтроку(ИмяСервера,1);
       
       Попытка
           Коннектор = Новый COMОбъект("V82.COMConnector");
           
           Агент = Коннектор.ConnectAgent(ИмяСервера+?(Порт="","",":"+Порт));    
           
           Кластеры = Агент.GetClusters();
           Для каждого Кластер из Кластеры Цикл
               АдминистраторКластера = "";
               ПарольКластера = "";
               Агент.Authenticate(Кластер, АдминистраторКластера, ПарольКластера);
               Процессы = Агент.GetWorkingProcesses(Кластер);
               Для каждого Процесс из Процессы Цикл
                   Порт = Процесс.MainPort;
                   // теперь есть адрес и порт для подключения к рабочему процессу
                   РабПроц = Коннектор.ConnectWorkingProcess(ИмяСервера + ":" + СтрЗаменить(Порт, Символы.НПП, ""));
                   РабПроц.AddAuthentication("Администратор", "");
                   
                   ИнформационнаяБаза = "";
                   
                   Базы = Агент.GetInfoBases(Кластер);
                   Для каждого База из Базы Цикл
                       Если База.Name = ИмяБазы Тогда
                           ИнформационнаяБаза = База;
                           Прервать;
                       КонецЕсли;
                   КонецЦикла;
                   Если ИнформационнаяБаза = "" Тогда
                       // база не найдена
                   КонецЕсли;
                   
                   Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
                   Для каждого Сеанс из Сеансы Цикл
                       Если нРег(Сеанс.AppID) = "backgroundjob" ИЛИ нРег(Сеанс.AppID) = "designer" ИЛИ нРег(Сеанс.AppID) = "comconsole" Тогда
                           // если это сеансы конфигуратора или фонового задания, то не отключаем
                           Продолжить;
                       КонецЕсли;
                       Если Сеанс.userName = ИмяПользователя() Тогда
                           // это текущий пользователь
                           Продолжить;
                       КонецЕсли;
                       //Сообщить(ТекущаяДата()-Сеанс.dbProcTookAt); //здесь не заполняется dbProcTookAt, поэтому отключил это
                       //Агент.TerminateSession(Кластер, Сеанс);
                   КонецЦикла;
                   
                   ИнформационнаяБаза2 = РабПроц.CreateInfoBaseInfo();
                   ИнформационнаяБаза2.Name = ИмяБазы;
                   СоединенияБазы = РабПроц.GetInfoBaseConnections(ИнформационнаяБаза2);                    
                   // Разорвать соединения клиентских приложений.
                   Для Каждого Соединение Из СоединенияБазы Цикл
                       Если нРег(Соединение.AppID) = "backgroundjob" ИЛИ нРег(Соединение.AppID) = "designer" ИЛИ нРег(Соединение.AppID) = "comconsole" Тогда
                           // если это соединение конфигуратора или фонового задания, то не отключаем
                           Продолжить;
                       КонецЕсли;
                       Если Соединение.UserName = ИмяПользователя() Тогда
                           // это текущий пользователь
                           Продолжить;
                       КонецЕсли;
                       Осталось = 120-(ТекущаяДата()-Соединение.dbProcTookAt); //здесь 120 это 2 минуты это так для примера, можно свою константу
                       Сообщить(Осталось);
                       Если Осталось<=0 Тогда
                           РабПроц.Disconnect(Соединение);
                       КонецЕсли;
                   КонецЦикла;
               КонецЦикла;
           КонецЦикла;
       Исключение
           СообщитьОбОшибке(ОписаниеОшибки());
       КонецПопытки;
       
   КонецЕсли;
   
КонецПроцедуры
15 Jokerman
 
13.06.12
14:43
У меня другой вопрос: как посылать пользователям сообщения, предупреждения? Через WScript.Shell не получилось!
16 Jokerman
 
13.06.12
14:52
Апа
Программист всегда исправляет последнюю ошибку.