Принудительное завершение сеансов в 1С 8.3: консоль, rac, блокировка и СУБД

· 9 мин

Содержание

Чтобы выгнать пользователей из 1С и не дать им тут же зайти обратно, нужны два действия: сначала включить блокировку начала сеансов, потом завершить уже открытые сеансы. В клиент-серверной базе оба делаются в консоли администрирования серверов 1С или утилитой rac. В типовых конфигурациях на БСП есть своя форма: Администрирование → Обслуживание → Блокировка работы пользователей.

Если просто удалить сеансы без блокировки, через минуту бухгалтер перезапустит 1С, и обновление снова упрётся в «базу используют другие пользователи». Ниже — все рабочие способы: вручную, скриптом, по расписанию и на уровне СУБД, плюс разбор ситуаций, когда сеанс «не убивается».

Когда нужен монопольный режим и почему мешают сеансы

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

  • 🔧 обновление конфигурации базы данных с реструктуризацией таблиц;
  • 📦 загрузка информационной базы из файла .dt;
  • 🩺 тестирование и исправление информационной базы;
  • 🔄 часть операций обработки «Обновление информационной базы» после установки релиза.

Пока в базе есть хотя бы один чужой сеанс, Конфигуратор не сможет установить монопольный режим и выдаст сообщение о том, что с базой работают другие пользователи.

Сеансами считаются не только открытые окна бухгалтеров. Мешать могут:

  • 👤 тонкие и толстые клиенты, в том числе «забытые» на терминальном сервере;
  • 🌐 веб-клиент и HTTP-сервисы через публикацию на веб-сервере;
  • 🔌 COM-соединения от внешних систем и обменов;
  • ⏰ фоновые и регламентные задания;
  • 🛠 второй открытый Конфигуратор.

Поэтому порядок всегда один: запретить новые входы → отключить регламентные задания → завершить текущие сеансы → выполнить работу → снять блокировку.

Блокировка сеансов и выгон пользователей средствами самой 1С

Это самый мягкий способ. Пользователи получают предупреждение и успевают сохранить документы.

Форма «Блокировка работы пользователей» (БСП)

Работает в БП 3.0, ЗУП 3.1, УТ 11, КА, ERP и других конфигурациях на БСП.

  1. Откройте Администрирование → Обслуживание.
  2. Перейдите по ссылке «Блокировка работы пользователей».
  3. Заполните сообщение для пользователей, время начала и окончания блокировки.
  4. При необходимости задайте код разрешения: с ним администратор сможет войти в заблокированную базу.
  5. Нажмите «Установить блокировку».

После установки открытые клиенты получают предупреждение и через несколько минут завершаются сами. В клиент-серверном варианте программа может запросить логин и пароль администратора кластера: без них она не сможет управлять блокировкой на сервере.

Чтобы потом войти в заблокированную базу, добавьте к строке запуска параметр /UC<код разрешения>, например /UCservice2024. В списке баз это делается в поле «Дополнительные параметры запуска».

Параметры запуска /C ЗавершитьРаботуПользователей

Те же действия можно запустить без открытия формы. БСП понимает параметр командной строки:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv1c\buh" /N"Администратор" /P"пароль" /C"ЗавершитьРаботуПользователей"

Сеанс установит блокировку и будет ждать, пока остальные пользователи выйдут. Обратная команда — /C"РазрешитьРаботуПользователей". Этим пользуются в bat-файлах перед ночным обновлением.

Список активных пользователей

Посмотреть, кто сидит в базе, можно в Конфигураторе: Администрирование → Активные пользователи. В пользовательском режиме на БСП — Администрирование → Обслуживание → Активные пользователи. Из формы БСП можно завершить выбранный сеанс, в клиент-серверной базе — с вводом пароля администратора кластера.

Как выгнать пользователей через консоль администрирования серверов 1С

Для клиент-серверной базы это основной инструмент. Консоль ставится вместе с сервером 1С и называется «Администрирование серверов 1С Предприятия».

Если консоль не открывается или пишет об ошибке создания объекта, зарегистрируйте её библиотеку от имени администратора: regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\radmin.dll", где 8.3.xx.xxxx — номер вашей платформы.

Шаг 1. Запретить новые входы

  1. Раскройте Центральные серверы 1С:Предприятия → <сервер> → Кластеры → <кластер> → Информационные базы.
  2. Откройте свойства нужной базы.
  3. Поставьте флажок «Блокировка начала сеансов включена».
  4. Заполните «Сообщение о блокировке» и «Код разрешения».
  5. Отдельно включите «Блокировка регламентных заданий включена».
  6. Нажмите «ОК».

Поля «Начало» и «Конец» задают окно блокировки. Если оставить их пустыми, блокировка действует сразу и до ручного снятия.

