Зависший пользователь в серверной базе 1С: как выгнать его и не поломать работу остальных

· 9 мин

Содержание

Завершить сеанс на сервере 1С можно тремя способами: кнопкой в консоли администрирования кластера, командой rac session terminate или убийством рабочего процесса rphost. Первый безопаснее всех, последний рубит всё без разбора. Выбирайте с первого по последний и переходите к следующему, только если предыдущий не сработал.

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

Ниже порядок действий для клиент-серверной базы, отдельный раздел про файловую и разбор, почему сеансы вообще зависают.

Что такое сеанс на сервере и где он живёт

Сеанс создаётся при каждом подключении к базе: клиентом, веб-клиентом, конфигуратором, фоновым заданием, внешней обработкой через COM. Один человек может держать несколько сеансов. Это нормально, если открыты клиент и конфигуратор.

На сервере сеанс привязан к рабочему процессу rphost. Вот как это устроено:

  • 🧩 Агент сервера (ragent) принимает подключение и решает, куда его направить.
  • ⚙️ Менеджер кластера (rmngr) хранит список сеансов и блокировок.
  • 🖥️ Рабочий процесс (rphost) исполняет серверный код. Именно в нём «висит» ваш пользователь.

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

Типы сеансов видно в консоли в колонке приложения: «Тонкий клиент», «Веб-клиент», «Конфигуратор», «Фоновое задание». Фоновые задания трогайте осторожно: это может быть обмен или закрытие периода.

Способ 1. Завершение сеанса через консоль кластера

Это штатный путь. Нужна консоль администрирования серверов 1С:Предприятия (оснастка, ставится вместе с сервером, есть и отдельная версия) и права администратора кластера.

  1. Запустите консоль и подключитесь к центральному серверу. Если сервера в списке нет, добавьте его: адрес и порт агента, по умолчанию 1540.
  2. Раскройте нужный кластер, затем узел «Информационные базы» и найдите свою базу.
  3. Откройте у базы ветку «Сеансы». В списке видны пользователь, компьютер, время начала, последняя активность и приложение.
  4. Выделите сеанс, нажмите правую кнопку мыши и выберите пункт завершения (в разных версиях консоли он называется «Удалить» или «Завершить сеанс»).
  5. Подтвердите. Сеанс исчезнет из списка, у пользователя клиент закроется с сообщением о разрыве соединения.

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

Смотрите на два поля. «Последняя активность» у зависшего сеанса остаётся старой, хотя человек сидит и ждёт. А «Вызовов» и «Время вызова» у сеанса, который тормозит, растут: он выполняет одну долгую операцию.

Если пользователей много, отсортируйте список по времени последней активности. Живые сеансы обновляются каждые несколько секунд, мёртвые стоят.

Что сделать до завершения

Пользователь потеряет несохранённые данные. Это неизбежно. Но можно снизить потери:

  • позвоните или напишите ему и попросите закрыть программу сами;
  • проверьте, не идёт ли у него проведение или загрузка. Прерванное проведение в серверной базе откатится транзакцией, а вот прерванная загрузка из файла может оставить частично заполненный документ;
  • для фонового задания посмотрите, что оно делает, в журнале регистрации.

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

Способ 2. Запрет входа в базу и массовое отключение

Когда надо выгнать всех (обновление, свёртка, восстановление из копии), по одному сеансы не завершают. Сначала включают блокировку новых соединений, потом отключают тех, кто остался.

Включается блокировка в свойствах информационной базы в консоли кластера. В окне свойств есть поля:

  • флажок включения блокировки начала сеансов;
  • начало и конец блокировки (дата и время). Оставьте конец пустым, если не знаете, когда закончите;
  • сообщение, которое увидят пытающиеся войти;
  • код разрешения.

Код разрешения позволяет войти вам самому. Запускаете 1С с параметром /UC и вашим кодом, например:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"srv1c\buh" /N"admin" /UC"Obnovlenie"

Остальные получат отказ и текст вашего сообщения. Заодно в том же окне есть флажок блокировки регламентных заданий. Включите его, если обновление не должно пересекаться с фоновыми процессами.

