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

· 9 мин

Содержание

Зависший сеанс 1С в клиент-серверной базе убирают в консоли кластера: Центральные серверы → <сервер> → Кластеры → <кластер> → Информационные базы → <база> → Сеансы, правый клик по строке → Удалить. Если сеанс не исчезает, значит, он ждёт ответа от СУБД: снимите его запрос на стороне SQL или перезапустите рабочий процесс rphost, в котором он живёт.

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

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

Не удаляйте сеансы наугад. Сначала найдите тот, который действительно мешает, иначе оборвёте работу человеку, у которого всё в порядке.

В консоли кластера откройте список сеансов нужной базы и посмотрите на колонки:

  • 👤 Пользователь и Компьютер — кто и откуда подключён. Сеанс с компьютера, который выключен, — первый кандидат.
  • 🕒 Начало работы и Последняя активность — сеанс, который не проявлял активности несколько часов, почти наверняка «мёртвый».
  • 🧩 Приложение — тонкий клиент, конфигуратор, фоновое задание, COM-соединение, веб-клиент. Фоновые задания удалять бессмысленно, пока не отключены регламентные задания: они запустятся снова.
  • 🔒 Колонки блокировок (СУБД и управляемых) — номер сеанса, который держит блокировку. Это ключ к ситуации «у всех всё встало».
  • ⚙️ Рабочий процесс — в каком rphost выполняется сеанс. Пригодится, если удаление не сработает.

Если у нескольких сеансов в колонке блокировки стоит один и тот же номер, завершать нужно именно его владельца. Остальные сеансы, скорее всего, оживут сами, как только блокировка снимется.

Типовые признаки зависшего сеанса:

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

Частая причина в терминальной среде — человек закрыл окно удалённого рабочего стола крестиком. Windows-сеанс остался в статусе «Отключён», а вместе с ним и запущенный клиент 1С. В таком случае сеанс 1С не завис, он просто продолжает работать на сервере терминалов.

Удаление сеанса в консоли администрирования кластера

Консоль «Администрирование серверов 1С:Предприятия» ставится вместе с платформой. Если её нет в меню «Пуск», зарегистрируйте radmin.dll из каталога bin установленной версии платформы командой от имени администратора:

regsvr32 "C:\Program Files\1cv8\8.3.xx.xxxx\bin\radmin.dll"

Номер версии подставьте свой: он должен совпадать с версией платформы на сервере.

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

  1. Запустите консоль и добавьте центральный сервер, если его там нет: правый клик по Центральные серверы → Создать → Центральный сервер 1С:Предприятия, имя сервера, порт агента 1540.
  2. Раскройте Кластеры → <кластер> → Информационные базы → <база> → Сеансы. Если на кластере задан администратор, консоль спросит его логин и пароль.
  3. Найдите зависший сеанс по признакам из предыдущего раздела.
  4. Правый клик по строке → Удалить. Подтвердите действие.
  5. Обновите список (F5). Сеанс должен исчезнуть, лицензия освободится сразу.

Удаление сеанса — это обрыв. Несохранённые данные пользователя пропадут, незавершённая транзакция откатится. Если человек на месте, сначала попросите его выйти сам.

Удалить можно и несколько сеансов разом: выделите строки с Ctrl или Shift. Удобно, когда после сбоя сети висит сразу десяток «призраков».

Если зависший сеанс сидит в терминальной среде, сначала завершите отключённый Windows-сеанс пользователя в диспетчере задач на вкладке «Пользователи» или в оснастке служб удалённых рабочих столов. Это закроет процесс клиента 1С, и сеанс в кластере обычно уйдёт сам.

Завершение сеансов из командной строки через rac

Когда консоли под рукой нет или сеансы нужно чистить по расписанию, используйте утилиту rac. Она работает через сервер администрирования ras, поэтому сначала убедитесь, что ras запущен. По умолчанию он слушает порт 1545.

