Зависшие сеансы и соединения в 1С 8.3: найти виновника, завершить и не допустить повторения

· 10 мин

Содержание

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

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

Сеанс и соединение: что именно зависло

В консоли кластера у базы два списка, и путать их не стоит.

  • 👤 Сеанс — логический вход пользователя: кто, с какого компьютера, каким приложением (тонкий клиент, конфигуратор, фоновое задание, COM-соединение). Сеанс занимает лицензию и держит управляемые блокировки.
  • 🔌 Соединение — физический канал между клиентом и рабочим процессом rphost. Через одно соединение работает сеанс.

Удалить соединение — значит оборвать канал. Сеанс при этом может остаться: он перейдёт в состояние «спящий» и доживёт до таймаута. Удалить сеанс — значит завершить работу пользователя целиком. Поэтому обычно нужен именно список Сеансы, а «Соединения» — для разбора случаев, когда сеанса уже нет, а канал остался.

В файловой базе консоли кластера нет. Там «зависший» пользователь — это процесс 1cv8.exe или 1cv8c.exe на компьютере, где запущена программа (часто — терминальный сервер). Его завершают в диспетчере задач от имени этого пользователя.

Подготовка: консоль администрирования и права

Консоль ставится вместе с платформой, если при установке отмечен компонент администрирования сервера. Ярлык называется «Администрирование серверов 1С Предприятия».

Если консоль открывается с ошибкой о том, что оснастку не удалось создать, зарегистрируйте библиотеку radmin.dll той же версии, что и сервер. Командная строка от имени администратора:

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

Вместо 8.3.xx.xxxx подставьте номер установленной версии платформы — папка с ним лежит в C:\Program Files\1cv8\. Версия консоли должна совпадать с версией сервера: старая консоль к новому серверу часто не подключается.

Дальше:

  1. В дереве консоли: правый клик по Центральные серверы 1С:Предприятия → Создать → Центральный сервер 1С:Предприятия.
  2. Укажите имя сервера и порт агента — по умолчанию 1540.
  3. Если на кластере заданы администраторы, консоль спросит логин и пароль администратора кластера. Без них сеансы будут видны, но удалить их не получится.

Как распознать зависший сеанс в консоли

Откройте Кластеры → <кластер> → Информационные базы → <база> → Сеансы. Список настраивается: через контекстное меню можно включить нужные колонки. Полезные из них:

КолонкаО чём говорит
Пользователь, КомпьютерЧей сеанс и с какой машины
ПриложениеТонкий клиент, Конфигуратор, Фоновое задание, COM-соединение
Начало работы / Последняя активностьСколько сеанс «молчит»
СпящийСвязь с клиентом потеряна, сеанс ждёт таймаута
Захвачено СУБД (текущее)Сколько длится текущий запрос к СУБД
Блокировано СУБД / Блокировано 1СНомер соединения, которое держит ресурс, нужный этому сеансу
Соединение с СУБДНомер процесса на стороне SQL Server или PostgreSQL

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

  • 😴 стоит отметка «Спящий», а пользователь уверяет, что вышел из программы;
  • ⏳ «Последняя активность» — вчера или раньше;
  • 🔒 у других сеансов в колонке блокировок указан один и тот же номер соединения — значит, все ждут его;
  • 🖥️ один пользователь с одного компьютера открыл три одинаковых сеанса, хотя работает в одном окне.

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

Удаление зависших соединений через консоль кластера

Порядок от мягкого к жёсткому:

  1. Позвоните пользователю. Если он в базе, пусть сохранит документ и выйдет сам — так не потеряются введённые данные.
  2. Удалите сеанс. В списке Сеансы выделите строку (можно несколько через Ctrl), правый клик → Удалить. Пользователь увидит сообщение о том, что сеанс завершён администратором. Несохранённые изменения в открытых формах пропадут, а начатая транзакция откатится.
  3. Если сеанса нет, а канал висит — откройте Рабочие процессы → <процесс> → Соединения или Информационные базы → <база> → Соединения, найдите строку по компьютеру и приложению, правый клик → Удалить.
  4. Если сеанс не удаляется и снова появляется в списке, он, скорее всего, ждёт ответа от СУБД. Переходите к разделу про блокировки в СУБД ниже.

Перед обновлением конфигурации удобнее не гоняться за каждым сеансом, а закрыть вход в базу:

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

С кодом разрешения в базу пускают только того, кто запускает 1С с параметром /UC<код>. Так администратор зайдёт сам, а остальные — нет.

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

Завершение сеансов изнутри 1С: «Активные пользователи»

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

  1. Откройте список активных пользователей.
  2. Выделите нужный сеанс и выберите команду завершения сеанса.
  3. В клиент-серверном варианте программа попросит логин и пароль администратора кластера, если они заданы.

Там же, в группе обслуживания, есть «Блокировка работы пользователей». Это аналог блокировки начала сеансов из консоли: всем работающим приходит предупреждение, а после указанного времени их сеансы завершаются.

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

Удаление соединений из командной строки через rac

Утилита rac.exe лежит в папке bin платформы и работает через сервер администрирования ras. Если 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
sc start "1C:Enterprise 8.3 Remote Server"

По умолчанию ras слушает порт 1545, а rac подключается к localhost:1545. Дальше — три шага.

1. Узнать идентификатор кластера:

rac cluster list

