Пользователь давно вышел, а сеанс висит: как освободить базу и лицензию
Содержание
Зависший сеанс 1С в клиент-серверной базе сбрасывают в Консоли администрирования серверов: Кластер → Информационные базы → <ваша база> → Сеансы, правый клик по строке и команда Удалить. Без консоли то же делает утилита rac командой rac session terminate. В файловой базе сеанса как объекта нет: «висит» процесс 1cv8.exe или 1cv8c.exe на чьём-то компьютере, и сбросить его — значит завершить этот процесс или закрыть открытый файл 1Cv8.1CD на сервере, где лежит база.
Обычно проблему замечают по последствиям. Не хватает лицензий, хотя половина офиса ушла домой. Не запускается обновление, потому что нужен монопольный режим. Регламентное задание стоит. Ниже — способы от самого мягкого к самому жёсткому, с пояснением, что при каждом теряет пользователь.
Как понять, что сеанс действительно завис
Сначала убедитесь, что сеанс именно лишний, а не принадлежит человеку, который сейчас проводит документы. Удаление живого сеанса откатывает его незавершённую транзакцию, а несохранённые формы пропадают.
Признаки зависшего сеанса:
- 🕒 время начала — вчера или раньше, а пользователь утверждает, что программу закрыл;
- 💻 компьютер в колонке «Компьютер» выключен или уже не существует (сотрудник уволен, ноутбук сдан);
- 🔁 у одного пользователя два-три одинаковых сеанса с разным временем начала — типичный след аварийно закрытого клиента;
- 📉 в консоли у сеанса нулевая активность: не растут счётчики вызовов и время последней активности давно не меняется;
- 🔒 сеанс держит управляемую блокировку, а остальные ловят ошибки блокировки при записи.
Откуда берутся такие сеансы:
- 🔌 у пользователя оборвалась сеть, VPN или RDP-сессия, а клиент 1С остался работать на терминальном сервере;
- 💥 клиент упал с ошибкой, и сервер не получил сигнал о закрытии;
- 🌐 браузер с веб-клиентом закрыли без выхода из программы;
- ⚙️ фоновое или регламентное задание зациклилось или ждёт снятия блокировки.
В клиент-серверном варианте серверу нужно время, чтобы заметить пропажу клиента. Если сеанс исчез сам через 10–20 минут — это нормальное поведение, а не сбой.
Сброс сеансов из самой программы 1С
Если у вас права администратора в базе, начните отсюда. Консоль сервера не нужна.
Список активных пользователей в БП, ЗУП и УТ
В типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) откройте Администрирование → Обслуживание и найдите ссылку «Активные пользователи». Откроется список текущих сеансов: пользователь, компьютер, приложение, время начала.
- Отсортируйте список по времени начала.
- Выделите подозрительный сеанс.
- Нажмите команду завершения сеанса в командной панели формы.
- В клиент-серверной базе программа попросит параметры администрирования кластера, если на кластере задан администратор. Введите логин и пароль администратора кластера (это не пользователь базы).
Если кластер не защищён паролем, поле можно оставить пустым.
Платформенный список без завершения
Через меню Функции для технического специалиста → Стандартные → Активные пользователи тоже открывается список сеансов. Он полезен для просмотра, но завершать сеансы из него нельзя. В Конфигураторе аналогичный список есть в меню Администрирование → Активные пользователи — тоже только просмотр.
Блокировка работы пользователей
Когда нужно выгнать всех разом, например перед обновлением, используйте блокировку: Администрирование → Обслуживание, ссылка «Блокировка работы пользователей».
- Задайте время начала и окончания блокировки.
- Напишите сообщение, которое увидят пользователи.
- Укажите код разрешения: с ним администратор сможет войти в заблокированную базу, добавив к строке запуска параметр
/UC<код>.
После установки блокировки работающие пользователи получат предупреждение, а через несколько минут их сеансы завершатся. Новые входы будут запрещены. Не забудьте снять блокировку после работ — иначе утром никто не войдёт.
Удаление сеансов в Консоли администрирования серверов
Это основной способ для клиент-серверной базы. Консоль подключается к агенту сервера (порт 1540 по умолчанию) и видит все сеансы кластера, включая фоновые.
Порядок действий
- Запустите «Администрирование серверов 1С Предприятия» на сервере или на машине администратора.
- Раскройте
Central 1C:Enterprise 8.3 servers → <имя сервера> → Кластеры → <кластер>. - Откройте
Информационные базы → <нужная база> → Сеансы. - Найдите лишний сеанс по пользователю, компьютеру и времени начала.
- Правый клик →
Удалить. Можно выделить несколько строк сразу.
Если в списке баз пусто или консоль ругается на права — на уровне кластера задан администратор, его логин и пароль консоль запросит при подключении.
Если сеанс не удаляется
Бывает, что после удаления строка возвращается или висит дальше. Тогда загляните в узел Соединения той же базы и разорвите соединение, привязанное к сеансу. Если и это не помогает, сеанс застрял внутри рабочего процесса rphost.
Крайняя мера — перезапуск рабочего процесса через узел Рабочие процессы кластера или перезапуск службы «Агент сервера 1С:Предприятия 8.3».
Перезапуск rphost или службы агента обрывает сеансы ВСЕХ пользователей, которых обслуживает этот процесс, а при перезапуске службы — всех баз кластера. Незаписанные данные пропадут, открытые транзакции откатятся. Делайте это вне рабочего времени или после предупреждения пользователей.
Если консоль не открывается
Типичная причина — оснастка не зарегистрирована после установки новой версии платформы. Зарегистрируйте radmin.dll той версии платформы, что стоит на сервере, из командной строки от имени администратора:
regsvr32 "C:\Program Files\1cv8\8.3.24.1342\bin\radmin.dll"
Номер версии в пути подставьте свой: посмотреть его можно в папке C:\Program Files\1cv8\. Разрядность консоли должна совпадать с разрядностью зарегистрированной библиотеки.
Сброс сеансов из командной строки через rac
Утилита rac удобна, когда сервер на Linux, нет графической консоли или нужен скрипт. Она работает через сервер администрирования ras, его нужно предварительно запустить. По умолчанию ras слушает порт 1545.
На Linux ras запускают так (путь зависит от версии):
/opt/1cv8/x86_64/8.3.24.1342/ras cluster --daemon
Дальше три шага: узнать идентификатор кластера, найти сеанс, завершить его.
# 1. Идентификатор кластера
rac cluster list
# 2. Список сеансов кластера
rac session list --cluster=<uuid_кластера>
# 3. Завершение конкретного сеанса
rac session terminate --cluster=<uuid_кластера> --session=<uuid_сеанса>
Если на кластере задан администратор, добавьте к командам 2 и 3 параметры --cluster-user=<логин> --cluster-pwd=<пароль>. Если ras запущен на другой машине, укажите её адрес в конце команды: rac cluster list server1c:1545.
В выводе session list смотрите поля user-name, host, started-at и last-active-at. Последнее как раз показывает, когда сеанс последний раз что-то делал. Для полного перечня параметров используйте rac help session.
💡 Команда rac session list --licenses показывает, какие сеансы занимают лицензии. Удобно, когда не хватает лицензий и нужно понять, кто их держит.
Зависшие подключения к файловой базе
У файловой базы нет сервера, который ведёт список сеансов. Каждый клиент сам открывает файл 1Cv8.1CD. Поэтому «сбросить сеанс» здесь означает закрыть программу или файл на том компьютере, который его держит.
Шаг 1. Найдите, кто держит базу
Откройте в базе список активных пользователей (как в разделе про сброс из программы): там видно имя компьютера. Если база вообще не открывается, переходите к шагу 3.
Шаг 2. Закройте клиент на этом компьютере
На рабочем месте или на терминальном сервере откройте «Диспетчер задач» и завершите процесс 1cv8.exe (толстый клиент) или 1cv8c.exe (тонкий клиент) нужного пользователя. На терминальном сервере удобнее завершить RDP-сессию зависшего пользователя целиком.
Шаг 3. Закройте файл на сервере с папкой базы
Если база лежит в общей папке Windows, на этом сервере выполните fsmgmt.msc и откройте раздел «Открытые файлы». Найдите строки с путём к 1Cv8.1CD и посмотрите, какой пользователь и компьютер их держат. Правый клик → «Закрыть открытый файл».
Закрытие файла у работающего пользователя может повредить базу, если в этот момент шла запись. Закрывайте файл только у того, кто точно не работает, и только при наличии свежей копии базы.
Шаг 4. Лишний файл блокировки
В каталоге файловой базы рядом с 1Cv8.1CD лежит служебный файл 1Cv8.1CL. Если все пользователи вышли, процессов 1cv8 нигде нет, а база по-прежнему считает, что в ней кто-то работает, этот файл можно удалить — при следующем запуске платформа создаст его заново. Удаляйте только при полностью закрытой базе.
Веб-публикация файловой базы
Если файловая база опубликована на веб-сервере, её держит процесс веб-сервера (w3wp.exe у IIS, httpd у Apache). Перезапуск пула приложений IIS или службы Apache закрывает все веб-подключения, поэтому тоже делайте это вне рабочего времени.
Блокировки в MS SQL и PostgreSQL
Иногда сеанс 1С уже удалён, а запрос в СУБД продолжает выполняться и держит блокировки таблиц. Это видно по тому, что другие пользователи ждут, а в консоли 1С подозрительного сеанса уже нет. Тогда смотрят на стороне СУБД.
Принудительное завершение процесса СУБД откатывает его транзакцию. Длинная транзакция откатывается долго, иногда дольше, чем выполнялась. Не завершайте процессы вслепую: сначала убедитесь, что это именно зависший запрос базы 1С, а не резервное копирование или обслуживание индексов.
MS SQL Server
Кто кого блокирует — смотрите запросом к динамическому представлению:
SELECT session_id, blocking_session_id, status, wait_type,
wait_time, command, DB_NAME(database_id) AS db
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;
В колонке blocking_session_id — номер процесса, который держит блокировку. Подробности по нему покажет EXEC sp_who2. Завершить процесс:
KILL 57; -- номер процесса из blocking_session_id
PostgreSQL
Список активных подключений и их запросов:
SELECT pid, usename, client_addr, state, query_start, query
FROM pg_stat_activity
WHERE datname = 'имя_базы'
ORDER BY query_start;
Сначала попробуйте мягкую отмену запроса, затем — завершение подключения:
SELECT pg_cancel_backend(12345); -- отменить текущий запрос
SELECT pg_terminate_backend(12345); -- разорвать подключение
Подключения к СУБД открывают рабочие процессы rphost от имени служебного пользователя сервера 1С. Поэтому по полю пользователя СУБД вы не узнаете, какой это бухгалтер, — ориентируйтесь на время начала запроса и сам текст запроса.
Сравнение способов
| Способ | Когда применять | Что теряет пользователь | Кто затронут |
|---|---|---|---|
| Завершение сеанса из списка активных пользователей | один-два лишних сеанса, есть права администратора базы | незаписанные данные этого сеанса | один пользователь |
| Блокировка работы пользователей | нужно выгнать всех перед регламентными работами | незаписанные данные всех | все пользователи базы |
Удаление в консоли или rac session terminate | клиент-серверная база, сеанс не виден в программе | незаписанные данные этого сеанса | один пользователь |
Закрытие файла или процесса 1cv8 | файловая база | данные сеанса, риск повреждения базы | один пользователь |
KILL или pg_terminate_backend | запрос в СУБД висит после удаления сеанса | откат транзакции | один процесс, но ждут все, кого он блокировал |
Перезапуск rphost или службы агента | ничего не помогло | всё несохранённое | все пользователи процесса или кластера |
Автоматизация и профилактика
Чем реже сеансы зависают, тем реже приходится лезть в консоль. Несколько настроек снимают большую часть проблем.
Автозавершение спящих сеансов
В свойствах информационной базы в Консоли администрирования есть параметры «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса» (в секундах). Пассивный сеанс засыпает и освобождает лицензию, а спящий через заданное время завершается.
Рабочий пример для офиса:
- засыпание пассивного сеанса — 1 800 секунд (30 минут);
- завершение спящего сеанса — 14 400 секунд (4 часа).
С такими значениями ночью в базе не остаётся брошенных сеансов, а пользователь, отошедший на обед, ничего не теряет.
Ночная очистка скриптом
На Windows-сервере rac можно запускать из «Планировщика заданий». Пример скрипта PowerShell, который завершает все сеансы указанной базы, кроме фоновых заданий:
$rac = "C:\Program Files\1cv8\8.3.24.1342\bin\rac.exe"
$cluster = "<uuid_кластера>"
$ib = "<uuid_базы>" # узнать: rac infobase summary list --cluster=...
$list = & $rac session list --cluster=$cluster --infobase=$ib
$sessions = @()
$cur = @{}
foreach ($line in $list) {
if ($line -match '^\s*$') { if ($cur.Count) { $sessions += $cur; $cur = @{} }; continue }
$k, $v = $line -split '\s*:\s*', 2
$cur[$k.Trim()] = $v.Trim()
}
if ($cur.Count) { $sessions += $cur }
foreach ($s in $sessions) {
if ($s['app-id'] -ne 'BackgroundJob') {
& $rac session terminate --cluster=$cluster --session=$s['session']
}
}
Ставьте такое задание на ночь, после окончания рабочего дня и до запуска резервного копирования. Перед вводом в работу прогоните скрипт вручную и посмотрите, какие сеансы он выбирает.
Чем ещё снизить число зависаний
- ⏳ Настройте на терминальном сервере лимит для отключённых RDP-сессий: брошенная сессия закроется вместе с клиентом 1С.
- 🔄 В свойствах рабочего сервера задайте допустимый объём памяти и интервал перезапуска рабочих процессов: кластер сам перезапустит распухший
rphost, плавно переводя на новый процесс новые подключения. - 🧾 Регламентные задания с тяжёлыми обработками разносите по времени, чтобы они не ждали блокировки друг друга.
- 📶 Удалённым сотрудникам с нестабильной связью давайте тонкий клиент через терминальный сервер или веб-клиент, а не прямое подключение к базе.
Частые вопросы
Освобождается ли лицензия сразу после удаления сеанса?
rac session list --licenses, не держит ли лицензию другой сеанс того же пользователя.Почему удалённый сеанс через минуту появляется снова?
Можно ли сбросить сеансы без прав администратора кластера?
rac, ни список активных пользователей не завершат сеанс без его логина и пароля. Если пароль утерян, восстанавливают файл настроек кластера из резервной копии или обращаются к администратору сервера.