Включение регламентных заданий ИБ 1С для забывчивых администраторов

Используем скрипт на Powershell, чтобы больше не забывать включать регламентные задания 1С после обновления.

Иногда, для обновления информационной базы 1С или ещё каких-то технических работ на сервере, приходится отключать регламентные задания, особенно если эта самая база — что-то вроде 1С:Документооборота.

К сожалению, в консоли администрирования серверов 1С при редактировании параметров ИБ реквизиты "Начало" и "Конец" никак не влияют на активность галки "Блокировка регламентных заданий включена". То есть блокировка с начала сеансов пользователей после выхода текущего времени за границы вышеуказанных реквизитов будет снята (но галочка-то останется), а вот запуск регламентных задании так и не будет разрешён.

 

Редактирование свойств информационной базы в консоли администрирования сервера 1С

Выглядит это так: пользователи уже вошли в базу, пытаются работать, а, например, задачи их не пересылаются, процессы не стартуются, кокос не растёт и крокодил не ловится. Одним словом — катастрофа! На чём я пару раз и погорел, забыв вручную выключить блокировку регламентных заданий.

Вдохновившись статьей "Отключение регламентных заданий в копии базы", я решил поступить ровно наоборот, использовав замечательный инструментарий, который есть в доступности у каждого администратора. Powershell!

Ниже будет приведён код готового скрипта, который проверяет свойства нужной нам базы 1С. Если в ней заблокированы регламентные задания, а время вышло за указанные границы, то через подключение к объекту v83.COMConnector галка снимается, регламентные задания разблокируются.

 

$Server = "sr-1c-docob" #Имя сервера приложений 1С
$CheckIBName = "training_docob" #Имя базы, которую контролируем
$Login = "" #Администратор кластера 1С
$Password = "" #Пароль администратора кластера 1С

$MessageFolder = "\someserverimport_messages" #Папка, куда выгружаем уведомление о включении РЗ

####################################################################

Function SendTelegramMessage ([STRING]$To, [STRING]$Text) {
$JSONText = @"
[{
"login": "$To",
"message": "$Text"
}]
"@

$JSONText | Out-File ("{0}	gm_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"

Итак, ещё раз, что мы получаем в итоге? Установив вручную в консоли администрирования блокировку начала сеансов пользователей и блокировку регламентных заданий, время их начала и конца, мы можем смело заниматься своими делами, забыв о том, что где-то надо будет снять галочку. Регулярно запускаемый планировщиком задач скрипт проверит время и по выходу из установленных границ отключит блокировку у регламентных заданий.

Прикреплённый файл полностью соответствует листингу скрипта.

2 Comments

  1. VmvLer

    неплохо, правда после обновления боевой конфигурации практически в каждой типовой запускается обработка обновления которая будет висеть «вечно» с табличкой «не завершен переход на новую версию» если не сняли галку блока регл. заданий.

    после обновления первый запуск должен выполнить админ.

    так что даже если у админа склероз, то очень быстро его память воостановиться или ее восстановят добрые пользователи с предложением «эээ, ну ты заходи если чо».

    так же сомнительно вставлять в скрипт админские пароли в открытом виде.

    конечно, сам скрип будет в надежном месте и т.д., а если нет, а если кто-то увидит?

    Reply
  2. semagin@gmail.com

    (1)у нас почти ежедневные доработки конфигураций. И никаких новых релизов.

    Про надежность скрипта и пароль: пользуйтесть виндоуз-аутентификацией. И не разбрасывайтесть доступом к серверу и скриптам.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *