Удаление зависших сеансов и соединений в 1С 8.3

· 9 мин

Содержание

Сбросить сессию в клиент-серверной базе быстрее всего через консоль администрирования кластера: Кластеры → <ваш кластер> → Сеансы, правой кнопкой по строке — Удалить. Если консоли под рукой нет, то же самое делает утилита rac из командной строки или код на стороне сервера. В файловой базе отдельной «консоли сеансов» не существует — там всё решается на машине пользователя.

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

Диагностика: кто висит в базе и почему

Прежде чем что-то удалять, посмотрите список сеансов. В консоли администрации серверов откройте Кластеры → <кластер> → Сеансы. Полезные колонки:

  • 🧍 Пользователь — чьё подключение.
  • ⏱ Активность — когда сеанс последний раз обращался к серверу.
  • 💻 Приложение — тонкий клиент, веб-клиент, фоновое задание, Конфигуратор.
  • 🧮 Захвачено данных / Текущий вызов — что сеанс делает прямо сейчас.

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

Типичные причины, по которым сеанс «не отпускает» базу:

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

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

Полезно помнить, как устроено подключение в клиент-серверном варианте — это объясняет, почему способы разные. Клиент сначала обращается к агенту сервера (по умолчанию порт 1540), тот переадресует к менеджеру кластера (1541), а рабочие процессы слушают диапазон портов, заданный в свойствах рабочего сервера. Консоль администрирования ходит через агент, а утилита rac — через отдельный сервис ras (порт 1545). В файловой базе ничего этого нет, поэтому и «сбрасывать сеанс» там нечем.

Выбор способа зависит от того, какая база и какой доступ есть под рукой:

Вариант базы / доступЧем сбрасывать сеанс
Серверная, есть графический доступКонсоль администрирования (оснастка MMC)
Серверная, только командная строкаУтилита rac через сервис ras
Серверная, есть права администратора в базеКод на сервере или список «Активные пользователи»
ФайловаяТолько на машине пользователя (выход / 1cv8.exe)

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

Это штатный способ для серверной (клиент-серверной) базы.

  1. Запустите Консоль администрирования серверов 1С Предприятия (оснастка MMC).
  2. Разверните Central server → <имя сервера> → Кластеры → <кластер> → Сеансы.
  3. Найдите нужную строку по имени пользователя и времени.
  4. Правой кнопкой → Удалить. Соединение закрывается, сеанс исчезает из списка.

Если в списке оснасток нет пункта «1С:Предприятие», консоль не зарегистрирована. Зарегистрируйте библиотеку оснастки из каталога платформы:

regsvr32 "C:\Program Files\1cv8\<номер версии>\bin\radmin.dll"

После обновления платформы оснастка иногда «теряется» — та же команда с путём к новой версии её вернёт.

Когда нужно завершить не один сеанс, а освободить базу целиком (перед обновлением, выгрузкой .dt, тестированием и исправлением), удобнее не удалять сеансы по одному, а запретить новые подключения. В свойствах информационной базы (Кластеры → <кластер> → Информационные базы → <ИБ> → Свойства) включите блокировку начала сеансов и задайте код разрешения. После этого:

  • новые пользователи войти не смогут;
  • вы удаляете оставшиеся сеансы в узле Сеансы;
  • сами заходите с параметром запуска /UC <код разрешения>.

Этот приём экономит время, когда перед регламентными работами нужно гарантированно остаться в базе одному: сначала запрет на вход, потом зачистка хвостов. Иначе вы удаляете сеанс, а на его место тут же заходит следующий пользователь.

Не снимайте блокировку, пока не закончите обслуживание, иначе пользователи начнут входить в середину процесса.

Завершение сеансов утилитой rac из командной строки

Когда к серверу нет графического доступа (только SSH, удалённая консоль), сеансы завершает консольная утилита администрирования rac. Она работает через сервис ras (по умолчанию порт 1545), запущенный на сервере 1С.

Сначала узнайте идентификатор кластера:

rac localhost:1545 cluster list

Из вывода возьмите значение cluster (UUID). Дальше посмотрите сеансы:

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

У каждого сеанса будет свой session (UUID). Завершите нужный:

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

Если на кластере задан администратор, добавьте к командам его учётные данные (параметры вида --cluster-user и --cluster-pwd). Полный список параметров под вашу версию платформы всегда показывает встроенная справка — rac help и rac session help; не полагайтесь на подсмотренные где-то флаги, у разных релизов они отличаются.

Пара практических моментов:

  • Для завершения нужен именно UUID сеанса (session), а не короткий номер сеанса из консоли — их легко перепутать. Берите значение из вывода session list.
  • Если на кластере несколько баз, список сеансов удобно сузить до одной информационной базы, чтобы не искать нужную строку среди чужих подключений. Как это сделать в вашей версии — подскажет rac session help.
  • Вывод session list показывает приложение и время последней активности — по ним в скрипте отбирают «мёртвые» сеансы перед завершением.

Преимущество rac — его легко поставить в скрипт: отобрать сеансы по имени пользователя или по приложению и завершить пачкой. На этом строится автоматическая очистка (ниже).

Как завершить сеанс программно, средствами конфигурации

Иногда администратору консоли недоступны, зато есть права в самой базе. На сервере работают два глобальных метода платформы: ПолучитьСеансыИнформационнойБазы() возвращает массив сеансов, а УдалитьСеансыИнформационнойБазы() их завершает. Оба доступны только в клиент-серверном варианте и требуют административных прав.

Процедуру удобно вызвать из обработки или внешней обработки (серверный контекст):

