Зависшие сеансы и соединения в 1С 8.3: найти виновника, завершить и не допустить повторения
Содержание
Зависшее соединение в клиент-серверной 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С:Предприятия. - Укажите имя сервера и порт агента — по умолчанию
1540. - Если на кластере заданы администраторы, консоль спросит логин и пароль администратора кластера. Без них сеансы будут видны, но удалить их не получится.
Как распознать зависший сеанс в консоли
Откройте Кластеры → <кластер> → Информационные базы → <база> → Сеансы. Список настраивается: через контекстное меню можно включить нужные колонки. Полезные из них:
| Колонка | О чём говорит |
|---|---|
| Пользователь, Компьютер | Чей сеанс и с какой машины |
| Приложение | Тонкий клиент, Конфигуратор, Фоновое задание, COM-соединение |
| Начало работы / Последняя активность | Сколько сеанс «молчит» |
| Спящий | Связь с клиентом потеряна, сеанс ждёт таймаута |
| Захвачено СУБД (текущее) | Сколько длится текущий запрос к СУБД |
| Блокировано СУБД / Блокировано 1С | Номер соединения, которое держит ресурс, нужный этому сеансу |
| Соединение с СУБД | Номер процесса на стороне SQL Server или PostgreSQL |
Признаки, что сеанс завис, а не просто долго работает:
- 😴 стоит отметка «Спящий», а пользователь уверяет, что вышел из программы;
- ⏳ «Последняя активность» — вчера или раньше;
- 🔒 у других сеансов в колонке блокировок указан один и тот же номер соединения — значит, все ждут его;
- 🖥️ один пользователь с одного компьютера открыл три одинаковых сеанса, хотя работает в одном окне.
Длинное «Захвачено СУБД» у фонового задания — не всегда зависание. Закрытие месяца, пересчёт итогов или обмен могут честно работать час. Прежде чем удалять, спросите, кто его запустил.
Удаление зависших соединений через консоль кластера
Порядок от мягкого к жёсткому:
- Позвоните пользователю. Если он в базе, пусть сохранит документ и выйдет сам — так не потеряются введённые данные.
- Удалите сеанс. В списке
Сеансывыделите строку (можно несколько через Ctrl), правый клик →Удалить. Пользователь увидит сообщение о том, что сеанс завершён администратором. Несохранённые изменения в открытых формах пропадут, а начатая транзакция откатится. - Если сеанса нет, а канал висит — откройте
Рабочие процессы → <процесс> → СоединенияилиИнформационные базы → <база> → Соединения, найдите строку по компьютеру и приложению, правый клик →Удалить. - Если сеанс не удаляется и снова появляется в списке, он, скорее всего, ждёт ответа от СУБД. Переходите к разделу про блокировки в СУБД ниже.
Перед обновлением конфигурации удобнее не гоняться за каждым сеансом, а закрыть вход в базу:
- Правый клик по базе →
Свойства. - Включите «Блокировка начала сеансов включена», задайте время начала и окончания, сообщение и «Код разрешения».
- Сохраните и удалите оставшиеся сеансы.
С кодом разрешения в базу пускают только того, кто запускает 1С с параметром /UC<код>. Так администратор зайдёт сам, а остальные — нет.
Удаление сеанса посреди записи документа откатывает транзакцию. Данные в базе не портятся, но пользователь потеряет то, что не успел записать. Делайте это после предупреждения, а не молча.
Завершение сеансов изнутри 1С: «Активные пользователи»
Если доступа к консоли нет, но есть права администратора в базе, в типовых конфигурациях на БСП (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) есть обработка «Активные пользователи». Найти её проще всего в разделе Администрирование → группа обслуживания (в Бухгалтерии — Обслуживание, в ЗУП и УТ — Поддержка и обслуживание).
- Откройте список активных пользователей.
- Выделите нужный сеанс и выберите команду завершения сеанса.
- В клиент-серверном варианте программа попросит логин и пароль администратора кластера, если они заданы.
Там же, в группе обслуживания, есть «Блокировка работы пользователей». Это аналог блокировки начала сеансов из консоли: всем работающим приходит предупреждение, а после указанного времени их сеансы завершаются.
Свой собственный сеанс из этой обработки не завершают. Если «завис» второй сеанс того же пользователя, удаляйте его, а не тот, в котором работаете.
Удаление соединений из командной строки через 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 (сеансы на нём не отвечают, память растёт), его можно перезапустить из консоли: Рабочие процессы → правый клик → выключить процесс. Это обрывает все сеансы на этом процессе, поэтому делайте это в нерабочее время или после рассылки предупреждения.
Почему соединения зависают и как этого не допускать
Сеанс сам по себе не зависает — его оставляет что-то снаружи. Частые источники:
Что настроить, чтобы зависших сеансов стало меньше:
- Таймауты в свойствах базы. В консоли, в свойствах информационной базы, есть параметры «Время засыпания пассивного сеанса» и «Время завершения спящего сеанса» (в секундах). Например, 1200 и 3600: сеанс без связи с клиентом заснёт через 20 минут, а спящий сеанс завершится через час.
- Политики терминального сервера. Ограничьте время жизни отключённых сеансов Windows, например 2–4 часами. Тогда брошенные RDP-сессии закроются вместе с 1С.
- Правило для внешних интеграций. COM- и HTTP-обмены должны закрывать соединение после работы. Если интеграция пишет подрядчик, проговорите это заранее.
- Регламентные операции ночью. Пересчёт итогов, закрытие месяца и большие обмены, запущенные днём, чаще всего и создают очереди блокировок.
Автоматическая очистка зависших сеансов по расписанию
Когда брошенных сеансов много каждый день, их удобно чистить скриптом. Ниже — 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. Иначе можно оборвать ночной обмен или чужое обновление.