Серверный вариант. Стоит SQL 2008. Платформа 8.2.14.533
Постоянно возникает проблема, когда пользователи из базы выходят, а сессия остаётся висеть. Блокировка устнаовки соединений и перезагрузка сервера не помогает, только помогает завершение из консоли. Подскажите, пожалуйста, как можно решить данную проблему?
Постоянно возникает проблема, когда пользователи из базы выходят, а сессия остаётся висеть. Блокировка устнаовки соединений и перезагрузка сервера не помогает, только помогает завершение из консоли. Подскажите, пожалуйста, как можно решить данную проблему?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
СоединениеНомер = НомерСоединенияИнформационнойБазы();
СоединениеПараметры = Инт_Строка.СтрокаСоответствие(СтрокаСоединенияИнформационнойБазы());
СерверПортИмя = СоединениеПараметры.Получить("Srvr");
БазаИмя = НРег(СоединениеПараметры.Получить("Ref"));
Соединитель = Новый COMОбъект("V82.COMConnector");
РазделительПозиция = Найти(СерверПортИмя, ":");
Если РазделительПозиция > 0 Тогда
СерверИмя = Лев(СерверПортИмя, РазделительПозиция - 1);
СерверКластерПорт = Число(Сред(СерверПортИмя, РазделительПозиция + 1));
Иначе
СерверКластерПорт = Соединитель.RMngrPortDefault;
КонецЕсли;
СерверАгентИмя = СерверИмя;
Если ЗначениеЗаполнено(Вход_СерверАгентПорт) Тогда
СерверАгентИмя = СерверАгентИмя + ":" + Инт_Строка.ЧислоСтрока(Вход_СерверАгентПорт);
КонецЕсли;
Агент = Соединитель.ConnectAgent(СерверАгентИмя);
Кластеры = Агент.GetClusters();
Для Каждого Кластер Из Кластеры Цикл
Если Кластер.MainPort <> СерверКластерПорт Тогда
Продолжить;
КонецЕсли;
Агент.Authenticate(Кластер, Вход_КластерАдминистратор, Вход_КластерАдминистраторПароль);
Процессы = Агент.GetWorkingProcesses(Кластер);
Для Каждого Процесс Из Процессы Цикл
КластерСоединение = Соединитель.ConnectWorkingProcess("tcp://" + СерверИмя
+ ":" + Инт_Строка.ЧислоСтрока(Процесс.MainPort));
КластерСоединение.AddAuthentication(Вход_Администратор.ПользовательИмяИБ, Вход_АдминистраторПароль);
ИБОписание = КластерСоединение.CreateInfoBaseInfo();
ИБОписание.Name = БазаИмя;
Соединения = КластерСоединение.GetInfoBaseConnections(ИБОписание);
Для Каждого Соединение Из Соединения Цикл
Если Соединение.ConnId <> СоединениеНомер Тогда
КластерСоединение.Disconnect(Соединение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СоединениеПараметры = Инт_Строка.СтрокаСоответствие(СтрокаСоединенияИнформационнойБазы());
СерверПортИмя = СоединениеПараметры.Получить("Srvr");
БазаИмя = НРег(СоединениеПараметры.Получить("Ref"));
Соединитель = Новый COMОбъект("V82.COMConnector");
РазделительПозиция = Найти(СерверПортИмя, ":");
Если РазделительПозиция > 0 Тогда
СерверИмя = Лев(СерверПортИмя, РазделительПозиция - 1);
СерверКластерПорт = Число(Сред(СерверПортИмя, РазделительПозиция + 1));
Иначе
СерверКластерПорт = Соединитель.RMngrPortDefault;
КонецЕсли;
СерверАгентИмя = СерверИмя;
Если ЗначениеЗаполнено(Вход_СерверАгентПорт) Тогда
СерверАгентИмя = СерверАгентИмя + ":" + Инт_Строка.ЧислоСтрока(Вход_СерверАгентПорт);
КонецЕсли;
Агент = Соединитель.ConnectAgent(СерверАгентИмя);
Кластеры = Агент.GetClusters();
Для Каждого Кластер Из Кластеры Цикл
Если Кластер.MainPort <> СерверКластерПорт Тогда
Продолжить;
КонецЕсли;
Агент.Authenticate(Кластер, Вход_КластерАдминистратор, Вход_КластерАдминистраторПароль);
Процессы = Агент.GetWorkingProcesses(Кластер);
Для Каждого Процесс Из Процессы Цикл
КластерСоединение = Соединитель.ConnectWorkingProcess("tcp://" + СерверИмя
+ ":" + Инт_Строка.ЧислоСтрока(Процесс.MainPort));
КластерСоединение.AddAuthentication(Вход_Администратор.ПользовательИмяИБ, Вход_АдминистраторПароль);
ИБОписание = КластерСоединение.CreateInfoBaseInfo();
ИБОписание.Name = БазаИмя;
Соединения = КластерСоединение.GetInfoBaseConnections(ИБОписание);
Для Каждого Соединение Из Соединения Цикл
Если Соединение.ConnId <> СоединениеНомер Тогда
КластерСоединение.Disconnect(Соединение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Если нет нужды сохранять сессии, можно сделать автозавершение сессий по отключению.
Но у меня появилась из-за этого другая проблема, иногда, при входе в 1с вылазит ошибка с ключем, приходиться отказываться от установки и перезапускать сеанс, далее норм
Но у меня появилась из-за этого другая проблема, иногда, при входе в 1с вылазит ошибка с ключем, приходиться отказываться от установки и перезапускать сеанс, далее норм
Можно сделать по аналогии с SAP_Logon: взять обработку выше, модифицировать и обрубать сеансы, активность которых была час назад и более.
Но неизвестно, как себя поведет сия обработка, если будет какое-нибудь закрытие: часов 6 будет выполняться, активность последняя как раз 6 часов назад и останется. Нужно проверять.
Но неизвестно, как себя поведет сия обработка, если будет какое-нибудь закрытие: часов 6 будет выполняться, активность последняя как раз 6 часов назад и останется. Нужно проверять.
у меня пользователи не корректно выходят из терминального приложения 1С, и висят как мертвые души, при заходе снова подключаются, но уже сессия другая. и смотришь журнал активных пользователей - куча мертвых душ... и где то среди них есть один реальный рабочий сеанс...
СоединениеНомер = НомерСоединенияИнформационнойБазы();
СоединениеПараметры = Инт_Строка.СтрокаСоответствие(СтрокаСоединенияИнформационнойБазы());
СерверПортИмя = СоединениеПараметры.Получить("Srvr");
БазаИмя = НРег(СоединениеПараметры.Получить("Ref"));
Соединитель = Новый COMОбъект("V82.COMConnector");
РазделительПозиция = Найти(СерверПортИмя, ":");
Если РазделительПозиция > 0 Тогда
СерверИмя = Лев(СерверПортИмя, РазделительПозиция - 1);
СерверКластерПорт = Число(Сред(СерверПортИмя, РазделительПозиция + 1));
Иначе
СерверКластерПорт = Соединитель.RMngrPortDefault;
КонецЕсли;
СерверАгентИмя = СерверИмя;
Если ЗначениеЗаполнено(Вход_СерверАгентПорт) Тогда
СерверАгентИмя = СерверАгентИмя + ":" + Инт_Строка.ЧислоСтрока(Вход_СерверАгентПорт);
КонецЕсли;
Агент = Соединитель.ConnectAgent(СерверАгентИмя);
Кластеры = Агент.GetClusters();
Для Каждого Кластер Из Кластеры Цикл
Если Кластер.MainPort <> СерверКластерПорт Тогда
Продолжить;
КонецЕсли;
Агент.Authenticate(Кластер, Вход_КластерАдминистратор, Вход_КластерАдминистраторПароль);
Процессы = Агент.GetWorkingProcesses(Кластер);
Для Каждого Процесс Из Процессы Цикл
КластерСоединение = Соединитель.ConnectWorkingProcess("tcp://" + СерверИмя
+ ":" + Инт_Строка.ЧислоСтрока(Процесс.MainPort));
КластерСоединение.AddAuthentication(Вход_Администратор.ПользовательИмяИБ, Вход_АдминистраторПароль);
ИБОписание = КластерСоединение.CreateInfoBaseInfo();
ИБОписание.Name = БазаИмя;
Соединения = КластерСоединение.GetInfoBaseConnections(ИБОписание);
Для Каждого Соединение Из Соединения Цикл
Если Соединение.ConnId <> СоединениеНомер Тогда
КластерСоединение.Disconnect(Соединение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СоединениеПараметры = Инт_Строка.СтрокаСоответствие(СтрокаСоединенияИнформационнойБазы());
СерверПортИмя = СоединениеПараметры.Получить("Srvr");
БазаИмя = НРег(СоединениеПараметры.Получить("Ref"));
Соединитель = Новый COMОбъект("V82.COMConnector");
РазделительПозиция = Найти(СерверПортИмя, ":");
Если РазделительПозиция > 0 Тогда
СерверИмя = Лев(СерверПортИмя, РазделительПозиция - 1);
СерверКластерПорт = Число(Сред(СерверПортИмя, РазделительПозиция + 1));
Иначе
СерверКластерПорт = Соединитель.RMngrPortDefault;
КонецЕсли;
СерверАгентИмя = СерверИмя;
Если ЗначениеЗаполнено(Вход_СерверАгентПорт) Тогда
СерверАгентИмя = СерверАгентИмя + ":" + Инт_Строка.ЧислоСтрока(Вход_СерверАгентПорт);
КонецЕсли;
Агент = Соединитель.ConnectAgent(СерверАгентИмя);
Кластеры = Агент.GetClusters();
Для Каждого Кластер Из Кластеры Цикл
Если Кластер.MainPort <> СерверКластерПорт Тогда
Продолжить;
КонецЕсли;
Агент.Authenticate(Кластер, Вход_КластерАдминистратор, Вход_КластерАдминистраторПароль);
Процессы = Агент.GetWorkingProcesses(Кластер);
Для Каждого Процесс Из Процессы Цикл
КластерСоединение = Соединитель.ConnectWorkingProcess("tcp://" + СерверИмя
+ ":" + Инт_Строка.ЧислоСтрока(Процесс.MainPort));
КластерСоединение.AddAuthentication(Вход_Администратор.ПользовательИмяИБ, Вход_АдминистраторПароль);
ИБОписание = КластерСоединение.CreateInfoBaseInfo();
ИБОписание.Name = БазаИмя;
Соединения = КластерСоединение.GetInfoBaseConnections(ИБОписание);
Для Каждого Соединение Из Соединения Цикл
Если Соединение.ConnId <> СоединениеНомер Тогда
КластерСоединение.Disconnect(Соединение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Вот это кусок
СоединениеНомер = НомерСоединенияИнформационнойБазы();
СоединениеПараметры = Инт_Строка.СтрокаСоответствие(СтрокаСоединенияИнформационнойБазы());
СерверПортИмя = СоединениеПараметры.Получить("Srvr");
БазаИмя = НРег(СоединениеПараметры.Получить("Ref"));
Соединитель = Новый COMОбъект("V82.COMConnector");
РазделительПозиция = Найти(СерверПортИмя, ":");
Если РазделительПозиция > 0 Тогда
СерверИмя = Лев(СерверПортИмя, РазделительПозиция - 1);
СерверКластерПорт = Число(Сред(СерверПортИмя, РазделительПозиция + 1));
Иначе
СерверКластерПорт = Соединитель.RMngrPortDefault;
КонецЕсли;
СерверАгентИмя = СерверИмя;
Если ЗначениеЗаполнено(Вход_СерверАгентПорт) Тогда
СерверАгентИмя = СерверАгентИмя + ":" + Инт_Строка.ЧислоСтрока(Вход_СерверАгентПорт);
КонецЕсли;
наводит на мысль, что в ИТС всё подробно описано.
СоединениеНомер = НомерСоединенияИнформационнойБазы();
СоединениеПараметры = Инт_Строка.СтрокаСоответствие(СтрокаСоединенияИнформационнойБазы());
СерверПортИмя = СоединениеПараметры.Получить("Srvr");
БазаИмя = НРег(СоединениеПараметры.Получить("Ref"));
Соединитель = Новый COMОбъект("V82.COMConnector");
РазделительПозиция = Найти(СерверПортИмя, ":");
Если РазделительПозиция > 0 Тогда
СерверИмя = Лев(СерверПортИмя, РазделительПозиция - 1);
СерверКластерПорт = Число(Сред(СерверПортИмя, РазделительПозиция + 1));
Иначе
СерверКластерПорт = Соединитель.RMngrPortDefault;
КонецЕсли;
СерверАгентИмя = СерверИмя;
Если ЗначениеЗаполнено(Вход_СерверАгентПорт) Тогда
СерверАгентИмя = СерверАгентИмя + ":" + Инт_Строка.ЧислоСтрока(Вход_СерверАгентПорт);
КонецЕсли;
наводит на мысль, что в ИТС всё подробно описано.
Уменьшить тайм-аут завершения процесса SplWOW64.exe. Для этого следует в значение системного реестра SplWOW64TimeOut установить в значение 1 (при отсутствии значения его следует создать с типом DWORD (32 бита)).
Ветка реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print
Добавить процесс SplWOW64.exe в список процессов, завершаемых при завершении терминальной сессии. Для этого следует значение системного реестра SPLWOW64.EXE установить в значение 0 (при отсутствии значения его следует создать с типом DWORD (32 бита)).
Ветка реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\SysProcs
Ветка реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print
Добавить процесс SplWOW64.exe в список процессов, завершаемых при завершении терминальной сессии. Для этого следует значение системного реестра SPLWOW64.EXE установить в значение 0 (при отсутствии значения его следует создать с типом DWORD (32 бита)).
Ветка реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Возникла проблема с тем, что зависали сеансы без рабочего процесса. Сделал так:
Для Каждого Кластер Из Кластеры Цикл
Агент.Authenticate(Кластер, "", "");
Сеансы = Агент.GetSessions(Кластер);
Для Каждого Сеанс Из Сеансы Цикл
Если Сеанс.process = Неопределено Тогда
Агент.TerminateSession(Кластер, Сеанс);
Сообщить("Удалил сессию: " + Сеанс.UserName);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот