Зависший сеанс в 1С: как завершить его и не сломать базу

· 9 мин

Содержание

Сеанс пользователя в клиент-серверной 1С сбрасывают в консоли администрирования серверов: Кластер → Информационные базы → <база> → Сеансы, правой кнопкой по строке → «Удалить». Без консоли то же делает команда rac session terminate с идентификатором сеанса. В файловой базе кластера нет, там сеанс снимают через форму «Активные пользователи» в самой программе или закрывают открытый файл базы на сервере.

Частое заблуждение — искать кнопку завершения в Конфигураторе. Список Администрирование → Активные пользователи в Конфигураторе только показывает, кто в базе. Сбросить оттуда сеанс пользователя нельзя.

Как найти нужный сеанс и понять, что он завис

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

  • 👤 Пользователь — имя из списка пользователей базы;
  • 💻 Компьютер — имя машины или терминального сервера;
  • 🧩 Приложение — тип клиента: 1CV8C (тонкий клиент), 1CV8 (толстый), WebClient, Designer (Конфигуратор), BackgroundJob (фоновое задание), COMConnection;
  • 🕐 Время начала и последней активности;
  • 😴 Спящий — признак, что клиент отвалился, а сеанс ждёт переподключения.

Признаки того, что сеанс действительно завис:

  1. Пользователь клянётся, что 1С у него закрыта, а строка с его именем висит.
  2. Последняя активность была час назад, а сеанс держит блокировку и мешает обновлению.
  3. Сеанс помечен как спящий и не исчезает дольше, чем задано в свойствах базы.

Сеанс и соединение — разные вещи. Сеанс отвечает за лицензию и данные пользователя. Соединение — канал к рабочему процессу. Удалять нужно именно сеанс: соединение после этого закроется само.

Сброс сеанса пользователя через консоль кластера

Консоль администрирования серверов 1С:Предприятия — оснастка MMC, она ставится вместе с сервером или отдельно компонентом «Администрирование сервера 1С:Предприятия».

Пошагово

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

Если нужно сбросить все сеансы сразу, выделите первую строку, затем последнюю с зажатым Shift и удалите группу.

Чтобы пользователь не вошёл заново

Удалённый сеанс тонкий клиент часто тут же пересоздаёт. Если база нужна вам монопольно, сначала закройте вход:

  1. Правой кнопкой по базе → «Свойства».
  2. Отметьте «Блокировка начала сеансов включена», заполните сообщение и «Код разрешения».
  3. При необходимости отметьте «Блокировка регламентных заданий включена» — иначе фоновые задания будут стартовать снова.
  4. Теперь удаляйте сеансы.

Администратор входит в заблокированную базу с параметром запуска /UC<код разрешения>.

Если консоль не открывается или не видит сервер, перерегистрируйте компонент той же версии, что и сервер: regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\radmin.dll" в командной строке от администратора. Версии консоли и кластера должны совпадать.

Командная строка rac и ras: завершение сеанса по ID

Когда сервер на Linux или нет доступа к MMC, работают утилиты ras (сервер администрирования) и rac (клиент). Обе лежат в каталоге bin установленной платформы.

Шаг 1. Запустите ras

rac не ходит в кластер напрямую — только через ras. Порт по умолчанию — 1545, агент сервера слушает 1540.

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

Чтобы не запускать вручную, зарегистрируйте ras службой:

sc create "1C:Enterprise 8.3 Remote Server" binPath= "\"C:\Program Files\1cv8\8.3.xx.xxxx\bin\ras.exe\" cluster --service --port=1545 localhost:1540" start= auto

На Linux ras запускают так же, с ключом --daemon.

Шаг 2. Получите список сеансов

rac cluster list localhost:1545
rac infobase summary list --cluster=<uuid-кластера> localhost:1545
rac session list --cluster=<uuid-кластера> --infobase=<uuid-базы> localhost:1545

