новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Разгон пользователей из информационной базы. Два способа. 1С vs VBS

  • Добавить свою публикацию
  • для этого требуется регистрация

Как то наткнулся на просторах интернета на vbs-скрипт который разгоняет пользователей...
Немного помыслив, понял, надо дорабатывать, итог такой - мы выгоняем всех пользователей из базы 1С, на любом кластере, на любом рабочем процессе, т.е. обходим всё что может использовать одна информационная база.

Собственно сам скрипт VBS:

Cкрипт (только SQL) отключает всех пользователей от ИБ 1С:Предприятия V8-V83.

Option Explicit

Dim UserName
Dim UserPass
Dim ServerName
Dim BaseName
'имя пользователя базы 1С:Предприятия
UserName = ""
'пароль пользователя базы 1С:Предприятия
UserPass = ""
'имя кластера 1С:Предприятия
ServerName  =  ""
'имя базы 1С:Предприятия к которой подключаемся
BaseName    =  ""
 

Dim Connector
Dim AgentConnection
Dim Cluster
Dim Clusters
Dim WorkingProcess
Dim WorkingProcesses
Dim WorkingProcessConnection
Dim ibDesc
Dim Connections
Dim Connection
Dim ConnectString
Set Connector = CreateObject("V82.COMConnector")    ' указать в зависимости от вашей версии платформы V8, V81, V82, V83

Set AgentConnection = Connector.ConnectAgent(ServerName)
Clusters = AgentConnection.GetClusters()
Dim Q,W,I
For Q = LBound(Clusters) to UBound(Clusters)
    Set Cluster = Clusters(Q)
'Указываем доступ к консоли 1С:Предприятия (только в том случае если определён администратор кластера, иначе прописать просто " " (пробелы))
    AgentConnection.Authenticate Cluster, " ", " "
    WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster)
    For W = LBound(WorkingProcesses) to UBound(WorkingProcesses)
        Set WorkingProcess = WorkingProcesses(W)
        ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
        Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
        WorkingProcessConnection.AddAuthentication UserName, UserPass
        Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo()
        ibDesc.Name = BaseName
        Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)
        For I = LBound(Connections) To UBound(Connections)
            Set Connection = Connections(I)
' Соединения вида COM-Соединение - не трогаем т.к. скорее всего это мы и есть, при желании можно добавить свои условия
            If (Connection.AppID "COMConsole") then
                WorkingProcessConnection.Disconnect Connection
            End if
        Next
    Next
Next

Функция в 1Ске:
Ну скажем так, ниже функция разгона описана, единственное то, что в неё нужно передавать данные, их немного(можно передавать структуру, я передаю ссылку из справочника базы ):
БазаИсточник.ВерсияПлатформы  = // V8, V81, V82, V83
БазаИсточник.КластерСерверов // собственно имя кластера в котором находится наша база
БазаИсточник.ПользовательАдминистратор // имя пользователя администратора в этой базе
БазаИсточник.ПарольПользователяАдминистратора // пароль пользователя администратора в этой базе
БазаИсточник.ИмяБазыВКластере // собственно имя базы в кластере 1С

Я на возврат этой функции использую массив данных, чтобы можно было проанализировать нужно ли повторно запускать эту функцию:
// Коды возвратов ошибок и условий выполнения
// 1 = выполнено без ошибок, информации для вывода нет
// 2 = не выполнено, результат пустой, есть информация для пользователя
// 3 = выполнено, с ошибками (грубо говоря - "не до конца", пример - не завершены все сеансы пользователей), если повторить операцию, то возможно всё получится :)
// 4 = выполнено, без ошибок, есть дополнительная информация для пользователя
Собственно сама функция убивания сеансов с рабочей базой:




