Имя: Пароль:
1C
1С v8
Завершение работы пользователей
0 az2002
 
26.10.11
09:15
А че половина сеансов не закрывается?

Процедура КнопкаВыполнитьНажатие(Кнопка)
   БС=ПолучитьБлокировкуСеансов();
   БС.КодРазрешения="123";
   БС.Конец=ТекущаяДата()+300;
   БС.Начало=ТекущаяДата();
   БС.Сообщение="включена блокировка";
   БС.Установлена=Истина;
   УстановитьБлокировкуСеансов(БС);
   ТекущийРежим =ПолучитьБлокировкуСеансов();
   //БлокировкаУстановлена = ТекущийРежим.Установлена;
   БлокировкаУстановлена =истина;
   ВремяНачалаБлокировки = ТекущийРежим.Начало;
       
   ИнтервалОтключения    = - 30;
   
   ТекущийМомент = ТекущаяДата();
   
   Если БлокировкаУстановлена и
       (НЕ ЗначениеЗаполнено(ВремяНачалаБлокировки)
           ИЛИ ВремяНачалаБлокировки - ТекущийМомент <= ИнтервалОтключения) Тогда
           
       ОтключитьОбработчикОжидания("ЗавершитьРаботуПользователей");
       
       ПодстрокиСтрокиСоединения  = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(СтрокаСоединенияИнформационнойБазы(),";");
       
       Если ПодстрокиСтрокиСоединения.Количество()> 1 и Лев(ПодстрокиСтрокиСоединения[0], 5) = "Srvr=" и Лев(ПодстрокиСтрокиСоединения[1], 4) = "Ref=" Тогда
           
           ИмяСервера = Сред(ПодстрокиСтрокиСоединения[0],7, СтрДлина(ПодстрокиСтрокиСоединения[0]) - 7);
           ИмяИБ      = Сред(ПодстрокиСтрокиСоединения[1],6, СтрДлина(ПодстрокиСтрокиСоединения[1]) - 6);
           
           ПодстрокиПараметровЗапуска = ОбщегоНазначения.РазложитьСтрокуВМассивПодстрок(ПараметрЗапуска,";");
           
           Попытка
               
               ComConnector = Новый COMОбъект("v82.COMConnector");
               
               РазделительПорта = Найти(ИмяСервера, ":");
               Если РазделительПорта > 0 Тогда
                   ИмяСервера = Сред(ИмяСервера, 1, (РазделительПорта - 1));
                   НомерПортаКластера = Число(Сред(ИмяСервера, (РазделительПорта + 1)));
               Иначе
                   НомерПортаКластера = ComConnector.RMngrPortDefault;
               КонецЕсли;
               
               // Подключение к агенту сервера
               ServerAgent = ComConnector.ConnectAgent(ИмяСервера);
               
               // Получим массив кластеров сервера у агента сервера
               Clasters = ServerAgent.GetClusters();
               
               // Найдем необходимый нам кластер
               Для Каждого Claster Из Clasters Цикл
                   Если Claster.MainPort <> НомерПортаКластера Тогда
                       Продолжить;
                   КонецЕсли;
                   
                   // Аутефикация к найденному кластеру
                   Если ПодстрокиПараметровЗапуска.Количество() > 2 и Врег(ПодстрокиПараметровЗапуска[0]) = Врег("ЗавершитьРаботуПользователей") Тогда
                       ServerAgent.Authenticate(Claster, ПодстрокиПараметровЗапуска[1], ПодстрокиПараметровЗапуска[2]);
                   Иначе
                       ServerAgent.Authenticate(Claster, "", "");
                   КонецЕсли;
                   
                   // Получаем список рабочих процессов
                   WorkingProcesses = ServerAgent.GetWorkingProcesses(Claster);
                   
                   Для Каждого WorkingProcess Из WorkingProcesses Цикл
                       
                       Если WorkingProcess.Running <> 1 Тогда
                           Продолжить;
                       КонецЕсли;
                       
                       // Для каждого рабочего процесса создаем соединение с рабочим процессом
                       ConnectToWorkProcess = ComConnector.ConnectWorkingProcess("tcp://" + WorkingProcess.HostName + ":" + Формат(WorkingProcess.MainPort, "ЧГ=0"));
                       
                       Если ПодстрокиПараметровЗапуска.Количество() > 2 и Врег(ПодстрокиПараметровЗапуска[0]) = Врег("ЗавершитьРаботуПользователей") Тогда
                           ConnectToWorkProcess.AddAuthentication(ПодстрокиПараметровЗапуска[1], ПодстрокиПараметровЗапуска[2]);
                       Иначе
                           ConnectToWorkProcess.AddAuthentication(ИмяПользователя(), "");
                       КонецЕсли;
                       
                       // Получаем список ИБ рабочего процесса
                       InfoBases = ConnectToWorkProcess.GetInfoBases();
                       Для Каждого InfoBase Из InfoBases Цикл
                           // Ищем нужную базу
                           Если InfoBase.Name = ИмяИБ Тогда
                               
                               // Получаем массив соединений с ИБ
                               Connections = ConnectToWorkProcess.GetInfoBaseConnections(InfoBase);
                               Для Каждого Connection Из Connections Цикл
                                   Если ИмяПользователя() <> connection.userName Тогда
                                       // Разрываем Connections с ИБ
                                       СтрСообщения = "Разрывается соединение: Пользователь " + Connection.UserName + ", компьютер " + Connection.HostName + ", установлено " + Connection.ConnectedAt + ", режим " + Connection.AppID;
                                       ЗаписьЖурналаРегистрации("Завершение работы пользователей", УровеньЖурналаРегистрации.Информация, , , СтрСообщения);
                                       ConnectToWorkProcess.Disconnect(Connection);
                                   КонецЕсли;
                               КонецЦикла;
                               
                           КонецЕсли;
                       КонецЦикла;
                       
                   КонецЦикла;
                   
               КонецЦикла;
               
           Исключение
               ЗаписьЖурналаРегистрации("Завершение работы пользователей", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
           КонецПопытки;
           
       КонецЕсли;
       
       
       Соединения = ПолучитьСоединенияИнформационнойБазы();
       Если Соединения.Количество() > 1 Тогда
           
           Сообщение = "Не удалось завершить работу пользователей:";
           
           Для каждого Соединение Из Соединения Цикл
               Если Не Соединение.НомерСоединения = НомерСоединенияИнформационнойБазы() Тогда
                   Сообщение = Сообщение + Символы.ПС + " - " + Соединение;
               КонецЕсли;
           КонецЦикла;
           
           Сообщить(Сообщение, СтатусСообщения.Внимание);
           ЗаписьЖурналаРегистрации("Завершение работы пользователей", УровеньЖурналаРегистрации.Предупреждение, , , Сообщение);
       Иначе
           Сообщить("Завершение работы пользователей выполнено успешно.", СтатусСообщения.Информация);
       КонецЕсли;
       
       
   КонецЕсли;
   
КонецПроцедуры
1 John83
 
26.10.11
09:17
прога спрашивает "сохранить документ", "выйти из программы"
2 az2002
 
26.10.11
09:37
Сеанс удаляется сервером,
вручную через консоль сеансы отключаются за пару секунд.

Я правильно понимаю, что вот это означает тоже что руками открыть консоль, выделить сеанс и удалить?

ComConnector = Новый COMОбъект("v82.COMConnector");
ConnectToWorkProcess = ComConnector.ConnectWorkingProcess("tcp://" + WorkingProcess.HostName + ":" + Формат(WorkingProcess.MainPort, "ЧГ=0"));
ConnectToWorkProcess.Disconnect(Connection);