Первая команда даёт UUID кластера, вторая — UUID баз, третья — сеансы. Каждый сеанс выводится блоком строк вида ключ : значение. Нужны поля session (идентификатор), user-name, host, app-id.

Если на кластере назначен администратор, добавляйте к командам --cluster-user=<имя> --cluster-pwd=<пароль>.

Шаг 3. Завершите сеанс по ID

rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса> localhost:1545

Пустой вывод означает успех. Проверьте повторным rac session list — строки с этим UUID быть не должно. Полный список параметров конкретной версии смотрите в rac help session.

Сброс изнутри базы и в файловом варианте

Форма «Активные пользователи»

В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) завершить чужой сеанс можно без консоли: Администрирование → Обслуживание → ссылка «Активные пользователи». Выделите строку → команда «Завершить сеанс».

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

Там же, в Администрирование → Обслуживание, есть «Блокировка работы пользователей» — аналог блокировки начала сеансов в консоли.

Открытые файлы Windows

Файловая база на общей папке держит файл 1Cv8.1CD открытым, пока у пользователя запущена 1С. Если клиент повис на чужом компьютере:

  1. На сервере с папкой откройте Управление компьютером → Служебные программы → Общие папки → Открытые файлы.
  2. Найдите 1Cv8.1CD с именем нужного пользователя.
  3. Правой кнопкой → «Закрыть открытый файл».

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

Терминальный сервер

Если 1С работает через RDP, проще завершить процесс пользователя: Диспетчер задач → вкладка «Пользователи» → пользователь → процесс 1cv8c.exe или 1cv8.exe → «Снять задачу». Радикальный вариант — «Выйти» для всего его сеанса Windows.

СпособКогда подходитРиски
Консоль кластераКлиент-сервер, есть доступ к серверуМинимальные, теряются несохранённые данные пользователя
rac session terminateLinux, удалённое администрирование, скриптыТе же; нужен запущенный ras
«Активные пользователи»Нет доступа к серверу, есть права администратора базыЗависший клиент может не отреагировать
Открытые файлы WindowsФайловая база на общей папкеОбрыв записи в момент закрытия
Снятие процесса на RDPТерминальный серверПользователь теряет всё открытое
Перезапуск службы сервераНичего из перечисленного не помоглоОбрываются сеансы всех пользователей всех баз кластера

Если сеанс не сбрасывается: перезапуск служб

Бывает, что строка после удаления возвращается или консоль сообщает об ошибке. Сначала исключите простые причины: сеанс пересоздал клиент (включите блокировку начала сеансов) или это фоновое задание, которое запускается по расписанию (включите блокировку регламентных заданий).

Если сеанс висит всё равно, остаётся служба агента сервера.

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

Порядок действий

  1. Разошлите предупреждение и дождитесь, пока пользователи выйдут.
  2. Откройте services.msc, найдите службу «Агент сервера 1С:Предприятия 8.3 (x86-64)» — в старых установках она называется 1C:Enterprise 8.3 Server Agent (x86-64).
  3. Остановите службу. Проверьте в Диспетчере задач, что процессы ragent.exe, rmngr.exe и rphost.exe завершились. Оставшиеся снимите вручную.
  4. Если зависания повторяются, очистите кеш сеансовых данных: в каталоге кластера srvinfo\reg_1541 удалите папки snccntx*. По умолчанию srvinfo лежит в C:\Program Files\1cv8\srvinfo. Файл 1CV8Clst.lst и папки баз не трогайте — в них реестр кластера.
  5. Запустите службу и проверьте список сеансов.

На Linux те же шаги делаются через systemctl для службы srv1cv8 соответствующей версии.

Снятие одного процесса rphost.exe вместо перезапуска службы — не меньший риск. Один рабочий процесс обслуживает сеансы многих пользователей, и все они оборвутся.

SQL: что можно сделать на стороне СУБД

