Найти тему
Владимир Жирицкий

1С Активные пользователи для пользовательского режима.

Нужно для самописных конфигураций. Делюсь своим кодом для отключения сеансов и сессий.

&AtServer

Procedure EndSessionAtServer()

If Find(InfoBaseConnectionString(), "Srvr") > 0 Then

 //server version (серверный вариант)

 vSearch = Find(InfoBaseConnectionString(), "Srvr=");

 vSearchSubstring = Mid(InfoBaseConnectionString(), vSearch + 6);       

 vServerName = Left(vSearchSubstring, Find(vSearchSubstring, """") - 1);

 // now we are looking for the database name(теперь ищем имя базы)

 vSearch = Find(InfoBaseConnectionString(), "Ref=");

 vSearchSubstring = Mid(InfoBaseConnectionString(), vSearch + 5);

 vBaseName = Left(vSearchSubstring, Find(vSearchSubstring, """") - 1);

Else

 //for other connection methods the algorithm is not relevant(для других способов подключения алгоритм не актуален)

 Return;

EndIf;

vConnector = New COMObject("v83.COMConnector");

vAgent = vConnector.ConnectAgent(vServerName);

vClusters = vAgent.GetClusters();

For Each vCluster In vClusters Do

 //(АдминистраторКластера = "Админ") ClusterAdministrator = "Admin"               

 //(ПарольКластера = "") Cluster Password = ""

 vAgent.Authenticate(vCluster,"Gotech","314159");

 vProcesses = vAgent.GetWorkingProcesses(vCluster);       

 For Each vProcess In vProcesses Do

  vPort = vProcess.MainPort;

  // now there is an address and port to connect to the worker process(теперь есть адрес и порт для подключения к рабочему процессу)

  vSlaveProc = vConnector.ConnectWorkingProcess(vServerName + ":" + StrReplace(vPort, Chars.NBSp, ""));

  vSlaveProc.AddAuthentication("Админ", ""); // "Имя администратора БД(пользователь)", "Пароль администратора БД"

  vInformationBase = "";

  vBases = vAgent.GetInfoBases(vCluster);

  For Each vBase In vBases Do

   If vBase.Name = vBaseName Then

    vInformationBase = vBase;

    Break;

   EndIf;

  EndDo;

  If vInformationBase = "" Then

   // database not found(база не найдена)

   Message = New UserMessage;

   Message.Text = "database not found";

   Message.Message();

  EndIf;

  vRowIdentifier = Items.ActiveUsers.CurrentRow;

  vTechData = ActiveUsers.FindByID(vRowIdentifier);

  vSessions = vAgent.GetInfoBaseSessions(vCluster, vInformationBase);

  For Each vSession In vSessions Do

   If vSession.SessionID = vTechData.SessionNumber Then

    vAgent.TerminateSession(vCluster, vSession, NStr("ru = 'Администратор отключил сеанс!'; de = 'Der Administrator hat die Sitzung getrennt!'; en ='The administrator has disconnected the session!'"));

    Break;

   EndIf;

  EndDo;

  //Disconnect client application connections (Разорвать соединения клиентских приложений.)  

  vBases = vSlaveProc.GetInfoBases();

  For Each vBase In vBases Do

   If vBase.Name = vBaseName Then

    vInformationBase = vBase;

    Break;

   EndIf;

  EndDo;

  If vInformationBase = "" Then

   // database not found(база не найдена)

   Message = New UserMessage;

   Message.Text = "database not found";

   Message.Message();

  EndIf;

  vConnections = vSlaveProc.GetInfoBaseConnections(vInformationBase); 

  For Each vConnection In vConnections Do

   If vConnection.userName = vSession.userName Then

    vSlaveProc.Disconnect(vConnection);

   EndIf;

  EndDo;

 EndDo;

EndDo;

UpdateAtServer();

EndProcedure //EndSessionAtServer