Запуск ras вручную на сервере 1С:

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

Дальше последовательность из трёх шагов: узнать кластер, узнать сеансы, завершить нужный.

rem 1. Идентификатор кластера
rac cluster list

rem 2. Сеансы кластера (подставьте UUID кластера)
rac session list --cluster=<uuid-кластера> --cluster-user=admin --cluster-pwd=***

rem 3. Завершить сеанс по его UUID
rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса> --cluster-user=admin --cluster-pwd=***

В выводе rac session list у каждого сеанса есть поля user-name, host, app-id, started-at и last-active-at. По ним зависший сеанс находится так же, как в консоли. Чтобы сузить список до одной базы, добавьте параметр --infobase=<uuid-базы>. UUID базы покажет rac infobase summary list --cluster=<uuid-кластера>.

Если rac сообщает, что не может подключиться, проверьте два момента: запущен ли ras и не закрыт ли порт 1545 брандмауэром. Полный список команд и параметров вашей версии выводит rac help и, например, rac help session.

На Linux команды те же, только утилита лежит в каталоге платформы, обычно /opt/1cv8/x86_64/8.3.xx.xxxx/.

Сеанс не удаляется: запрос в СУБД и перезапуск rphost

Бывает, что после команды Удалить сеанс остаётся в списке. Чаще всего он в этот момент ждёт ответа от сервера СУБД: долгий запрос, ожидание блокировки на уровне базы данных. Кластер не может оборвать сеанс посреди вызова, пока СУБД не вернёт управление.

Шаг 1. Снимите запрос в СУБД

В свойствах сеанса в консоли или в выводе rac session list есть поле с номером соединения в СУБД (db-proc-info). По этому номеру завершается запрос на стороне базы данных.

Для MS SQL Server:

-- посмотреть, кто кого блокирует
SELECT session_id, blocking_session_id, wait_type, wait_time, command
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;

-- снять зависший запрос по номеру из db-proc-info
KILL 57;

Для PostgreSQL:

SELECT pid, state, wait_event_type, query_start, left(query, 80)
FROM pg_stat_activity
WHERE datname = 'имя_базы';

SELECT pg_terminate_backend(12345);

Числа 57 и 12345 — пример, подставьте номер своего соединения. После снятия запроса транзакция откатится, и сеанс удалится из консоли обычным способом.

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

Шаг 2. Перезапустите рабочий процесс rphost

Если запрос снят, а сеанс всё равно висит, или в процессе rphost растёт память и всё тормозит, остаётся перезапуск рабочего процесса.

  1. В консоли откройте Кластеры → <кластер> → Рабочие процессы. Там видно PID каждого процесса и занимаемую память.
  2. Сопоставьте процесс с зависшим сеансом по колонке «Рабочий процесс» в списке сеансов.
  3. Завершите процесс на сервере по PID:
taskkill /PID 4812 /F

На Linux — kill <PID>, а если процесс не реагирует, kill -9 <PID>. Менеджер кластера сам запустит новый rphost взамен.

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

Крайняя мера — перезапуск службы «Агент сервера 1С:Предприятия 8.3». Она обрывает вообще все сеансы всех баз кластера. Прибегайте к ней, только если перестала отвечать сама консоль.

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

Как закрыть вход в базу на время работ

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

Через консоль кластера

Откройте свойства информационной базы: правый клик по базе → Свойства. Там есть поля:

ПолеЧто ставить
Блокировка начала сеансов включенагалочка
Начало / Конецвремя действия блокировки, можно оставить пустым
Сообщениетекст, который увидят пользователи, например «Обновление до 19:00»
Код разрешениялюбой код, чтобы вы сами могли войти
Блокировка регламентных заданий включенагалочка, чтобы фоновые задания не мешали

После сохранения удалите оставшиеся сеансы, как описано выше. Сами вы зайдёте с параметром запуска /UC<код>, например /UC2468. Его добавляют в поле «Дополнительные параметры запуска» в настройках базы в окне запуска.