Встречается совет «удалить сеанс прямо в базе данных SQL-запросом». Так не получится: сеансы 1С живут в памяти кластера и в его служебных файлах, а не в таблицах информационной базы. Править служебные таблицы 1С в SQL нельзя — это прямой путь к повреждению базы.

На уровне СУБД есть другое действие — разорвать соединение рабочего процесса, которое держит блокировку или долгую транзакцию:

  • MS SQL Server: найдите процесс в мониторе активности или через sp_who2, затем KILL <spid>.
  • PostgreSQL: найдите строку в pg_stat_activity, затем SELECT pg_terminate_backend(<pid>);.
-- PostgreSQL: соединения к базе, где транзакция открыта дольше 10 минут
SELECT pid, usename, state, xact_start, query
FROM pg_stat_activity
WHERE datname = 'buh_base'
  AND xact_start < now() - interval '10 minutes';

Транзакция откатится, блокировка снимется. Но сеанс 1С при этом не исчезнет, а у пользователей этого рабочего процесса может возникнуть ошибка. Это инструмент для ситуации «база стоит из-за одной транзакции», а не замена удалению сеанса в консоли.

Скрипт для массового сброса сеансов

Перед ночным обновлением или выгрузкой удобно снимать все сеансы базы одной командой. Пример на PowerShell через rac:

$rac  = "C:\Program Files\1cv8\8.3.xx.xxxx\bin\rac.exe"
$srv  = "localhost:1545"
$base = "buh_base"   # имя базы в кластере

# UUID первого кластера
$cluster = (& $rac cluster list $srv |
  Select-String '^cluster\s*:\s*(\S+)').Matches[0].Groups[1].Value

# UUID базы по имени
$ib = $null; $cur = $null
foreach ($l in (& $rac infobase summary list --cluster=$cluster $srv)) {
  if ($l -match '^infobase\s*:\s*(\S+)') { $cur = $Matches[1] }
  if ($l -match '^name\s*:\s*(.+)$' -and $Matches[1].Trim() -eq $base) { $ib = $cur }
}
if (-not $ib) { Write-Host "База $base не найдена"; exit 1 }

# Завершаем все сеансы базы
$sessions = & $rac session list --cluster=$cluster --infobase=$ib $srv |
  Select-String '^session\s*:\s*(\S+)' |
  ForEach-Object { $_.Matches[0].Groups[1].Value }

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

Что доработать под себя:

  • 🔐 при назначенном администраторе кластера добавьте --cluster-user и --cluster-pwd во все вызовы rac;
  • 🚫 перед циклом включите блокировку начала сеансов, иначе клиенты переподключатся;
  • 📝 пишите вывод в лог-файл, если скрипт запускается Планировщиком заданий;
  • 🔤 если имя базы содержит кириллицу и не находится, проверьте кодировку вывода rac в консоли.
Перед массовым сбросом сеансов
Выполнено: 0 / 6

Ошибки при сбросе сеансов и что с ними делать

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

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

Освобождается ли лицензия после сброса сеанса?
Да. Лицензия привязана к сеансу, после его удаления она возвращается в пул и доступна другому пользователю.
Сохранятся ли данные, которые пользователь вводил в момент сброса?
Записанные документы останутся. Несохранённые формы пропадут, а незавершённая транзакция откатится целиком.
Можно ли сбросить свой собственный сеанс?
Можно, но проще закрыть программу. В консоли кластера удаление своего сеанса просто закроет ваш клиент.
Почему у одного пользователя несколько сеансов?
Каждый запущенный клиент 1С, Конфигуратор, COM-подключение и фоновое задание от его имени — отдельный сеанс. Колонка «Приложение» в консоли показывает, какой из них какой.
Через сколько спящий сеанс завершится сам?
Через время завершения спящего сеанса из свойств базы в консоли кластера. Если значение не задано, спящий сеанс может висеть долго, и его приходится удалять вручную.