Процедура ЗавершитьСеансыПользователя(ИмяПользователя) Экспорт

    ТекущийНомер = НомерСеансаИнформационнойБазы();
    СеансыНаУдаление = Новый Массив;

    Для Каждого Сеанс Из ПолучитьСеансыИнформационнойБазы() Цикл
        Если Сеанс.НомерСеанса = ТекущийНомер Тогда
            Продолжить; // свой сеанс завершить нельзя
        КонецЕсли;
        Если Сеанс.Пользователь.Имя = ИмяПользователя Тогда
            СеансыНаУдаление.Добавить(Сеанс);
        КонецЕсли;
    КонецЦикла;

    Если СеансыНаУдаление.Количество() > 0 Тогда
        УдалитьСеансыИнформационнойБазы(СеансыНаУдаление);
    КонецЕсли;

КонецПроцедуры

Важные детали:

  • Свой текущий сеанс метод завершить не даст — его мы пропускаем по НомерСеансаИнформационнойБазы().
  • У объекта сеанса есть поля Пользователь, НачалоСеанса, Приложение, НомерСеанса — по ним отбирают нужные подключения (например, только фоновые задания или только «тихие» с утра сеансы).

Чаще всего так завершают зависшие фоновые задания: они работают под своими сеансами, в списке видны как отдельное приложение, и отобрать их по полю Приложение проще, чем искать вручную в консоли.

В типовых конфигурациях на БСП ходить в код обычно не нужно — там уже есть список Активные пользователи (открывается через Все функции → Стандартные → Активные пользователи, а в типовых — из раздела администрирования). Администратор видит все сеансы и может завершить выбранный кнопкой завершения сеанса. Это тот же механизм, но без обработок.

Сброс зависшей сессии в файловой базе

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

Что реально помогает:

  1. Попросите пользователя корректно выйти из программы.
  2. Если клиент завис намертво — завершите на его машине процесс 1cv8.exe в диспетчере задач.
  3. После аварийного закрытия база иногда остаётся «занятой»: при входе пишет, что с ней уже работают, хотя никого нет. Это след незакрытого подключения.

«Повисшую» занятость снимают так: убедитесь, что ни на одной машине не запущен 1cv8.exe, подключённый к этой папке, и только после этого удалите служебный файл блокировок в каталоге базы (обычно это 1Cv8.1CL). Сама база (1Cv8.1CD) не трогается.

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

Для файловых баз надёжнее профилактика: держать базу на хорошем канале (сетевая папка с обрывами связи — главный поставщик зависаний) и по возможности перевести многопользовательскую работу на серверный вариант.

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

Чтобы не ловить зависшие сеансы вручную, настройте их автоотключение.

В типовых на БСП. В разделе Администрирование → Настройки пользователей и прав есть параметр завершения работы неактивных пользователей — задаёте тайм-аут (например, 30 минут), и платформа сама закрывает «забытые» сеансы. Там же включается ограничение на время сеанса.

Через планировщик и rac. На сервере можно повесить задачу (Планировщик заданий Windows или cron на Linux), которая раз в N минут запускает скрипт с rac: получает список сеансов, отбирает те, у кого активность старше порога, и завершает их. Логику отбора по времени последней активности держите в скрипте, а не в флагах rac.

На уровне кластера. В свойствах рабочего сервера есть параметры тайм-аутов соединений и принудительного завершения проблемных процессов. Их имеет смысл настроить вместе с перезапуском рабочих процессов по памяти (см. ниже) — тогда «подтекающие» сеансы не копятся.

Что настроить, чтобы сеансы не копились
Выполнено: 0 / 4

Как не доводить базу до зависаний

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

  • 🧠 Ограничьте память рабочих процессов. В свойствах рабочего сервера задайте максимальный объём памяти: процесс, превысивший порог, будет аккуратно перезапущен, и утечки не накопятся.
  • 🐌 Разберитесь с тяжёлыми отчётами. Отчёт без периода и отборов, запущенный на всей базе, вешает сеанс и грузит сервер. Приучите пользователей задавать отбор; тяжёлые выгрузки выносите на фоновые задания и на ночь.
  • 🔒 Сократите длинные транзакции. Проведение документа, которое держит блокировку минутами, выстраивает за собой очередь. Чем короче транзакция, тем меньше «висящих» рядом сеансов.
  • 🌐 Следите за сетью. Обрывы связи с тонким клиентом оставляют сеансы, которые сервер закроет только по тайм-ауту. Стабильный канал убирает половину «мёртвых» подключений.
  • 🆙 Обновляйте платформу. Часть проблем с зависаниями и утечками закрывается в свежих релизах платформы.

Регламентное обслуживание (перезапуск рабочих процессов ночью, контроль размера файла блокировок, обновление статистики СУБД) снимает большинство причин, по которым сеансы вообще начинают виснуть.

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

Удалённый сеанс можно вернуть?
Нет. Завершение сеанса необратимо: несохранённые данные пользователя пропадают, транзакция откатывается. Поэтому сначала убеждаются, что сеанс действительно завис.
Чем сеанс отличается от соединения?
Сеанс — это сам факт работы пользователя в базе, соединение — канал к рабочему процессу. У одного сеанса может быть несколько соединений. В консоли есть оба узла; обычно завершают сеанс, соединение закрывается следом.
Почему после удаления сеанс снова появляется?
Скорее всего, у пользователя не закрыт клиент и он автоматически переподключается, либо это фоновое задание, которое перезапускается по расписанию. Отключите задание или закройте клиент, потом завершайте сеанс.
Как освободить базу перед обновлением, не удаляя сеансы по одному?
Включите в свойствах информационной базы блокировку начала сеансов с кодом разрешения, завершите оставшиеся сеансы, а сами входите с параметром /UC <код>.
Можно ли завершить чужой сеанс в файловой базе?
Штатно — нет. В файловом варианте нет сервиса администрирования. Остаётся попросить пользователя выйти или завершить его процесс 1cv8.exe на его компьютере.