Нужна строка cluster : <UUID>.

2. Найти базу и её сеансы:

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

У каждого сеанса выводятся поля session, user-name, host, app-id, last-active-at, hibernate и другие. По ним находят тот же зависший сеанс, что и в консоли.

3. Завершить сеанс:

rac session terminate --cluster=<UUID-кластера> --session=<UUID-сеанса>

Если на кластере есть администратор, добавьте к каждой команде --cluster-user=<логин> --cluster-pwd=<пароль>. Для отдельного соединения есть rac connection list и rac connection disconnect; им нужен ещё идентификатор рабочего процесса — точный набор параметров покажет rac help connection.

На Linux команды те же, утилита лежит в /opt/1cv8/x86_64/<версия>/. Сервер ras там обычно запускают отдельным юнитом systemd.

Блокировки на уровне СУБД: MS SQL и PostgreSQL

Бывает, что сеанс в консоли удалён, а через минуту снова висит, или его «Захвачено СУБД» растёт часами. Значит, рабочий процесс ждёт ответа от SQL-сервера, а запрос там застрял или кого-то блокирует.

Номер процесса в СУБД берите из колонки «Соединение с СУБД» в списке сеансов. Дальше — по вашей СУБД.

MS SQL Server — найти, кто кого блокирует:

SELECT r.session_id, r.blocking_session_id, r.wait_type,
       r.total_elapsed_time / 1000 AS sec, DB_NAME(r.database_id) AS db
FROM sys.dm_exec_requests AS r
WHERE r.blocking_session_id <> 0;

В blocking_session_id — виновник. Завершить его процесс (подставьте номер):

KILL 87;

PostgreSQL — те же действия:

SELECT pid, usename, state, query_start, wait_event_type,
       pg_blocking_pids(pid) AS blocked_by
FROM pg_stat_activity
WHERE datname = 'buh_base';
SELECT pg_terminate_backend(12345);

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

Если зависает не один запрос, а весь рабочий процесс rphost (сеансы на нём не отвечают, память растёт), его можно перезапустить из консоли: Рабочие процессы → правый клик → выключить процесс. Это обрывает все сеансы на этом процессе, поэтому делайте это в нерабочее время или после рассылки предупреждения.

Почему соединения зависают и как этого не допускать

Сеанс сам по себе не зависает — его оставляет что-то снаружи. Частые источники:

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

Что настроить, чтобы зависших сеансов стало меньше:

  1. Таймауты в свойствах базы. В консоли, в свойствах информационной базы, есть параметры «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса» (в секундах). Например, 1200 и 3600: сеанс без связи с клиентом заснёт через 20 минут, а спящий сеанс завершится через час.
  2. Политики терминального сервера. Ограничьте время жизни отключённых сеансов Windows, например 2–4 часами. Тогда брошенные RDP-сессии закроются вместе с 1С.
  3. Правило для внешних интеграций. COM- и HTTP-обмены должны закрывать соединение после работы. Если интеграция пишет подрядчик, проговорите это заранее.
  4. Регламентные операции ночью. Пересчёт итогов, закрытие месяца и большие обмены, запущенные днём, чаще всего и создают очереди блокировок.

Автоматическая очистка зависших сеансов по расписанию

Когда брошенных сеансов много каждый день, их удобно чистить скриптом. Ниже — PowerShell для Windows-сервера: он завершает спящие сеансы, у которых последняя активность была больше 12 часов назад. Сначала запустите его с $dryRun = $true — он только покажет, что собирается удалить.

$rac    = "C:\Program Files\1cv8\8.3.xx.xxxx\bin\rac.exe"
$hours  = 12
$dryRun = $true

$clusterLine = & $rac cluster list | Select-String '^cluster\s*:' | Select-Object -First 1
$cluster = $clusterLine.ToString().Split(':', 2)[1].Trim()
$limit   = (Get-Date).AddHours(-$hours)

$text   = (& $rac session list --cluster=$cluster) -join "`n"
$blocks = $text -split "`n\s*`n"

foreach ($b in $blocks) {
    $p = @{}
    foreach ($line in $b -split "`n") {
        if ($line -match '^\s*([\w-]+)\s*:\s*(.*)$') { $p[$matches[1]] = $matches[2].Trim() }
    }
    if (-not $p['session']) { continue }
    $last = [datetime]::Parse($p['last-active-at'])
    if ($p['hibernate'] -eq 'yes' -and $last -lt $limit) {
        Write-Output ("{0} {1} {2} {3}" -f $p['user-name'], $p['host'], $p['app-id'], $p['last-active-at'])
        if (-not $dryRun) {
            & $rac session terminate --cluster=$cluster --session=$p['session']
        }
    }
}

Если на кластере заданы администраторы, допишите --cluster-user и --cluster-pwd к вызовам session list и session terminate. Пароль лучше хранить не в скрипте, а в защищённом хранилище учётных данных Windows.

Скрипт ставят в Планировщик заданий Windows, например на 06:00 — до прихода сотрудников. Лог вывода стоит сохранять в файл: по нему видно, чьи сеансы зависают постоянно, и с этими компьютерами разбираться отдельно.

Не удаляйте скриптом сеансы с приложением «Фоновое задание» и «Конфигуратор» — добавьте фильтр по app-id. Иначе можно оборвать ночной обмен или чужое обновление.

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

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