Функция РазорватьВсеСоединенияСБазой(БазаИсточник,ТолькоКонфигуратор=Ложь) Экспорт
    // только конфигуратор используем для того чтобы обновить конфу
    
    СообщениеНаВозврат = "";
    КодВозвратаОшибки = 1;
    Результат = Неопределено;
    ВсегоСоединенийСИнформационнойБазой = 0;
    КоличествоНеЗавершенныхСоединений = 0;
    
    
    ВыполнениеФункций = Истина;
    
    Попытка
        Connector = Новый COMОбъект(БазаИсточник.ВерсияПлатформы + ".COMConnector");
    Исключение
        СообщениеНаВозврат = (ОписаниеОшибки());
        КодВозвратаОшибки = 2;
        Результат = Ложь;
        Goto ~ОтправитьРезультат;
    КонецПопытки;
    
    Попытка
        AgentConnection = Connector.ConnectAgent(БазаИсточник.КластерСерверов);
    Исключение
        СообщениеНаВозврат = (ОписаниеОшибки());
        КодВозвратаОшибки = 2;
        Результат = Ложь;                                                        
        Goto ~ОтправитьРезультат;    
    КонецПопытки;
    Попытка
        Clusters  = AgentConnection.GetClusters();
    Исключение
        СообщениеНаВозврат = (ОписаниеОшибки());
        КодВозвратаОшибки = 2;
        Результат = Ложь;                                                          
        Goto ~ОтправитьРезультат;
    КонецПопытки;

        
    Попытка  // на все кластеры одна попытка, пусть будет так
        Для Каждого Cluster из Clusters Цикл
            
            AgentConnection.Authenticate(Cluster,"",""); // аутентифицируемся в кластере, паролей нет, работаем под Админом :)
            
            Connections = AgentConnection.GetConnections(Cluster); // получаем все соединения с кластером, массив()
            ДатаСоединения = ТекущаяДата();
            WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster); // получаем все рабочие процессы текущего кластера
            
            Для Каждого WorkingProcess из WorkingProcesses Цикл
                
                Если WorkingProcess.MainPort = 0 Тогда Прервать; КонецЕсли; // не знаю почему, но в конце всегда 0 порт
                ConnectString = "" + WorkingProcess.HostName + ":" + WorkingProcess.MainPort + "";
                ConnectString = СтрЗаменить(Строка(ConnectString),Символы.НПП,"");
                WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString); // все соединения с рабочим процессом
                WorkingProcessConnection.AddAuthentication(БазаИсточник.ПользовательАдминистратор,БазаИсточник.ПарольПользователяАдминистратора ); // авторизуемся с базой
                
                ibDesc = WorkingProcessConnection.CreateInfoBaseInfo();
                ibDesc.Name = БазаИсточник.ИмяБазыВКластере;
                
                WorkingConnections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc);
                
                Для Каждого WorkingConnect из WorkingConnections Цикл // перебор и убитие всех сеансов, которые не относятся к текущему пользователю !
                    // 21.03.2013 нас не трогаем, определяем по типу соединения и имени пользователя
                    // 27.03.2013 - да нифига! у нас может быть больше 1 Com-соединения с текущий момент с базой, поэтому надо получать его ID-сеанса!
                    Если Нрег(WorkingConnect.UserName) = Нрег(БазаИсточник.ПользовательАдминистратор) и Нрег(WorkingConnect.AppID) = "comconsole"
                        и (ДатаСоединения - Нрег(WorkingConnect.ConnectedAt))  0 Тогда
        СообщениеНаВозврат = "Не удалось выгнать всех пользователей, количество незавершенных процессов: " + Строка(КоличествоНеЗавершенныхСоединений);
        КодВозвратаОшибки = 3; // выполнено с ошибками, общий результат = Ложь!
        Результат = Ложь;
    КонецЕсли;
    
    Если КоличествоНеЗавершенныхСоединений = 0 Тогда
        СообщениеНаВозврат = "Количество завершенных соединений: " + Строка(ВсегоСоединенийСИнформационнойБазой);
        КодВозвратаОшибки = 4; // выполнено без ошибок, есть информация пользователю, общий результат = Истина!
        Результат = Истина;
    КонецЕсли;
    
~ОтправитьРезультат:

    МассивНаВозврат = Новый Массив();
    МассивНаВозврат.Добавить(Результат);
    МассивНаВозврат.Добавить(КодВозвратаОшибки);
    МассивНаВозврат.Добавить(СообщениеНаВозврат);

    // Подчищаем переменные
    WorkingProcesses             = Undefined;
    Connector                      = Undefined;
    AgentConnection             = Undefined;
    Clusters                     = Undefined;
    Connections                 = Undefined;
    WorkingConnections            = Undefined;
    WorkingProcessConnection    = Undefined;
    WorkingConnect                 = Undefined;
    

    Возврат МассивНаВозврат;
    
КонецФункции

 

 
0
Читайте также
Работа программиста 1С
Найти хорошего 1С программиста для сопровождения и внедрения 1С-программ довольно сложно - нужно оценить ваш уровень ведения учета и четко сформулировать для себя конкретные требования к работе программиста 1С.
Запуск пользователями 1С без открытия списка баз
Как запустить базу 1С не открывая список баз
Разработки
Внешняя печатная форма "Трудовой договор" с выводом сразу в Word
ВПФ Трудовой договор для конф. Зарплата и упр. Персон.
Пользователи, права и интерфейсы
Обработка помогает в определении какие права и нтерфейсы дать пользователям
МОЗГОДЕР - универсальное решение для пользователей
Решение практически любого вопроса и проблемы в 1С
≡ к списку статей