Сеанс 1С 8.3 висит и держит лицензию или блокировку: что с ним делать

· 9 мин

Содержание

Чтобы отключить зависший сеанс в 1С:Предприятии 8.3 в клиент-серверном режиме, откройте консоль «Администрирование серверов 1С Предприятия», найдите базу, раскройте узел Сеансы, щёлкните по нужной строке правой кнопкой и выберите «Удалить». Без консоли то же делает команда rac session terminate. В файловом режиме консоли нет: там закрывают процесс 1cv8.exe на компьютере пользователя или открытый файл базы на файловом сервере.

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

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

Не каждый «старый» сеанс завис. Пользователь мог уйти на обед с открытой программой — такой сеанс живой. Удалять его можно, но несохранённые данные пропадут.

Признаки настоящего зависания в списке сеансов консоли:

  • 🕒 «Последняя активность» — давно, а пользователь говорит, что 1С у него закрыта.
  • 💤 «Спящий» — «Да». Сервер потерял связь с клиентом и перевёл сеанс в спящий режим. Обычно такой сеанс завершается сам по таймауту, но не всегда.
  • ⏳ «Время вызова (текущее)» растёт минутами — сервер выполняет вызов и не может его закончить.
  • 🔒 «Блокировано СУБД» или «Блокировано упр.» не пусто — сеанс ждёт чужую блокировку. Тогда завис не он, а тот, кто его держит.
  • 🖥️ Тот же пользователь заходит повторно и получает второй сеанс, а первый висит рядом.

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

Отключение сеанса через консоль администрирования кластера

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

Пошагово

  1. Запустите «Администрирование серверов 1С Предприятия» на сервере или на машине администратора.
  2. Раскройте дерево: Central 1C:Enterprise 8.3 servers → имя сервера → Кластеры → кластер → Информационные базы → нужная база → Сеансы.
  3. Найдите сеанс по пользователю, компьютеру и приложению (тонкий клиент, конфигуратор, фоновое задание, COM-соединение).
  4. Правой кнопкой по строке → «Удалить». Подтвердите.
  5. Обновите список (F5). Если строка пропала — готово.

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

Консоль не открывается

Типичная ситуация после обновления платформы: оснастка выдаёт ошибку создания компонента. Помогает перерегистрация radmin.dll той версии платформы, что стоит на сервере. Командная строка от имени администратора:

regsvr32 "C:\Program Files\1cv8\8.3.24.1548\bin\radmin.dll"

Номер версии подставьте свой — папку можно посмотреть в C:\Program Files\1cv8\. Разрядность консоли и платформы должна совпадать.

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

rmngr, ras и rac: отключение сеанса из командной строки

Менеджер кластера rmngr — это процесс, который хранит реестр сеансов и распределяет их по рабочим процессам. Своих команд у него нет. Управлять им снаружи можно двумя путями: через консоль (она идёт через агент ragent, порт 1540) или через связку ras + rac.

  • ras — сервер администрирования, слушает порт 1545 и передаёт команды кластеру.
  • rac — консольный клиент, который подключается к ras.

Оба лежат в папке bin платформы на Windows (C:\Program Files\1cv8\<версия>\bin\) и в /opt/1cv8/x86_64/<версия>/ на Linux.

Запуск ras

На Windows для разового использования:

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

На Linux:

/opt/1cv8/x86_64/8.3.24.1548/ras cluster --daemon

Для постоянной работы ras регистрируют службой — так он переживёт перезагрузку.

Команды для зависшего сеанса

# 1. Узнать идентификатор кластера
rac cluster list

# 2. Посмотреть сеансы кластера (или одной базы через --infobase=<uuid>)
rac session list --cluster=<uuid-кластера>

# 3. Завершить конкретный сеанс
rac session terminate --cluster=<uuid-кластера> --session=<uuid-сеанса>

Если у кластера есть администратор, добавьте --cluster-user=<логин> --cluster-pwd=<пароль> к каждой команде, кроме cluster list.

В выводе session list каждый сеанс — это блок строк «параметр : значение». Для поиска зависших смотрите user-name, host, app-id, last-active-at, hibernate (спящий) и blocked-by-dbms. Точный список параметров вашей версии показывает rac help session.

Сначала прочитайте вывод session list глазами, и только потом завершайте. Идентификатор сеанса в rac — длинный UUID, а не короткий номер из колонки «Сеанс».

Блокировки и транзакции: кто держит базу

Частый случай: пользователи жалуются, что «всё висит», а в консоли висят десять сеансов. Завис один — тот, кто держит блокировку. Остальные стоят в очереди за ним.

Управляемые блокировки 1С

В консоли у базы есть узел Блокировки. Там видно, какой сеанс заблокировал какой объект: документ, регистр, константу. Сеанс, который держит блокировку дольше всех и сам ничего не ждёт, — кандидат на удаление.