Порядок действий при обновлении

  1. Включите блокировку входа и напишите в сообщении, когда база вернётся. Пользователи уже вошедшие продолжат работать.
  2. Предупредите их в чате или голосом. Хватит пяти-десяти минут.
  3. Откройте список сеансов и завершите оставшиеся. Свои собственные (конфигуратор, консоль) оставьте.
  4. Войдите в конфигуратор по коду разрешения и делайте работу.
  5. После окончания снимите блокировку. Это самый частый забытый пункт: база «не пускает», а все ищут причину в сервере.

Не забудьте снять блокировку и очистить поле сообщения. Иначе утром пользователи увидят «Идёт обновление», а бухгалтерия встанет.

Способ 3. Завершение сеанса из командной строки через rac

Консоль неудобна, когда серверов несколько или нужно скриптом чистить сеансы по расписанию. Тогда используют утилиту администрирования rac. Она лежит в каталоге сервера рядом с ragent и общается с сервером администрирования ras.

Сначала запустите ras, если он ещё не работает как служба:

ras cluster --port=1545 localhost:1540

Потом в другом окне получите идентификатор кластера:

rac localhost:1545 cluster list

В выводе найдите строку cluster — это длинный GUID. Подставьте его дальше. Посмотреть сеансы :

rac localhost:1545 session --cluster=<GUID_кластера> list

Из вывода берите поле session (идентификатор сеанса) и user-name, чтобы не ошибиться. Завершить сеанс:

rac localhost:1545 session --cluster=<GUID_кластера> terminate --session=<GUID_сеанса>

Если кластер защищён паролем администратора, добавьте --cluster-user и --cluster-pwd.

Скрипт «выгнать всех из одной базы»

Список сеансов базы можно отфильтровать по идентификатору информационной базы. Идентификатор берут командой infobase summary list. Общая идея такая: получили список сеансов, оставили нужную базу, в цикле вызвали terminate. Пишите такой скрипт на PowerShell или bash и обязательно сначала запустите вывод списка без завершения, проверьте, что отобрались те, кто нужен.

Через rac можно включить и блокировку входа, не открывая консоль: у команды infobase update есть параметры запрета сеансов, сообщения и кода разрешения. Список параметров покажет rac infobase update --help, по нему сверяйтесь с вашей версией платформы.

Способ 4. Принудительно убить rphost: крайняя мера

Бывает, что сеанс не завершается ни из консоли, ни через rac. Он остаётся в списке, а вызов висит. Тогда остаётся остановить рабочий процесс.

Сравните, чем вы рискуете:

СпособКогда использоватьРиск
Консоль, пункт завершенияОдин зависший пользовательПотеря несохранённого у него
Блокировка + массовое завершениеОбновление, обслуживаниеПотеря у всех вошедших
rac session terminateСкрипты, несколько серверовОшибка в фильтре, выгнали не тех
Убийство rphostСеанс не отвечает на командыСбросятся все сеансы на этом процессе

Порядок действий:

  1. В консоли откройте «Рабочие процессы» и найдите тот, на котором висит сеанс. Запишите его PID.
  2. Посмотрите, сколько сеансов он держит. Если там десятки пользователей, подумайте ещё раз.
  3. В диспетчере задач (или командой taskkill /PID <номер> /F в Windows, kill -9 <номер> в Linux) завершите именно этот процесс.
  4. Менеджер кластера сам поднимет новый rphost. Пользователи переподключатся, но потеряют несохранённое.

Не убивайте ragent и rmngr ради одного сеанса. Остановка агента сбрасывает весь кластер. Это уже не завершение сеанса, а перезапуск сервера.

Если процесс завис и в последний момент вёл запись в базу, СУБД откатит незавершённую транзакцию. Целостность данных в клиент-серверном варианте от этого не страдает: транзакции на стороне PostgreSQL или MS SQL атомарны.

Откуда берутся зависшие сеансы: ищем в журнале регистрации

Если сеансы зависают регулярно, их удаление лечит симптом. Причину ищут в журнале регистрации и в технологическом журнале.