Шаг 2. Удалить текущие сеансы

  1. Раскройте базу и выберите ветку «Сеансы».
  2. Выделите все строки (Ctrl+A).
  3. В контекстном меню выберите «Удалить».

У пользователя клиент закроется с сообщением о завершении сеанса администратором. Несохранённые изменения в открытых формах пропадут.

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

Шаг 3. Проверить соединения

Если после удаления сеансов Конфигуратор всё равно не получает монопольный доступ, проверьте ветку «Соединения». Иногда висит соединение без сеанса, например от зависшего обмена. Его тоже можно разорвать из контекстного меню.

Скрипты: rac, PowerShell и COM-соединение

Консоль удобна для разового выгона. Для регулярной работы лучше скрипт.

Утилита rac

rac работает через сервер администрирования ras. Его нужно запустить на сервере 1С, по умолчанию он слушает порт 1545. Разово можно стартовать так:

"C:\Program Files\1cv8\8.3.xx.xxxx\bin\ras.exe" cluster --port=1545

Для постоянной работы ras регистрируют службой Windows. Дальше последовательность команд:

rem 1. Узнать UUID кластера
rac localhost:1545 cluster list

rem 2. Узнать UUID базы
rac localhost:1545 infobase summary list --cluster=<uuid_кластера>

rem 3. Включить блокировку сеансов и регламентных заданий
rac localhost:1545 infobase update --cluster=<uuid_кластера> --infobase=<uuid_базы> ^
  --infobase-user="Администратор" --infobase-pwd="пароль" ^
  --sessions-deny=on --scheduled-jobs-deny=on ^
  --denied-message="Обновление базы, вход закрыт до 22:30" --permission-code="service"

rem 4. Список сеансов базы
rac localhost:1545 session list --cluster=<uuid_кластера> --infobase=<uuid_базы>

rem 5. Завершить сеанс
rac localhost:1545 session terminate --cluster=<uuid_кластера> --session=<uuid_сеанса>

Если на кластере заданы администраторы, к каждой команде с --cluster добавьте --cluster-user и --cluster-pwd. Снимают блокировку той же командой infobase update с --sessions-deny=off --scheduled-jobs-deny=off. Полный список ключей покажет rac help session или rac help infobase.

PowerShell: завершить все сеансы одной базы

rac выводит блоки «ключ : значение», разделённые пустыми строками. Скрипт ниже находит базу по имени и завершает все её сеансы:

$rac  = "C:\Program Files\1cv8\8.3.xx.xxxx\bin\rac.exe"
$addr = "localhost:1545"
$base = "buh"

$cluster = ((& $rac $addr cluster list) | Select-String '^cluster\s+:\s+(\S+)').Matches[0].Groups[1].Value

$ibList = (& $rac $addr infobase summary list --cluster=$cluster) -join "`n"
$ib = ($ibList -split "`n`n" | Where-Object { $_ -match "name\s+:\s+$base\s*$" }) |
      Select-String 'infobase\s+:\s+(\S+)' | ForEach-Object { $_.Matches[0].Groups[1].Value }

$sessions = (& $rac $addr session list --cluster=$cluster --infobase=$ib) |
            Select-String '^session\s+:\s+(\S+)' | ForEach-Object { $_.Matches[0].Groups[1].Value }

foreach ($s in $sessions) {
    & $rac $addr session terminate --cluster=$cluster --session=$s
    Write-Output "Завершён сеанс $s"
}

Перед боевым запуском выполните скрипт без последнего цикла и посмотрите, какие UUID он нашёл. Имя базы в $base должно совпадать с именем в кластере, а не с названием в списке баз пользователя.

COM-соединение из внешней обработки

Если ras поднимать не хочется, кластером можно управлять из кода 1С через V83.COMConnector. Компоненту регистрируют командой regsvr32 comcntr.dll из каталога bin платформы. Код внешней обработки, выполняемый на клиенте под Windows:

Коннектор = Новый COMОбъект("V83.COMConnector");
Агент = Коннектор.ConnectAgent("tcp://srv1c:1540");
Кластер = Агент.GetClusters()[0];
Агент.Authenticate(Кластер, "", ""); // логин и пароль администратора кластера

Для Каждого Сеанс Из Агент.GetSessions(Кластер) Цикл
    Если НРег(Сеанс.InfoBase.Name) = "buh" И Сеанс.AppID <> "SrvrConsole" Тогда
        Агент.TerminateSession(Кластер, Сеанс);
    КонецЕсли;
КонецЦикла;

Условие по AppID защищает от удаления сеанса самой консоли. Тот же объект умеет выдать список баз и изменить их свойства, но для блокировки входа проще пользоваться rac.

