Воскресенье
19.05.2024, 17:10

Приветствую Вас Гость | RSS


Главная Автоматизация регламентных работ 1С - Форум решения ваших проблем Регистрация Вход

Каталог статей

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум решения ваших проблем » Компьютеры. » СУБД » Автоматизация регламентных работ 1С (автоматизация регламентных работ 1С)
Автоматизация регламентных работ 1С
КартузДата: Понедельник, 12.04.2010, 12:23 | Сообщение # 1
Свой человек
Группа: Проверенные
Сообщений: 106
Репутация: 31
Статус: Offline
Перед админом 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")'удаление файла лога уже обработанной(последней) базы "на всякий случай"

 
У вас
Форум решения ваших проблем » Компьютеры. » СУБД » Автоматизация регламентных работ 1С (автоматизация регламентных работ 1С)
  • Страница 1 из 1
  • 1
Поиск:


Copyright by Shel © 2024