Зависший пользователь держит базу: четыре способа завершить его сеанс
Содержание
В клиент-серверной 1С сессию пользователя закрывают в консоли кластера: Кластеры → <кластер> → Информационные базы → <база> → Сеансы, правый клик по сеансу и команда Удалить. Без графической консоли то же делает утилита rac командой rac session terminate. В файловой базе кластера нет, и сеанс там равен процессу 1cv8.exe или 1cv8c.exe на компьютере пользователя: его закрывают в диспетчере задач или через список открытых файлов на сервере, где лежит база.
Какой способ выбрать? Консоль — для разового случая, когда нужно выгнать одного-двух человек. rac и код — когда операция повторяется: перед ночным обновлением, по расписанию, из скрипта. Диспетчер задач — последний вариант, когда консоль недоступна или сеанс не удаляется штатно.
Сначала посмотрите, кто и чем занят
Не закрывайте сеансы вслепую. В списке почти всегда есть служебные подключения, и удалить их по ошибке — значит оборвать регламентное задание или обмен посреди записи.
Список текущих сеансов можно получить тремя путями:
- 🖥️ Консоль кластера — полная картина: пользователь, компьютер, приложение, время начала, рабочий процесс, занятая лицензия.
- 🔧 Конфигуратор →
Администрирование → Активные пользователи— только просмотр, завершить отсюда нельзя. - 📋 Пользовательский режим →
Все функции → Стандартные → Активные пользователи— тот же список платформы. В типовых конфигурациях на БСП есть одноимённая обработка с командой завершения сеанса (о ней ниже).
Главное в списке — колонка «Приложение». По ней понятно, что за сеанс перед вами:
| Приложение | Что это | Можно ли удалять |
|---|---|---|
| Тонкий клиент, 1CV8C | Обычная работа пользователя | Да, предупредив человека |
| Толстый клиент, 1CV8 | Работа в толстом клиенте | Да, предупредив |
| Конфигуратор, Designer | Кто-то в Конфигураторе | Осторожно: может идти обновление |
| Фоновое задание, BackgroundJob | Регламентные задания, обмены | Только если задание зависло |
| Веб-клиент, WebClient | Вход через браузер | Да |
| COM-соединение, COMConnection | Внешняя программа, обработка | Выясните, чья |
| HTTP- и веб-сервисы | Интеграции, мобильные клиенты | Обычно короткие, сами закрываются |
Если один и тот же пользователь висит в списке трижды, это не обязательно три окна. Часто это «хвосты»: человек закрыл программу аварийно, а сервер ещё не понял, что связь пропала. Такие сеансы смело удаляйте первыми.
Завершение сессии в консоли администрирования кластера
Консоль ставится вместе с сервером 1С или отдельно, компонентом «Администрирование сервера 1С:Предприятия». Если оснастка при запуске выдаёт ошибку или пустое окно, перерегистрируйте библиотеку radmin.dll той же версии, что и сервер:
regsvr32 "C:\Program Files\1cv8\8.3.24.1691\bin\radmin.dll"
Номер версии в пути подставьте свой. Командную строку запускайте от имени администратора.
Пошагово
- Откройте
Консоль кластера серверов 1С:Предприятия. - Если центрального сервера в дереве нет, добавьте его: правый клик по
Central 1C:Enterprise 8.3 servers→Создать → Центральный сервер 1С:Предприятия, укажите имя сервера. Порт агента по умолчанию — 1540. - Раскройте сервер →
Кластеры→ нужный кластер. Если на кластере заданы администраторы, консоль спросит логин и пароль. - Перейдите в
Информационные базы → <имя базы> → Сеансы, чтобы видеть только одну базу. УзелСеансыпрямо под кластером покажет сеансы всех баз сразу. - Найдите сеанс по пользователю и компьютеру.
- Правый клик →
Удалить. Можно выделить несколько строк через Ctrl или Shift.
Сеанс пропадает из списка за несколько секунд. Пользователь получает сообщение о разрыве соединения, а программа у него закрывается или предлагает перезапуск.
Несохранённые данные пользователя пропадут. Незавершённая транзакция откатится: если человек в этот момент проводил документ, документ останется непроведённым. Перед удалением сеанса бухгалтера в разгар закрытия месяца позвоните ему.
Если сеанс не удаляется
Бывает, что сеанс исчезает и тут же появляется снова, или висит со статусом «спящий». Порядок действий:
- Посмотрите в узле
Соединениясоединения этого пользователя и удалите их тоже. - Выясните, какой рабочий процесс обслуживает сеанс (колонка с процессом в списке сеансов).
- Если сеанс держит блокировки и мешает остальным, а удалить его не выходит, остаётся перезапуск рабочего процесса
rphost. Это способ из раздела про диспетчер задач, с его последствиями.
Команда rac: завершение сеанса без графической консоли
Утилита rac работает через сервер администрирования ras. Сервис ras должен быть запущен, порт по умолчанию — 1545. Утилита удобна на Linux-серверах, где оснастки MMC нет, и в скриптах.
Порядок команд:
rem 1. Узнать идентификатор кластера
rac cluster list
rem 2. Список сеансов кластера
rac session list --cluster=<id-кластера>
rem 3. Завершить конкретный сеанс
rac session terminate --cluster=<id-кластера> --session=<id-сеанса>
Если в кластере есть администраторы, добавьте к командам --cluster-user=<логин> --cluster-pwd=<пароль>. Идентификаторы — это длинные GUID из вывода предыдущих команд. Чтобы сузить список до одной базы, к session list добавляют --infobase=<id-базы>, а идентификатор базы берут из rac infobase summary list --cluster=<id-кластера>.
Команда rac session list --licenses выводит, какую лицензию занимает каждый сеанс. Она пригодится, когда пользователи жалуются на «нет свободной лицензии», а людей в программе вроде бы мало.
Остальные параметры — сообщение пользователю при завершении, фильтры, формат вывода — зависят от версии платформы. Смотрите их в справке: rac help session.
Программное завершение сеанса из кода 1С
Встроенный язык умеет показать список сеансов, но завершить чужой сеанс напрямую не может. Для этого нужен доступ к агенту кластера.
Посмотреть сеансы текущей базы
Код ниже работает на сервере и выводит, кто сейчас в базе:
Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
ИмяПользователя = ?(Сеанс.Пользователь = Неопределено, "<без пользователя>", Сеанс.Пользователь.Имя);
Сообщить(СтрШаблон("%1 | %2 | %3 | %4",
Формат(Сеанс.НомерСеанса, "ЧГ=0"),
ИмяПользователя,
Сеанс.ИмяКомпьютера,
Сеанс.ИмяПриложения));
КонецЦикла;
Свой собственный сеанс программа закрывает методом ЗавершитьРаботуСистемы() на клиенте.
Завершить чужой сеанс через COM-соединение с агентом
На Windows-сервере для этого используют COM-объект V83.COMConnector. Библиотека comcntr.dll должна быть зарегистрирована через regsvr32, а её версия — совпадать с версией сервера. Пример ниже находит сеансы пользователя «Иванов» в базе buh и завершает их:
Коннектор = Новый COMОбъект("V83.COMConnector");
Агент = Коннектор.ConnectAgent("tcp://srv1c:1540");
Кластеры = Агент.GetClusters().Выгрузить();
Для Каждого Кластер Из Кластеры Цикл
// Логин и пароль администратора кластера; пустые, если администраторы не заданы
Агент.Authenticate(Кластер, "", "");
Сеансы = Агент.GetSessions(Кластер).Выгрузить();
Для Каждого Сеанс Из Сеансы Цикл
Если Сеанс.UserName = "Иванов" И Сеанс.infoBase.Name = "buh" Тогда
Агент.TerminateSession(Кластер, Сеанс);
КонецЕсли;
КонецЦикла;
КонецЦикла;
Выгрузить() превращает массив COM в обычный массив 1С, так по нему удобнее идти циклом. Чтобы случайно не выгнать фоновые задания, добавьте в условие проверку Сеанс.AppID — например, оставьте только 1CV8C и 1CV8.
Пароль администратора кластера в коде открытым текстом хранить нельзя. Берите его из безопасного хранилища или параметров, к которым нет доступа у рядовых пользователей.
Готовая обработка в типовых конфигурациях
В БП 3.0, ЗУП 3.1, УТ 11 и других конфигурациях на БСП есть обработка «Активные пользователи» с командой завершения выбранного сеанса. В клиент-серверной базе она при первом использовании спросит параметры администрирования кластера: адрес агента, логин и пароль. По сути это тот же COM-вызов, только с формой. Найти её проще всего из раздела Администрирование через поиск по разделу по слову «активные».
Диспетчер задач: принудительное завершение процесса
Этот путь нужен, когда консоли нет под рукой, сеанс не удаляется или база файловая. Важно понимать, какой процесс вы снимаете:
| Процесс | Где работает | Что оборвётся |
|---|---|---|
1cv8c.exe | Компьютер или терминальный сервер пользователя | Только сеанс этого пользователя |
1cv8.exe | То же, толстый клиент или Конфигуратор | Только этот сеанс |
rphost.exe | Сервер 1С | Все сеансы, которые обслуживает процесс, у многих людей сразу |
ragent.exe, rmngr.exe | Сервер 1С | Весь кластер. Не трогайте |
На терминальном сервере удобно снять клиент конкретного человека командой:
taskkill /FI "USERNAME eq DOMAIN\ivanov" /IM 1cv8c.exe /F
Тот же результат даёт вкладка «Пользователи» диспетчера задач: развернуть нужного пользователя, выбрать процесс 1С, Снять задачу.
Завершение rphost.exe обрывает работу всех пользователей этого процесса, а не одного. Делайте это только в нерабочее время или предупредив всех. Кластер сам запустит новый рабочий процесс, но всё несохранённое пропадёт.
После снятия клиентского процесса серверный сеанс в клиент-серверной базе может провисеть ещё какое-то время, пока сервер не заметит разрыв. Если он мешает прямо сейчас, удалите его в консоли.
Файловая база: как выгнать пользователя без кластера
В файловом варианте нет ни консоли, ни rac. Каждый пользователь сам открывает файл 1Cv8.1CD. Значит, и закрывать нужно процесс или открытый файл.
Способ 1. Открытые файлы на сервере
Если база лежит в общей папке на Windows-сервере:
- На сервере откройте
fsmgmt.msc(Общие папки). - Перейдите в
Открытые файлы. - Найдите строки с файлом
1Cv8.1CDи путём к базе. В колонке «Пользователь» видно, кто его держит. - Правый клик →
Закрыть открытый файл.
Метод работает даже тогда, когда компьютер пользователя выключен или недоступен, а файл всё ещё числится открытым.
Закрытие файла посреди записи может повредить базу. Перед этим попросите пользователя выйти сам, а если он недоступен — сделайте копию каталога базы.
Способ 2. Процесс на компьютере пользователя
Подключитесь к компьютеру удалённо или попросите коллегу закрыть 1С. Если программа не отвечает — снимите 1cv8c.exe или 1cv8.exe в диспетчере задач.
Если база не открывается монопольно, а в ней никого нет
После аварийного выхода в каталоге базы иногда остаётся служебный файл блокировки 1Cv8.1CL. Если все пользователи точно вышли (проверьте открытые файлы на сервере), а Конфигуратор пишет, что база занята, этот файл можно удалить. Делайте это только при закрытой у всех 1С: удаление при работающих пользователях ведёт к ошибкам записи.
Блокировка входа и таймауты: чтобы сеансы не копились
Удалённый сеанс часто возвращается через минуту: пользователь просто заходит заново. Перед обновлением или тестированием базы вход нужно запретить.
Блокировка начала сеансов
В клиент-серверной базе это делается в консоли: свойства информационной базы → флажок Блокировка начала сеансов включена. Там же задают:
- ⏰ время начала и окончания блокировки;
- 💬 сообщение, которое увидят пользователи при попытке войти;
- 🔑 код разрешения — с ним администратор сможет зайти, несмотря на блокировку.
Чтобы войти с кодом разрешения, добавьте к строке запуска параметр /UC<код>, например /UC12345. Без кода войти не получится ни у кого, включая вас.
В типовых конфигурациях на БСП есть своя форма «Блокировка работы пользователей». Она работает и для файловой базы: ставит блокировку, предупреждает пользователей и через заданное время завершает их сеансы сама.
Таймауты неактивных сеансов
В свойствах информационной базы в консоли есть параметры Время засыпания пассивного сеанса и Время завершения спящего сеанса (значения в секундах). Они касаются сеансов, у которых пропала связь с клиентом. Первый задаёт, через сколько такой сеанс «уснёт» и отпустит лицензию. Второй — через сколько спящий сеанс будет завершён окончательно.
Разумная практика для офиса — завершать спящие сеансы через несколько часов. Тогда утром на сервере не висят вчерашние «хвосты», а человек, у которого моргнул интернет, успевает переподключиться к своему сеансу.
Частые вопросы
Освобождается ли лицензия сразу после удаления сеанса?
Узнает ли пользователь, что его сеанс завершили?
Можно ли закрыть сеанс без прав администратора кластера?
rac и COM-соединение потребуют их логин и пароль. Права пользователя внутри самой базы для этого не подходят.