Имя: Пароль:
1C
1С v8
Не выкидывает всех из баз VBS
0 udarnic77
 
12.10.16
08:52
Приветствую уважаемый форум!
Задача - еженочная выгрузка аз в DT.
Есть скрипт на VBS, который успешно задачу выполняет на различных базах (в том числе полностью самописных программистом).
Но, с некоторых пор (подозрение на обновление платформы до версии 8.3.8.1747) некоторые клиенты остаются подключенными и, соответственно, выгрузка не выполняется из-за невозможности установить монопольное соединение. Если выкинуть оставшихся клиентов руками в консоли администрирования сервера - скрипт отрабатывает.

Тело скрипта такое:
[code]

BasesList = "c:\script\backup\bases_to_backup.txt"   'Cписок баз, одна строка - одна база
' Например:
' base1
' base2
' base3
''''''''''''''
Set FSO = CreateObject("Scripting.FileSystemObject")

If FSO.FileExists(BasesList) Then
    Set Fstring = FSO.OpenTextFile(BasesList, 1)
    Do
        iString = Fstring.ReadLine
        If Len(Trim(iString)) <> 0 Then Call ArcBackups(iString)
    Loop While Not Fstring.AtEndOfStream
    Fstring.Close
End If

Sub ArcBackups(BaseName)
'имя пользователя базы 1С:Предприятия
UserName = "root"
'пароль пользователя базы 1С:Предприятия
UserPass = "password"
'имя сервера 1С:Предприятия
ServerName = "srv2"
'имя базы 1С:Предприятия к которой подключаемся BaseName получаем как аргумент
' Код доступа к базе, нужен для доступа к ЗАБЛОКИРОВАННОЙ для новых подключений базе
LockPermissionCode = "123456"
' BckpDir - папка назначения, куда будем складывать выгрузки
BckpDir = "\\Backup\Backup_1C\DT\"& BaseName &"\"
' LogDir - папка куда будет писаться лог выгрузки и обновления
LogDir = "\\Backup\Backup_1C\DT\"& BaseName &"\log\"
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)


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
'''''''''''''''''''''''''''''
'проверяем существование папки для бэкапа и, если ее нет, создаем
Dim objFSO, objFolder, strDirectory
strDirectory = BckpDir

Set objFSO = CreateObject("Scripting.FileSystemObject")

If Not objFSO.FolderExists(strDirectory) Then
Set objFolder = objFSO.CreateFolder(strDirectory)
End If
' проверяем существование папки для лога и, если ее нет, создаем
Dim obj2FSO, obj2Folder, str2Directory
str2Directory = LogDir

Set obj2FSO = CreateObject("Scripting.FileSystemObject")

If Not obj2FSO.FolderExists(str2Directory) Then
Set obj2Folder = objFSO.CreateFolder(str2Directory)
End If

'Задаем формат имени файла бэкапа База_Дата_Час_Минута_ИмяСервера
FileName = BaseName & "_" & DateValue(date) & "_" & Hour(Now) & "_" &  Minute(Now) & "_" & ServerName
'строка запуска выгрузки
strComm  = """C:\Program Files (x86)\1cv8\8.3.8.1747\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /N"& UserName &" /P"& UserPass &" /UC"& LockPermissionCode &" /DumpIB "& BckpDir & FileName &".dt /Out "& LogDir & FileName &"_dump.log"""
' строка запуска обновления
' strComm2 = """C:\Program Files (x86)\1cv8\8.3.8.1747\bin\1cv8.exe"" CONFIG /S"& ServerName &"\"& BaseName &" /N"& UserName &" /P"& Userpass &" /UC"& LockPermissionCode &" /UpdateDBCfg /Out "& LogDir & FileName &"_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
End Sub
[/code]
1 Armando
 
12.10.16
09:20
Надо удалять сеансы, а не соединения
2 udarnic77
 
12.10.16
11:06
Пожалуйста, подскажите как это сделать в VBS
3 Armando
 
12.10.16
11:45
вот кусок моего скрипта
Sub TerminateSessions()
    Dim SessionInfo
  
    For Each SessionInfo in AgentConnection.GetInfoBaseSessions(ClusterInfo, InfoBaseShort)
        If Not SessionInfo.AppID = "COMConsole" Then
            AgentConnection.TerminateSession ClusterInfo, SessionInfo
        End If
    Next

End Sub
4 udarnic77
 
12.10.16
13:44
Можете показать весь скрипт, пожалуйста!
5 Armando
 
12.10.16
14:01
6 udarnic77
 
12.10.16
15:38
Спасибо.
Мой скрипт более "линейный", а знаний в VBS пока не хватает, чтобы вписать в свой скрипт разрыв всех сеансов к определенной базе.
Буду очень благодарен если кто-то поможет вписать...
7 Armando
 
13.10.16
11:34
Скорее всего этот скрипт писался для старых версий платформы, когда еще не было понятия Сеанс. Тут не просто вписать, а переписать скрипт надо с сохранением логики. В твоем скрипте идет перебор соединений в каждом рабочем процессе, с разрывом соединения. А надо перебирать сеансы кластера и удалять подходщие по условию.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн