Имя: Пароль:
1C
 
Программный разрыв соединений пользователей в 1С 8.1.

0 Черников
 
27.07.07
13:49
в книге зниний 1с по адресу
Книга знаний: v8: Выгонялка пользователей для 1С 7.7, 8.0, 8.1
находится v8: Выгонялка пользователей для 1С 7.7, 8.0, 8.1
Там выложен скрипт на бейсике для 1с 8.1.

'VBS. Cкрипт осуществляет отключение всех подключений к ИБ 1С:Предприятия v8.1.
'На сервере подразумевается наличие только одного кластера и только одного рабочего процесса

'имя пользователя 1С:Предприятия
UserName = "TormozIT"

'пароль пользователя 1С:Предприятия
UserPass = "f43_!dPOD"

'имя сервера 1С
ServerName     =     "Tamo"
BaseName    =    "UPP12"

'Удаление всех соединений заданной ИБ сервера 1С

Dim Connector
Dim AgentConnection
Dim Cluster
Dim WorkingProcess
Dim WorkingProcessConnection
Dim ibDesc
Dim connections
Dim ConnectString

Set connector = CreateObject("V81.COMConnector")
Set AgentConnection = Connector.ConnectAgent(ServerName)
Set Cluster = AgentConnection.GetClusters()(0)
AgentConnection.Authenticate Cluster, "", ""
Set WorkingProcess = AgentConnection.GetWorkingProcesses(Cluster)(0)
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)

Dim i
Dim Connection
For i = LBound(Connections) To UBound(Connections)
   set Connection = connections(i)
   If (Connection.AppID <> "COMConsole") then
       WorkingProcessConnection.Disconnect Connection
   End if
Next

Я попробовал перевести этот скрипт на язык 1С (платформа 8.1.8.76):

UserName = "Администратор";
UserPass = "111";

ServerName     =     "server1";
BaseName    =    "base1";

connector = новый comobject("V81.COMConnector");
AgentConnection = Connector.ConnectAgent(ServerName);

Cluster = AgentConnection.GetClusters()[0];

AgentConnection.Authenticate(Cluster,””,””);

WorkingProcess = AgentConnection.GetWorkingProcesses(Cluster)[0];

ConnectString = WorkingProcess.HostName + ":" + WorkingProcess.MainPort;
WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString);
WorkingProcessConnection.AddAuthentication(UserName, UserPass);
ibDesc = WorkingProcessConnection.CreateInfoBaseInfo();
ibDesc.Name = BaseName;

Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc);

Для каждого Connection из connections Цикл

    Если Connection.AppID <> "COMConsole" тогда
   
         WorkingProcessConnection.Disconnect(Connection);

    КонецЕсли;

КонецЦикла;
                       
       
ПрекратитьРаботуСистемы();
       
       
При компиляции выдалась ошибка:
«Получение элемента по индексу для значения не определено
Cluster = AgentConnection.GetClusters()[0];»

Подскажите, пожалуйста, в чем тут дело!


Примечание: мне нужно ночью делать разрыв зависших соединений 1С.
В 1с 8.0 я делал так: с помощью задания запускал ночью на сервере почти пустую базу 1С, в этой базе в процедуре ПриНачалеРаботыСистемы() писал следующий код:

сообщить("Начало процесса разрыва соединений 1С");
ComPlus = новый comobject("ComAdmin.ComAdminCatalog");
Приложения = ComPlus.GetCollection("Applications");
Приложения.Populate();
ПоследнийНомер = Приложения.Count - 1;
Для Номер = 0 по ПоследнийНомер Цикл
   
Приложение = Приложения.Item(Номер);
Если Приложение.Name = "1CV81" Тогда
   
   ComPlus.ShutDownApplication(Приложение.Name);
   Прервать;
                       
КонецЕсли;
           
КонецЦикла;
                       
сообщить("Конец процесса разрыва соединений 1С");
       
ПрекратитьРаботуСистемы();

В 1с. 8.0. это работало, но в 8.1. это перестало работать, потому что сервер 1С стал службой, а не com-объектом.




Большое спасибо!
1 RomaH
 
naïve
27.07.07
14:16
set logfile=%1
set timeout=%2

echo %date% %time% >>%logfile%
net stop "1C:Enterprise 8.1 Server Agent" >>%logfile%
sleep %timeout%
echo %date% %time% >>%logfile%
net start "1C:Enterprise 8.1 Server Agent" >>%logfile%
sleep %timeout%

для разрыва соединений таймаут между остановкой и запуском 5 минут должно хватить
2 Черников
 
27.07.07
14:29
Параметр timeout нужно в минутах или секундах задавать? И как задавать в кавычках или нет?
Если мне нужно 5 минут, то можно запустить этот bat-файл с такими параметрами:

c.bat "log.txt" 5
3 RomaH
 
naïve
27.07.07
14:31
а у тебя sleep  отрабатывает?
4 Черников
 
27.07.07
14:51
у меня пишет, что  sleep не является внутренней или внешней командой
5 Черников
 
27.07.07
15:15
По адресу
http://wiki.oszone.net/index.php/Пауза_в_пакетном_файле
можно скачать утилиту sleep.exe, ее нужно поместить в тот же каталог, что и батник, параметром к этой утилите является число секунд, а не минут, то есть, если нужно 5 минут, то нужно задавать параметр = 300.
Я проверил, работает разрыв соединений 1С!
Спасибо!
6 k23
 
27.07.07
19:46
нахрен не нужен никакой слип, без него всё будет работать.
7 Sevko_S
 
02.06.08
17:35
Вот полностью рабочий код :

UserName = "Администратор";
UserPass = "111";

ServerName     =     "server1";
BaseName    =    "base1";
   connector = новый comobject("V81.COMConnector");
   AgentConnection = Connector.ConnectAgent(ServerName);

   Clusters = AgentConnection.GetClusters();

   Для каждого Cluster из Clusters Цикл
       AgentConnection.Authenticate(Cluster,"","");

       WorkingProcesses = AgentConnection.GetWorkingProcesses(Cluster);
       Для каждого WorkingProcess из WorkingProcesses Цикл

           ConnectString = WorkingProcess.HostName + ":" + формат(WorkingProcess.MainPort,"ЧГ=");
           WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString);
           WorkingProcessConnection.AddAuthentication(UserName, UserPass);
           ibDesc = WorkingProcessConnection.CreateInfoBaseInfo();
           ibDesc.Name = BaseName;

           Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc);

           Для каждого Connection из connections Цикл
               Если Connection.AppID <> "COMConsole" тогда
                    WorkingProcessConnection.Disconnect(Connection);
               КонецЕсли;
           КонецЦикла;
       
       КонецЦикла;
       
   КонецЦикла;
8 Кураж
 
02.06.08
17:38
+(7) А ещё на Инфостарте валяется обработка готовая на эту тему...
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.