Цитата megaloman:
Вариант 3. И всё-таки я бы предпочел сделать эту работу в cmd - скрипте, ИМХО, надёжнее получится. Но, не зная подробностей Вашего задания, его не привожу. »
|
Большое спасибо, буду разбираться с предложенным Вами.
Третий вариант не получится - там задача сначала пройтись по всем существующим в кластере 1С соединеным клиентам и выкинуть их из базы В cmd (насколько мне известно) такое не получится
А подскажите как ?
Цитата megaloman:
Существующий скрипт надо оформить в виде подпрограммы
|
Положу сюда тело скрипта (если это не оффтоп)
СКРИПТ
Код:

'имя пользователя базы 1С:Предприятия
UserName = "user"
'пароль пользователя базы 1С:Предприятия
UserPass = "pass"
'имя сервера 1С:Предприятия
ServerName = "server"
'имя базы 1С:Предприятия к которой подключаемся
BaseName = "test_baza"
LockPermissionCode = "123456"
LockMessageText = "БАЗА ЗАКРЫТА НА СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ И ОБНОВЛЕНИЕ."
Dim Connector
Dim AgentConnection
Dim Cluster
Dim WorkingProcess
Dim WorkingProcessConnection
Dim ibDesc
Dim connections
Dim ConnectString
Set connector = CreateObject("v83.COMConnector.1")
Set AgentConnection = Connector.ConnectAgent(ServerName)
Set Cluster = AgentConnection.GetClusters()(0)
'Указываем доступ к консоли 1С:Предприятия (только в том случае если определён администратор кластера, иначе прописать просто " " (пробелЫ))
AgentConnection.Authenticate Cluster, " ", " "
'Список процессов кластера
Processes = AgentConnection.GetWorkingProcesses(Cluster)
Dim j
'Перебираем все процессы в кластере
For j = LBound(Processes) To UBound(Processes)
Set WorkingProcess = AgentConnection.GetWorkingProcesses(Cluster)(j)
'Проверяем на наличие остановленых процессов
If (WorkingProcess.MainPort <> "0") Then
ConnectString = WorkingProcess.HostName & ":" & WorkingProcess.MainPort
Set WorkingProcessConnection = Connector.ConnectWorkingProcess(ConnectString)
WorkingProcessConnection.AddAuthentication UserName, UserPass
InfoBases = WorkingProcessConnection.GetInfoBases()
For Each InfoBase In InfoBases
' Ищем нужную базу
If UCase(InfoBase.Name) = UCase(BaseName) Then
' Устанавливаем запрет на подключение новых соединений
InfoBase.ConnectDenied = True
InfoBase.DeniedFrom = CStr(Now())
' Запрет действует 15 минут, если скрипт не отработает нормально
InfoBase.DeniedTo = CStr(Now() + 1 / 96 * 1)
InfoBase.DeniedMessage = LockMessageText
InfoBase.PermissionCode = LockPermissionCode
WorkingProcessConnection.UpdateInfoBase (InfoBase)
End If
Next
Set ibDesc = WorkingProcessConnection.CreateInfoBaseInfo()
ibDesc.Name = BaseName
Connections = WorkingProcessConnection.GetInfoBaseConnections(ibDesc)
'Удаление всех соединений заданной ИБ сервера 1С
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
End If
Next
'''''''''''''''''''''''''''''
strComm = """C:\Program Files (x86)\1cv8\8.3.4.437\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /Nuser /Ppass /UC"& LockPermissionCode &" /DumpIB ""\\SERVER\BACKUP\1C\"& Dat & BaseName &".dt"" /Out ""\\SERVER\BACKUP\1C\log\"& Dat & BaseName &"_dump.log"""
strComm2 = """C:\Program Files (x86)\1cv8\8.3.4.437\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /Nuser /Ppass /UC"& LockPermissionCode &" /UpdateDBCfg /Out ""\\SERVER\BACKUP\1C\log\"& Dat & BaseName &"_update.log"""
Set oWshShell = CreateObject("WScript.Shell")
oWshShell.Run strComm, 0, true
oWshShell.Run strComm2, 0, true
' Отключаем блокировку базы
InfoBases = WorkingProcessConnection.GetInfoBases()
For Each InfoBase In InfoBases
' Ищем нужную базу
If UCase(InfoBase.Name) = UCase(BaseName) Then
' Отключаем запрет на подключение новых соединений
InfoBase.ConnectDenied = False
'InfoBase.DeniedMessage = ""
'InfoBase.PermissionCode = ""
WorkingProcessConnection.UpdateInfoBase (InfoBase)
End If
Next