|
Программный разрыв соединений пользователей в 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) А ещё на Инфостарте валяется обработка готовая на эту тему...
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |