Автоматизация управления сеансами и блокировками 1С через скрипты RAC
- Невозможно выполнить монопольное резервное копирование базы данных из-за неудаленных пользовательских сеансов.
- Зависшие фоновые задания блокируют таблицы СУБД и потребляют память.
- Необходимость регламентной установки блокировки регламентных заданий (Scheduled Jobs Lock) перед ночным ТО.
1. Архитектура скриптового управления через RAC
Утилита rac позволяет полностью автоматизировать жизненный цикл информационных баз без использования графического интерфейса. Скрипты могут выполняться планировщиком Cron или CI/CD агентами (GitLab Runner, Jenkins).
2. Bash-скрипт: Блокировка соединений и сброс активных сеансов
Создайте скрипт /opt/scripts/1c_lock_and_kill.sh:
#!/usr/bin/env bash
set -euo pipefail
RAS_HOST="localhost:1545"
CLUSTER_ID="4c38d5e8-1111-2222-3333-555566667777"
INFOBASE_NAME="trade_production"
ADMIN_USER="Admin"
ADMIN_PWD="StrongPass"
# 1. Получение ID информационной базы
INFOBASE_ID=$(rac infobase --cluster="$CLUSTER_ID" summary list "$RAS_HOST" | \
awk -v name="$INFOBASE_NAME" '$1=="infobase" {id=$3} $1=="name" && $3==name {print id}')
echo "Найдена база $INFOBASE_NAME с ID: $INFOBASE_ID"
# 2. Установка блокировки начала сеансов и регламентных заданий
rac infobase --cluster="$CLUSTER_ID" update \
--infobase="$INFOBASE_ID" \
--infobase-user="$ADMIN_USER" --infobase-pwd="$ADMIN_PWD" \
--sessions-denied=on \
--scheduled-jobs-denied=on \
--denied-message="База заблокирована на регламентное обслуживание до 06:00" \
--permission-code="BackupPass" \
"$RAS_HOST"
echo "Блокировка сеансов успешно включена."
# 3. Принудительное завершение всех открытых пользовательских сеансов
rac session --cluster="$CLUSTER_ID" summary list "$RAS_HOST" | \
awk -v base_id="$INFOBASE_ID" '$1=="session" {sid=$3} $1=="infobase" && $3==base_id {print sid}' | \
while read -r SESSION_ID; do
echo "Завершение сеанса: $SESSION_ID"
rac session --cluster="$CLUSTER_ID" terminate --session="$SESSION_ID" "$RAS_HOST" || true
done
echo "Все активные сеансы завершены."
3. Bash-скрипт: Снятие блокировки соединений
#!/usr/bin/env bash
# Снятие блокировки после завершения бэкапа
rac infobase --cluster="$CLUSTER_ID" update \
--infobase="$INFOBASE_ID" \
--infobase-user="$ADMIN_USER" --infobase-pwd="$ADMIN_PWD" \
--sessions-denied=off \
--scheduled-jobs-denied=off \
"$RAS_HOST"
echo "Блокировка базы успешно снята."
4. Назначение прав и запуск по расписанию в Cron
chmod +x /opt/scripts/1c_lock_and_kill.sh
# Добавление в /etc/crontab (запуск в 23:00)
0 23 * * * usr1cv8 /opt/scripts/1c_lock_and_kill.sh >> /var/log/1c_maint.log 2>&1 Частые вопросы (FAQ)
Что такое Permission Code (код разрешения) при блокировке?
Код разрешения (/UC ключ) позволяет администратору или скрипту бэкапа подключиться к заблокированной информационной базе, передав параметр строки запуска /UC<КодРазрешения>.
Чем отличается session terminate от connection terminate?
Session terminate завершает логический сеанс пользователя на сервере 1С с корректным освобождением лицензии. Connection terminate разрывает физический TCP-сокет рабочего процесса.
Как автоматически удалить только зависшие (неактивные) сеансы?
В выводе команды rac session list анализируйте параметры idle-time (время бездействия) и last-active-time, фильтруя завершение сеансов только с idle-time > 3600 сек.
Можно ли отключить регламентные задания без блокировки входа пользователей?
Да, флаги независимы. Для отключения фоновых задач укажите параметр --scheduled-jobs-denied=on, оставив --sessions-denied=off.