Иногда, для обновления информационной базы 1С или ещё каких-то технических работ на сервере, приходится отключать регламентные задания, особенно если эта самая база - что-то вроде 1С:Документооборота.
К сожалению, в консоли администрирования серверов 1С при редактировании параметров ИБ реквизиты "Начало" и "Конец" никак не влияют на активность галки "Блокировка регламентных заданий включена". То есть блокировка с начала сеансов пользователей после выхода текущего времени за границы вышеуказанных реквизитов будет снята (но галочка-то останется), а вот запуск регламентных задании так и не будет разрешён.
Выглядит это так: пользователи уже вошли в базу, пытаются работать, а, например, задачи их не пересылаются, процессы не стартуются, кокос не растёт и крокодил не ловится. Одним словом - катастрофа! На чём я пару раз и погорел, забыв вручную выключить блокировку регламентных заданий.
Вдохновившись статьей "Отключение регламентных заданий в копии базы", я решил поступить ровно наоборот, использовав замечательный инструментарий, который есть в доступности у каждого администратора. Powershell!
Ниже будет приведён код готового скрипта, который проверяет свойства нужной нам базы 1С. Если в ней заблокированы регламентные задания, а время вышло за указанные границы, то через подключение к объекту v83.COMConnector галка снимается, регламентные задания разблокируются.
$Server = "sr-1c-docob" #Имя сервера приложений 1С
$CheckIBName = "training_docob" #Имя базы, которую контролируем
$Login = "" #Администратор кластера 1С
$Password = "" #Пароль администратора кластера 1С
$MessageFolder = "\\someserver\import_messages" #Папка, куда выгружаем уведомление о включении РЗ
####################################################################
Function SendTelegramMessage ([STRING]$To, [STRING]$Text) {
$JSONText = @"
[{
"login": "$To",
"message": "$Text"
}]
"@
$JSONText | Out-File ("{0}\tgm_regjob_{1}.json" -f $MessageFolder, ($Id = [GUID]::NewGuid()))
}
Function IsEmptyDate([DateTime]$Date) {
Return ($Date -eq (New-Object DateTime (100, 1, 1, 0, 0, 0)))
}
Function CheckDateLimits([DateTime]$From, [DateTime]$To) {
$NowDate = Get-Date
If (!(IsEmptyDate($From)) -and !(IsEmptyDate($To)) -and ($NowDate -ge $From) -and ($NowDate -le $To)) { #Обе границы установлены, текущее время в их пределах
Return $True
}
ElseIf (!(IsEmptyDate($From)) -and (IsEmptyDate($To)) -and ($NowDate -ge $From)) { #Граница "С" установлена, текущее время больше
Return $True
}
ElseIf ((IsEmptyDate($From)) -and !(IsEmptyDate($To)) -and ($NowDate -le $To)) { #Граница "По" установлена, текущее время меньше
Return $True
}
Else {
Return $False
}
}
Try {
$v83 = New-Object -ComObject V83.COMConnector #Или V82.COMConnector
}
Catch {
#Write-Host("Не найден СОМ-объект")
Break
}
Try {
$Session = $v83.ConnectAgent($Server)
}
Catch {
#Write-Host("Не могу подключиться к серверу " + $Server)
Break
}
$Clusters = $Session.GetClusters()
$WorkingCluster = $Clusters[0]
Try {
$Session.Authenticate($WorkingCluster, $Login, $Password) #Здесь логин\пароль администратора кластера. Если вы его не забыли добавить. ;-)
}
Catch {
#Write-Host("Неудачная попытка аутентификации администратора кластера " + $Login)
Break
}
$WorkingProcess = $Session.GetWorkingProcesses($WorkingCluster)[0]
$ConnectionString = "{0}:{1}" -f $WorkingProcess.HostName, $WorkingProcess.MainPort
$WorkingProcessSession = $v83.ConnectWorkingProcess($ConnectionString)
$WorkingProcessSession.AddAuthentication($Login, $Password)
$CheckIB = $WorkingProcessSession.GetInfoBases() | Where {$_.Name -eq $CheckIBName}
If (($CheckIB) -and ($CheckIB.ScheduledJobsDenied)){ #"Мы нашли эту базу и у нее запрещены регламентные задания!"
$DateLimits = CheckDateLimits -From $CheckIB.DeniedFrom -To $CheckIB.DeniedTo #Проверяем границы начала и конца блокировки
Write-Host("DateLimits $DateLimits")
#Write-Host("Lets do it! From {0} To {1} is ok? {2}" -f $CheckIB.DeniedFrom, $CheckIB.DeniedTo, !$DateLimits)
If (!$DateLimits) {
$CheckIB.ScheduledJobsDenied = $False
$WorkingProcessSession.UpdateInfoBase($CheckIB)
$MessageText = "Включены регламентные задания для базы <code>{0}</code> на сервере <code>{1}</code>" -f $CheckIB.Name, $WorkingProcess.HostName
SendTelegramMessage -To "Адресат_Сообщения" -Text $MessageText
}
else {
#Write-Host("В базе {0} установлены действующие на текущий момент границы начала и конца блокировки" -f $CheckIBName)
}
}
Else {
#Write-Host("Не найдено базы {0} или регламентные задания в ней не остановлены" -f $CheckIBName)
}
В начале скрипта не забываем инициализировать переменные, указав имя сервера, базы, логин и пароль администратора кластера 1С (если у вас он заведён). Если версия платформы 1С - 8.2, тогда меняем имя объекта. В тексте скрипта оставлены закомментированные процедуры вывода информационных сообщений на случай, если захотите поиграться в консоли, знакомясь с работой скрипта. В конце скрипта присутствует вызов функции SendTelegramMessage(), генерирующей файл с уведомлением об включении регламентных заданий - её можно смело удалить. Ну или переделать под себя.
Настроив скрипт, можно добавить его выполнение на сервере приложений (есть и другие варианты) в "Планировщик задач" c расписанием на выполнение каждые 5 минут.
Напоминаю, что запускать в качестве программы мы будем "powershell.exe".
Рабочие аргументы:
-executionpolicy Unrestricted -WindowStyle Hidden -file "Путь_к_файлу_со_скриптом.ps1"
Итак, ещё раз, что мы получаем в итоге? Установив вручную в консоли администрирования блокировку начала сеансов пользователей и блокировку регламентных заданий, время их начала и конца, мы можем смело заниматься своими делами, забыв о том, что где-то надо будет снять галочку. Регулярно запускаемый планировщиком задач скрипт проверит время и по выходу из установленных границ отключит блокировку у регламентных заданий.
Прикреплённый файл полностью соответствует листингу скрипта.