Через rac то же самое:

rac lock list --cluster=<uuid-кластера> --infobase=<uuid-базы>

Блокировки в СУБД

Если в колонке «Блокировано СУБД» стоит номер соединения, ожидание идёт на уровне базы данных. Для MS SQL Server посмотреть цепочку можно так:

SELECT session_id, blocking_session_id, wait_type, wait_time, command
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0;

Номер соединения СУБД, которое занимает сеанс 1С, rac показывает в параметре db-proc-info. Так вы сопоставите «виновника» в SQL с конкретным пользователем 1С.

Команда KILL в SQL Server обрывает соединение, но сеанс 1С при этом остаётся и получит ошибку СУБД. Правильный порядок: завершить сеанс 1С через консоль или rac, а к KILL прибегать, только если сеанс 1С уже удалён, а соединение в СУБД всё ещё висит.

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

Регламентные задания и автоматическая очистка сеансов

Зависшие сеансы часто оставляют не люди, а фоновые задания: обмен, загрузка курсов, полнотекстовый индекс. В списке сеансов у них приложение «Фоновое задание».

Остановить фоновые задания на время работ

В свойствах информационной базы в консоли кластера есть флажок «Блокировка регламентных заданий включена». Пока он стоит, новые регламентные задания не стартуют, и удалённые сеансы не возвращаются. После работ флажок снимите — иначе перестанут работать обмены.

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

Скрипт, который снимает спящие сеансы

Встроенного регламентного задания «удалить зависшие сеансы » в платформе нет. Его делают снаружи: скрипт на rac по расписанию в планировщике Windows или cron. Пример для Linux, который завершает только спящие сеансы:

#!/bin/bash
RAC=/opt/1cv8/x86_64/8.3.24.1548/rac
CL=$($RAC cluster list | awk -F' *: *' '$1=="cluster"{print $2; exit}')

$RAC session list --cluster="$CL" \
 | awk -F' *: *' '$1=="session"{s=$2} $1=="hibernate" && $2=="yes"{print s}' \
 | while read -r S; do
     echo "$(date '+%F %T') завершаю $S"
     $RAC session terminate --cluster="$CL" --session="$S"
   done

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

Диагностика на уровне операционной системы

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

Найти нужный рабочий процесс

В консоли откройте узел Рабочие процессы кластера. Там видны процессы rphost с номером PID, памятью и числом соединений. В свойствах сеанса указано, каким процессом он обслуживается.

На Windows процесс ищут в диспетчере задач на вкладке «Подробности» по PID. На Linux:

ps -o pid,rss,etime,cmd -C rphost

Завершить rphost

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

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

Перезапуск службы «Агент сервера 1С:Предприятия 8.3» (на Linux — службы srv1cv8 вашей версии) — крайняя мера. Он сбрасывает все сеансы всех баз кластера.

Файловый режим

В файловой базе сервера 1С нет, сеанс живёт в процессе 1cv8.exe на компьютере пользователя. Зависший сеанс — это зависшая программа:

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

Закрытие открытого файла на сервере — грубый способ. Если в этот момент шла запись, базу стоит проверить через «Тестирование и исправление» в конфигураторе, предварительно сделав копию.

Профилактика: чтобы сеансы не зависали

Зависшие сеансы — симптом. Причина обычно в одном из трёх мест: сеть, память рабочих процессов или долгие транзакции.

Что настроитьГдеЧто даёт
Интервал перезапуска рабочих процессовСвойства кластераrphost периодически перезапускается и не копит утечки памяти
Допустимый объём памяти и «Принудительно завершать проблемные процессы»Свойства кластераРазросшийся процесс выводится из работы до того, как подвесит всех
Блокировка регламентных заданий на время работСвойства информационной базыФоновые задания не стартуют во время обновления
Блокировка начала сеансов с сообщением пользователямСвойства базы в консоли или Администрирование → Обслуживание в типовойПользователи выходят заранее, а не теряют сеанс посреди работы
Расписание обменов вне рабочего времениСписок регламентных заданий базыМеньше конфликтов блокировок днём

Ещё несколько привычек, которые снижают число зависаний:

  • 📶 Пользователи по VPN и Wi-Fi чаще оставляют спящие сеансы. Для удалённых сотрудников лучше терминальный сервер или веб-клиент.
  • 🧮 Тяжёлые отчёты за год и групповое перепроведение запускайте вечером. Они держат блокировки и съедают память rphost.
  • 🔁 Держите платформу на клиентах и на сервере одной версии. Разные сборки дают ошибки соединения и «мусорные» сеансы.
  • 📋 Раз в неделю смотрите список сеансов: если один и тот же пользователь стабильно оставляет спящий сеанс, проблема у него на компьютере или в сети.

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

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