Изнутри 1С

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

Через rac

Тот же эффект из командной строки, удобно для скриптов ночного обслуживания:

rac infobase update --cluster=<uuid-кластера> --infobase=<uuid-базы> ^
  --infobase-user=Администратор --infobase-pwd=*** ^
  --sessions-deny=on --scheduled-jobs-deny=on ^
  --denied-message="Обновление базы" --permission-code=2468

После работ верните --sessions-deny=off и --scheduled-jobs-deny=off. Забытая блокировка — частая причина утренних звонков «не пускает в 1С».

Если база файловая

В файловом варианте нет кластера и консоли. Сеансы живут в процессах 1cv8.exe или 1cv8c.exe на компьютерах пользователей.

  1. Посмотрите, кто подключён: Администрирование → Обслуживание → Активные пользователи в пользовательском режиме или Администрирование → Активные пользователи в конфигураторе.
  2. Попросите пользователя закрыть программу. Если компьютер завис, завершите процесс 1cv8c.exe (тонкий клиент) или 1cv8.exe (толстый клиент, конфигуратор) в диспетчере задач на его машине.
  3. Если база лежит на общей папке, а сеанс висит после выключенного компьютера, откройте на файловом сервере Управление компьютером → Общие папки → Открытые файлы. Найдите открытые файлы каталога базы от этого пользователя и закройте их.

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

Как сделать, чтобы сеансы не зависали

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

  • 🖥️ Терминальный сервер. Задайте в групповой политике лимит для отключённых сеансов: «Установить ограничение по времени для отключённых сеансов», например 2 часа. Брошенный Windows-сеанс завершится, а с ним и 1С.
  • ♻️ Перезапуск рабочих процессов. В свойствах кластера задайте «Интервал перезапуска» (например, 86400 секунд — раз в сутки) и «Допустимый объём памяти». Кластер будет мягко выводить старый rphost из работы и переводить новые сеансы в свежий процесс. Включите «Принудительно завершать проблемные процессы».
  • ⏳ Время ожидания блокировки. В конфигураторе: Администрирование → Параметры информационной базы → Время ожидания блокировки данных. По умолчанию 20 секунд. Не увеличивайте его без причины: чем оно больше, тем дольше сеансы висят в ожидании друг друга.
  • 🌙 Регламент. Тяжёлые обработки (закрытие месяца, перепроведение, обмены) запускайте вне рабочего времени. Они чаще всего держат блокировки, на которых застревают остальные.
  • 🌐 Сеть. Сеансы через нестабильный VPN обрываются и остаются в кластере дольше обычного. Для удалённых сотрудников надёжнее терминальный доступ или веб-клиент.
Ночное обслуживание без зависших сеансов
Выполнено: 0 / 6

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

Освобождается ли лицензия сразу после удаления сеанса?
Да. Лицензия привязана к сеансу, после его удаления в консоли она возвращается в пул в течение нескольких секунд.
Почему пользователь снова видит ошибку лицензий, хотя я удалил его сеанс?
Скорее всего, у него осталось несколько окон или клиентов на разных компьютерах. Проверьте все сеансы этого пользователя и отключённые терминальные сеансы.
Можно ли удалить сеанс конфигуратора?
Можно, так же через консоль. Несохранённые изменения конфигурации при этом пропадут, а если шло обновление структуры базы, его придётся запускать заново.
Что значит сеанс без пользователя в колонке «Пользователь»?
Обычно это фоновое задание, COM-соединение или служебный сеанс. Смотрите на колонку «Приложение», прежде чем удалять.
Можно ли завершать зависшие сеансы автоматически?
Да, скриптом на rac по расписанию: выбрать сеансы с давней last-active-at и завершить их через rac session terminate. Исключите из выборки фоновые задания и служебных пользователей.