Файловая база: как выгнать пользователей без сервера 1С

У файловой базы нет кластера и консоли. Варианты такие.

СпособКогда подходитРиск
Блокировка через форму БСПТиповая конфигурация, пользователи работаютМинимальный: клиенты закрываются сами
Завершение процесса 1cv8.exe на терминальном сервереСеанс завис и не реагируетПотеря несохранённых данных
Закрытие открытого файла в «Управление компьютером → Общие папки → Открытые файлы»База на файловом сервере, кто-то держит 1Cv8.1CDВозможна порча базы при записи

Блокировка файловой базы хранится в файле 1Cv8.cdn в каталоге базы. Если после работ блокировка не снимается, а форма БСП недоступна, этот файл удаляют вручную, когда в базе никого нет.

Принудительно закрытый в момент записи файл 1Cv8.1CD может оказаться повреждённым. После такого выгона запустите тестирование и исправление информационной базы и обязательно имейте свежую выгрузку .dt.

Зависшие блокировки на уровне СУБД

Бывает, что сеансов 1С уже нет, а в СУБД висит транзакция и держит блокировки таблиц. Это крайняя мера: разрыв соединения на уровне СУБД откатывает транзакцию рабочего процесса и может оборвать работу других сеансов, которые обслуживает тот же процесс rphost. Делайте это только при закрытой для входа базе.

MS SQL Server

Найти соединения с базой:

EXEC sp_who2;
-- или точнее
SELECT session_id, login_name, host_name, status
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID('buh');

Разорвать конкретное соединение: KILL 57;, где 57 — номер session_id.

Отключить сразу всех с откатом транзакций:

ALTER DATABASE [buh] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- после работ
ALTER DATABASE [buh] SET MULTI_USER;

Не оставляйте базу в режиме SINGLE_USER: сервер 1С не сможет к ней подключиться, пока режим не вернут в MULTI_USER.

PostgreSQL

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'buh' AND pid <> pg_backend_pid();

После разрыва соединений на стороне СУБД рабочий процесс 1С переподключится сам. Если этого не произошло, перезапуск службы «Агент сервера 1С:Предприятия» решит вопрос, но оборвёт сеансы всех баз кластера. Делайте это вне рабочего времени.

Автоматический выгон пользователей по расписанию

Типовой сценарий — ночное обновление или бэкап. Его собирают из bat-файла и планировщика заданий Windows.

Порядок ночного скрипта

  1. В 22:00 — rac infobase update ... --sessions-deny=on --scheduled-jobs-deny=on с сообщением для пользователей.
  2. В 22:10 — цикл session terminate по всем сеансам базы.
  3. Выгрузка или обновление через 1cv8.exe DESIGNER с параметром /UC<код разрешения>.
  4. Снятие блокировки: --sessions-deny=off --scheduled-jobs-deny=off.
  5. Запись результата в лог и уведомление администратору.

Паузу между блокировкой и выгоном оставьте: за 10 минут люди успеют провести документы. Если блокировку ставите через БСП, задайте время начала в форме заранее, днём: тогда программа сама предупредит пользователей.

Настройка задания в планировщике

  • запускать от учётной записи, у которой есть доступ к rac и права администратора кластера;
  • включить «Выполнять вне зависимости от регистрации пользователя»;
  • не хранить пароли открытым текстом в общем каталоге: держите bat-файл в папке с доступом только для администраторов.
Перед ночным выгоном пользователей
Выполнено: 0 / 6

Почему сеансы не завершаются и как это исправить

Диагностика: выберите симптом

Частые вопросы

Можно ли выгнать одного конкретного пользователя, не трогая остальных?
Да. В консоли администрирования откройте «Сеансы» базы, найдите строку по имени пользователя и компьютеру и удалите только её. Через rac — session terminate с UUID этого сеанса.
Сохранятся ли данные пользователя, которого выгнали?
Записанные и проведённые документы останутся. Пропадут только изменения в открытых и ещё не записанных формах.
Освобождается ли лицензия при завершении сеанса?
Да, сеанс перестаёт занимать клиентскую лицензию сразу после завершения. Проверить, кто держит лицензии, можно командой rac session list с ключом –licenses.
Что увидит пользователь, если попробует войти во время блокировки?
Вход будет отклонён, а на экране появится текст из поля «Сообщение о блокировке». Поэтому пишите в нём причину и время, когда база снова станет доступна.
Чем отличается удаление сеанса от удаления соединения в консоли?
Сеанс — это работа пользователя с базой, соединение — сетевое подключение клиента к рабочему процессу. Удаление сеанса закрывает клиент пользователя. Соединение удаляют, когда сеанса уже нет, а подключение осталось висеть.