Откройте журнал регистрации в конфигураторе или в режиме 1С:Предприятие (меню «Все функции» либо «Администрирование» → «Журнал регистрации», зависит от конфигурации). Поставьте отбор по пользователю и по периоду, когда он завис. Полезные события:

  • 🔐 «Сеанс. Аутентификация» и «Сеанс. Завершение» — когда вошёл и вышел;
  • ⏳ «Транзакция. Блокировка», тайм-ауты и «Превышено ожидание блокировки» — на чём застрял;
  • 🧨 «Ошибка выполнения» с текстом исключения — что упало перед зависанием;
  • 📄 события проведения и записи документов — что делал пользователь последним.

Чаще всего находятся три причины:

  1. Долгая транзакция. Проведение большого пакета документов держит управляемую блокировку, остальные ждут. Лечится разбиением пакета.
  2. Взаимная блокировка. Два сеанса ждут друг друга. Сервер обычно разрывает такие ситуации по тайм-ауту, но пользователи успевают испугаться.
  3. Обрыв связи. Клиент пропал из сети, а сеанс на сервере остался. Он исчезнет сам через некоторое время, но пока держит лицензию.

Когда журнал регистрации молчит, включают технологический журнал: он показывает вызовы, ожидания и блокировки на уровне СУБД. Настраивается файлом logcfg.xml в каталоге conf платформы. Включайте его на короткое время и с узким отбором: журнал быстро разрастается и сам замедляет сервер.

Дубли в списке с одним пользователем и разными компьютерами часто означают, что человек работает через удалённый стол и забыл закрыть старую сессию. Это не зависание, а лишний сеанс, занимающий лицензию.

Файловая база: сеансов на сервере нет

В файловом варианте нет кластера, консоли и rphost. Каждый клиент открывает файл 1Cv8.1CD напрямую, а информация о тех, кто в базе, лежит в служебном файле блокировки рядом с ним.

Что делать, если надо выгнать пользователя:

  1. Посмотреть, кто в базе. Откройте конфигуратор и найдите в меню «Администрирование» пункт активных пользователей. Он покажет список и позволит отключить выбранных. Для этого конфигуратор должен войти в базу, а если она занята монопольно — подождать.
  2. Попросить выйти. Часто быстрее, чем ждать диалоги.
  3. Завершить процесс у пользователя. Если клиент завис, на его компьютере закройте процесс 1cv8 или 1cv8c в диспетчере задач. Остаточный сеанс в файловой базе пропадёт по обновлению файла блокировки.
  4. Удалить файл блокировки. Только если база заведомо никем не используется, а сеансы-призраки остались после сбоя питания. Файл лежит в каталоге базы, это файл с расширением .cdn. Делайте копию каталога перед чисткой.

Файловая база не защищена транзакционно так, как серверная. Принудительное закрытие клиента во время записи может повредить файл. Перед массовыми действиями сделайте копию каталога базы целиком.

Если подключений больше десяти-пятнадцати одновременно, файловый вариант упирается в сеть и диск. Тогда зависания будут частыми, и это повод переходить на клиент-серверный режим.

Что именно у вас происходит?

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

Можно ли завершить сеанс, не отключая остальных?
Да. Консоль и rac session terminate работают с одним сеансом. Остальные пользователи ничего не заметят.
Почему после завершения пользователь заходит снова и сеанс возвращается?
Клиент мог быть открыт с автоматическим переподключением, либо человек просто запустил 1С заново. Включите блокировку входа, и новые подключения не пройдут.
Освобождается ли лицензия после завершения сеанса?
Да, как только сервер закрыл сеанс. Если лицензия всё ещё занята, проверьте второй сеанс того же пользователя, например конфигуратор или фоновое задание.
Сеанс остаётся в списке после обрыва связи. Что делать?
Подождите: сервер закроет его сам по тайм-ауту. Если срочно, завершите вручную, потери данных там уже нет.
Можно ли завершать сеанс фонового задания?
Можно, но сначала узнайте, что оно делает. Обрыв обмена или закрытия месяца оставит процесс в промежуточном состоянии, и потом придётся перезапускать его вручную.