Перед админом 1С всегда стоит задача выполнения ряда стандартных регламентных процедур. Можно выполнять их последовательно в ручном режиме, а можно воспользоваться удобным vbs-скриптом Что делает скрипт:
1. Предупреждает пользователей о необходимости завершить все выполняемые работы, давая 10 минут на завершение
2. Перезапускает службу агента сервера (10 минут на штатное завершение)
3. При наличии "зависших" процессов, завершает их аварийно.
4. Стартует службу агента сервера, делает выгрузку базы, тестирование и исправление.
5. Сохраняет лог, копирует лог по сети, зачищает старые архивные копии.
Большинство параметров опциональны, например можно не перегружать агент сервера, или не делать выгрузку.
В реальной базе этот файл создается самой 1С, параметры хранятся в справочнике, привязанном к узлам плана обмена, выполнение скриптом ициируется самой 1С в регламентном задании:
Ком = Новый COMObject("WScript.Shell");
Ком.Run("c:\confup_hh.vbs" + """");
Но можно править и применять внешний файл.
Добавлено (12.04.2010, 12:11)
---------------------------------------------
[i]' Инициализируем необходимые переменные
NetFile = "\\SERVER\backupfolder\confupdate_base.txt" 'Путь к log-файлу в сети
ServerName = "SERVER" 'Имя сервера БД
InfoBaseName = "base" 'Имя ИБ
FilePath = "C:\1c_backup\confupdate.vbs" 'Путь к текущему файлу
Folder = "C:\1c_backup\" 'Каталог для выгрузки
CountDB = 7 'За сколько дней хранить копии
Prefix = "base" 'Префикс файла выгрузки
Out = "C:\1c_backup\confupdate.txt" 'Путь к log-файлу
NeedRestartAgent = True ' Необходимость рестарта агента сервера
NeedDumpIB = True ' Необходимость выгрузки базы
NeedCopyFiles = False ' Необходимость выгрузки базы
NeedTestIB = True ' Необходимость тестирования базы
KlasterPortNumber = 1541 'Номер пора кластера
LockMessageText = "Please wait for database update" 'Текст сообщения о блокировки подключений к ИБ
LockPermissionCode = "BlockParam" 'Ключ для запуска заблокированной ИБ
ClasterAdminName = "" 'Имя администратора кластера
ClasterAdminPass = "" 'Пароль администратора кластера
InfoBasesAdminName = "" 'Имя администратора ИБ
InfoBasesAdminPass = "" 'Пароль администратора ИБ
UpdateFromStorage = ""
AuthStr = "/WA+"
TimeBeginLock = Now ' Время начала блокировки ИБ
TimeEndLock = DateAdd("h", 2, TimeBeginLock) ' Время окончания блокировки ИБ
TimeSleep = 600000
TimeSleepShort = 60000
Cfg = "" 'Путь к файлу с измененной конфигурацией
InfoCfgFile = "" 'Информация о файле обновления конфигурации
v8exe = "C:\Program Files\1cv81\bin\1cv8.exe" 'Путь к исполняемому файлу 1С:Предприятия 8.1
NewPass = "" 'Новый пароль администратора, обновляющего ИБ
FindInfoBase = False 'Флаг, что ИБ найдена
iDay = Day(Now)
mDay = CStr(Day(Now))
iMonth = Month(Now)
mMonth = CStr(Month(Now))
mYear = CStr(Year(Now))
nCDay = "_" + mYear + "_"
If iMonth < 10 Then
nCDay = nCDay + "0"
End If
nCDay = nCDay + mMonth + "_"
If iDay < 10 Then
nCDay = nCDay + "0"
End If
nCDay = nCDay + mDay
Set fs = CreateObject("Scripting.FileSystemObject")
Set OutFile = fs.OpenTextFile(Out, 8, True)
OutFile.WriteLine(CStr(Now) + " НАЧАЛО ОБНОВЛЕНИЯ КОНФИГУРАЦИИ")
OutFile.WriteLine(CStr(Now) + " Создание COM-коннектора")
Set ComConnector = CreateObject("v81.COMConnector")
OutFile.WriteLine(CStr(Now) + " Подключение к агенту сервера")
Set ServerAgent = ComConnector.ConnectAgent(ServerName)
' Получим массив кластеров сервера у агента сервера
OutFile.WriteLine(CStr(Now) + " Получение массива кластеров сервера у агента сервера")
Clasters = ServerAgent.GetClusters()
OutFile.WriteLine(CStr(Now) + " Начало завершения работы пользователей")
Добавлено (12.04.2010, 12:12)
---------------------------------------------
' Найдем необходимый нам кластер по IP адресу
OutFile.WriteLine(CStr(Now) + " Начало цикла нахождения необходимого кластера по известному IP-адресу")
For i = LBound(Clasters) To UBound(Clasters)
If Clasters(i).MainPort = KlasterPortNumber Then
OutFile.WriteLine(CStr(Now) + " Аутентикация к найденному кластеру: " + Clasters(i).Name)
ServerAgent.Authenticate Clasters(i), ClasterAdminName, ClasterAdminPass
' Получаем список рабочих процессов
OutFile.WriteLine(CStr(Now) + " Получение списка работающих рабочих процессов и обход в цикле")
WorkingProcesses = ServerAgent.GetWorkingProcesses(Clasters(i))
For j = LBound(WorkingProcesses) To UBound(WorkingProcesses)
If WorkingProcesses(j).Running = 1 Then
' Для каждого рабочего процесса создаем соединение с рабочим процессом
OutFile.WriteLine(CStr(Now) + " Создание соединения с рабочим процессом " + WorkingProcesses(j).HostName + ":" + CStr(WorkingProcesses(j).MainPort))
Set ConnectToWorkProcess = ComConnector.ConnectWorkingProcess("tcp://" + WorkingProcesses(j).HostName + ":" + CStr(WorkingProcesses(j).MainPort))
ConnectToWorkProcess.AuthenticateAdmin ClasterAdminName, ClasterAdminPass
ConnectToWorkProcess.AddAuthentication InfoBasesAdminName, InfoBasesAdminPass
If Not FindInfoBase Then
' Получаем список ИБ рабочего процесса
OutFile.WriteLine(CStr(Now) + " Получение списка ИБ рабочего процесса")
InfoBases = ConnectToWorkProcess.GetInfoBases()
OutFile.WriteLine(CStr(Now) + " Поиск нужной ИБ")
For h = LBound(InfoBases) To UBound(InfoBases)
' Ищем нужную базу
OutFile.WriteLine(CStr(Now) + " Обрабатывается ИБ: " + InfoBases(h).Name)
If InfoBases(h).Name = InfoBaseName Then
Set InfoBase = InfoBases(h)
FindInfoBase = True
OutFile.WriteLine(CStr(Now) + " Нашли нужную ИБ")
Exit For
End If
Next
If Not FindInfoBase Then
OutFile.WriteLine(CStr(Now) + " Не нашли нужную ИБ")
Exit For
End If
' Устанавливаем запрет на подключение новых соединений
OutFile.WriteLine(CStr(Now) + " Установка запрета на подключения к ИБ: " + InfoBase.Name)
InfoBase.ConnectDenied = True
InfoBase.DeniedFrom = TimeBeginLock
InfoBase.DeniedTo = TimeEndLock
InfoBase.DeniedMessage = LockMessageText
InfoBase.PermissionCode = LockPermissionCode
ConnectToWorkProcess.UpdateInfoBase(InfoBase)
' Устанавливаем задержку выполнения
OutFile.WriteLine(CStr(Now) + " Задержка перед началом завершения работы пользователей")
set WshShell = WScript.CreateObject("WScript.Shell")
WScript.Sleep TimeSleep
End If
OutFile.WriteLine(CStr(Now) + " Начало завершение работы пользователей с ИБ " + InfoBase.Name)
If FindInfoBase Then
' Получаем массив соединений с ИБ
Connections = ConnectToWorkProcess.GetInfoBaseConnections(InfoBase)
OutFile.WriteLine(CStr(Now) + " Обработка списка соединений")
For k = LBound(Connections) To UBound(Connections)
' Разрываем Connections с ИБ
OutFile.WriteLine(CStr(Now) + " Обрабатывается соединение: Пользователь " + Connections(k).UserName + ", компьютер " + Connections(k).HostName + ", установлено " + CStr(Connections(k).ConnectedAt) + ", режим " + Connections(k).AppID)
If Connections(k).AppID = "SrvrConsole" Then
' Не трогаем соединения консоли, оно никому не мешает
ElseIf Connections(k).AppID = "COMConsole" Then
' Не трогаем соединения консоли, оно никому не мешает
Else
ConnectToWorkProcess.Disconnect(Connections(k))
End If
Next
End If
OutFile.WriteLine(CStr(Now) + " Окончание завершения работы пользователей")
End If
Next
End If
Next
Добавлено (12.04.2010, 12:13)
---------------------------------------------
ComConnector = Null
ServerAgent = Null
Clasters = Null
WorkingProcesses = Null
ConnectToWorkProcess = Null
InfoBases = Null
InfoBase = Null
Connections = Null
If NeedRestartAgent Then
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
'Stop Service
strServiceName = "1C:Enterprise 8.1 Server Agent"
Set colListOfServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name ='" & strServiceName & "'")
For Each objService in colListOfServices
objService.StopService()
OutFile.WriteLine(CStr(objService.Name) + " Остановка службы сервера 1С Предприятия")
Next
WScript.Sleep TimeSleep
strProcessName = "ragent.exe"
Set colProcess = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = '" & strProcessName & "'")
For Each objProcess in colProcess
objProcess.Terminate()
OutFile.WriteLine(CStr(objProcess.Name) + " Завершение процесса агента сервера 1С Предприятия")
Next
strProcessName = "rmngr.exe"
Set colProcess = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = '" & strProcessName & "'")
For Each objProcess in colProcess
objProcess.Terminate()
OutFile.WriteLine(CStr(objProcess.Name) + " Завершение процесса менеджера сервера 1С Предприятия")
Next
strProcessName = "rphost.exe"
Set colProcess = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = '" & strProcessName & "'")
For Each objProcess in colProcess
objProcess.Terminate()
OutFile.WriteLine(CStr(objProcess.Name) + " Завершение рабочего процесса сервера 1С Предприятия")
Next
WScript.Sleep TimeSleepShort
'Start Service
strServiceName = "1C:Enterprise 8.1 Server Agent"
Set colListOfServices = objWMIService.ExecQuery ("Select * from Win32_Service Where Name ='" & strServiceName & "'")
For Each objService in colListOfServices
objService.StartService()
OutFile.WriteLine(CStr(objService.Name) + " Запуск службы сервера 1С Предприятия")
Next
WScript.Sleep TimeSleepShort
End If
If FindInfoBase Then
'Покажем свободное место на диске с исполняемым файлом 1С
OutFile.WriteLine(CStr(Now) + " " + ShowFreeSpace(v8exe))
'Покажем свободное место на диске с архивами
OutFile.WriteLine(CStr(Now) + " " + ShowFreeSpace(Folder))
OutFile.WriteLine(CStr(Now) + " Обновление конфигурации ИБ")
OutFile.Close()
Set Sh = CreateObject("WScript.Shell")
' Обновим конфигурацию БД
LineExe = """" + v8exe + """ DESIGNER /S""" + ServerName + ":" + CStr(KlasterPortNumber) + "\" + InfoBaseName + """ /UC""" + LockPermissionCode + """ /DisableStartupMessages " + AuthStr + UpdateFromStorage + " /UpdateDBCfg -Server /Out""" + Out + """ -NoTruncate"
Sh.Run LineExe, 5, True
Set OutFile = fs.OpenTextFile(Out, 8, True)
OutFile.WriteLine(CStr(Now) + " " + LineExe)
OutFile.Close()
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FolderExists(Folder) = False Then
FSO.CreateFolder Folder
End if
If NeedDumpIB = True Then
Set Sh = CreateObject("WScript.Shell")
' Сделаем выгрузку базы данных
LineExe = """" + v8exe + """ DESIGNER /S""" + ServerName + ":" + CStr(KlasterPortNumber) + "\" + InfoBaseName + """ /UC""" + LockPermissionCode + """ /DisableStartupMessages " + AuthStr + " /DumpIB""" + Folder + Prefix + nCDay + ".dt"" /Out""" + Out + """ -NoTruncate"
Sh.Run LineExe, 5, True
End if
If NeedTestIB = True Then
Set Sh = CreateObject("WScript.Shell")
' Протестируем базу данных и пересчитаем итоги
LineExe = """" + v8exe + """ DESIGNER /S""" + ServerName + ":" + CStr(KlasterPortNumber) + "\" + InfoBaseName + """ /UC""" + LockPermissionCode + """ /DisableStartupMessages " + AuthStr + " /IBCheckAndRepair -LogIntegrity -RecalcTotals /Out""" + Out + """ -NoTruncate"
Sh.Run LineExe, 5, True
End if
Set OutFile = fs.OpenTextFile(Out, 8, True)
If NeedDumpIB = True Then
OutFile.WriteLine(CStr(Now) + " " + LineExe)
End if
OutFile.WriteLine(CStr(Now) + " Установка разрешения подключения к ИБ")
FindInfoBase = False
Set ComConnector = CreateObject("v81.COMConnector")
Set ServerAgent = ComConnector.ConnectAgent(ServerName)
Clasters = ServerAgent.GetClusters()
Добавлено (12.04.2010, 12:14)
---------------------------------------------
'Установим разрешение на доступ к ИБ
For i = LBound(Clasters) To UBound(Clasters)
If Clasters(i).MainPort = KlasterPortNumber Then
ServerAgent.Authenticate Clasters(i), ClasterAdminName, ClasterAdminPass
WorkingProcesses = ServerAgent.GetWorkingProcesses(Clasters(i))
For j = LBound(WorkingProcesses) To UBound(WorkingProcesses)
If WorkingProcesses(j).Running = 1 Then
Set ConnectToWorkProcess = ComConnector.ConnectWorkingProcess("tcp://" + WorkingProcesses(j).HostName + ":" + CStr(WorkingProcesses(j).MainPort))
ConnectToWorkProcess.AuthenticateAdmin ClasterAdminName, ClasterAdminPass
ConnectToWorkProcess.AddAuthentication InfoBasesAdminName, InfoBasesAdminPass
' Получаем список ИБ рабочего процесса
InfoBases = ConnectToWorkProcess.GetInfoBases()
For h = LBound(InfoBases) To UBound(InfoBases)
' Ищем нужную базу
If InfoBases(h).Name = InfoBaseName Then
Set InfoBase = InfoBases(h)
FindInfoBase = True
Exit For
End If
Next
If FindInfoBase Then
' Устанавливаем разрешение на подключение соединений
InfoBase.ConnectDenied = False
InfoBase.DeniedMessage = ""
InfoBase.PermissionCode = ""
ConnectToWorkProcess.UpdateInfoBase(InfoBase)
Exit For
End If
End If
Next
End If
If FindInfoBase Then
Exit For
End If
Next
End If
Добавлено (12.04.2010, 12:14)
---------------------------------------------
OutFile.WriteLine(CStr(Now) + " Сохранение данных журнала регистрации")
Set ComConnector = CreateObject("V81.COMConnector")
'Set connection = ComConnector.Connect("Srvr=" + ServerName + ":" + CStr(KlasterPortNumber) + ";Ref=" + InfoBaseName + ";Usr=" + InfoBasesAdminName + ";Pwd=" + InfoBasesAdminPass)
Set connection = ComConnector.Connect("Srvr=" + ServerName + ":" + CStr(KlasterPortNumber) + ";Ref=" + InfoBaseName)
OutFile.WriteLine(CStr(Now) + " ЗАВЕРШЕНИЕ ОБНОВЛЕНИЯ КОНФИГУРАЦИИ")
OutFile.Close()
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile(Out, 1, False, -2)
Text = f.ReadAll
'Запишем всю информацию из log-файла в журнал регистрации
connection.WriteLogEvent "Регламентное обновление ИБ", connection.EventLogLevel.Information,,, Text
connection = Null
ComConnector = Null
f = Null
If NeedCopyFiles = True Then
Set fs = CreateObject("Scripting.FileSystemObject")
If fs.FileExists(NetFile) Then
fs.DeleteFile(NetFile)
End If
fs.MoveFile Out, NetFile
End if
If NeedDumpIB = True Then
CALL DelOldFiles(Folder, CountDB)
End if
' Функция для определения свободного места на диске
Function ShowFreeSpace(drvPath)
Dim fso, d, s
Set fso = CreateObject("Scripting.FileSystemObject")
Set d = fso.GetDrive(fso.GetDriveName(drvPath))
s = "Drive " & UCase(drvPath) & " - "
s = s & d.VolumeName & " "
s = s & "Free Space: " & FormatNumber(d.FreeSpace/1024/1024, 0)
s = s & " Mbytes"
ShowFreeSpace = s
End Function
' Скрипт для затирания устаревших файлов:
' Удаляет только файлы у которых сходятся префиксы
Sub DelOldFiles(Folder_Name, Stack_Depth)
Set WshShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(Folder_Name)
Set files = folder.Files
For Each f in files
fdate = f.DateCreated
fPrefix = Left(f.Name,Len(Prefix))
If ((Date - fdate) > Stack_Depth) And fPrefix = Prefix Then
f.Delete
End If
Next
End Sub
[/i]
Добавлено (12.04.2010, 12:23)
---------------------------------------------
Существует скрипт пакетного бэкапа 1С баз
Option Explicit
On Error Resume Next
Dim Base'элемент списка баз
Dim Bases'массив из элементов Base
Dim Folder'элемент списка папок для бэкапа
Dim Folders'массив из элементов Folders
Dim WeekDayNumber'переменная, в которую записывается номер дня недели
Dim ExePath'путь к бинарнику 1С
Dim FSO'файловый объект
Dim WSH
Dim UserName'переменная в которую загоняем имя пользователя 1С (обычно администратора)
Dim UserPass'пароль администратора
Dim IniFile'ini файл для пакетного запуска 1С
Dim TempPath'путь к временной папке, куда будут складоваться временный файл ini и файл лога текущей базы
Dim LogFile'файл лога этого скрипта
Dim LogPath'путь к файлу лога этого скрипта
Dim Log1C'поток лога 1С
Set Bases = CreateObject("Scripting.Dictionary")
Set Folders = CreateObject("Scripting.Dictionary")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("Wscript.Shell")
WeekDayNumber = WeekDay(Now, vbMonday)
ExePath = "C:\Program Files\1Cv77\BIN\1cv7.exe"
UserName = "Администратор"
UserPass = "пароль"
TempPath = "E:\1C_Backup\Time\"
LogPath = "E:\1C_Backup\log\"
'Прописываем архивируемые базы
Bases.Add "база1", "С:\Bases\база1"
Bases.Add "база2", "С:\Bases\база2"
'.....
'*********************************************************
'Прописываем куда архивировать
Folders.Add 1, "C:\1C_Backup\1_Понедельник\"
Folders.Add 2, "C:\1C_Backup\2_Вторник\"
Folders.Add 3, "C:\1C_Backup\3_Среда\"
Folders.Add 4, "C:\1C_Backup\4_Четверг\"
Folders.Add 5, "C:\1C_Backup\5_Пятница\"
Folders.Add 6, "C:\1C_Backup\6_Суббота\"
Folders.Add 7, "C:\1C_Backup\7_Воскресенье\"
'*********************************************************
'********************************************** ***********
'Здесь начинается формирование файла-лога данного скрипта
Set LogFile = FSO.CreateTextFile(LogPath & "1C_Backup_" & Date & ".log")
LogFile.WriteLine "***************************************"
LogFile.WriteLine "Запуск резервного копирования баз 1С..."
LogFile.WriteLine "***************************************"
'WScript.Echo "Задача запущена в" & Time & " " & Date
LogFile.WriteLine "Задача запущена в " & Time & " " & Date
LogFile.WriteLine "***************************************"
For Each Base In Bases 'Открываем цикл по базам
'Создаем конфигурационный файл для запуска пакетной выгрузки 1С
Set IniFile = FSO.CreateTextFile(TempPath & "UnLoad.ini")
IniFile.WriteLine "[General]"
IniFile.WriteLine "UnloadData = 1"
IniFile.WriteLine "Output = """ & TempPath & "UnLoad.log"""
IniFile.WriteLine "[UnloadData]"
IniFile.WriteLine "UnloadToFile = " & Folders.Item(WeekDayNumber) & Base & "(" & Date & ").zip"
IniFile.Close
WSH.Run """" & ExePath & """ CONFIG /D""" & Bases.Item(Base) & """ /N" & UserName & " /P" & UserPass & " /@""" & TempPath & "UnLoad.ini""", 1, True
'Удаление файла ini от уже обработанной базы
FSO.DeleteFile (TempPath & "UnLoad.ini")
'Чтение лога 1С и его перезапись в лог этого скрипта
LogFile.WriteLine "=================================================="
LogFile.WriteLine "Выгрузка базы данных " & Bases.Item(Base)
'If FSO.FileExists(TempPath & "UnLoad.log") Then
Set Log1C = FSO.GetFile(TempPath & "UnLoad.log").OpenAsTextStream(1, -2)
While Not Log1C.AtEndOfStream
LogFile.WriteLine Log1C.ReadLine
Wend
Log1C.Close
Next 'Конец цикла по базам
LogFile.WriteLine "*************************************************"
LogFile.WriteLine "Выгрузка баз 1С закончена в " & Time & " " & Date
LogFile.WriteLine "*************************************************"
LogFile.Close
FSO.DeleteFile (TempPath & "UnLoad.log")'удаление файла лога уже обработанной(последней) базы "на всякий случай"