Как автоматически удалять сеансы пользователей на сервере 1С:Предприятие

Системный администратор 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе эксплуатации клиент-серверной версии 1С:Предприятия системные администраторы часто сталкиваются с проблемой «зависших» или «фантомных» сеансов. Пользователи уже давно закрыли программу или отключились от сети, но на сервере их сеансы продолжают числиться активными. Это не только занимает лицензии, но и блокирует выполнение регламентных операций, таких как выгрузка информационной базы или обновление конфигурации. Разберем подробно, как автоматизировать процесс очистки таких сеансов, используя штатные средства платформы и программные методы. Для регулярного автоматического выполнения обслуживания баз по расписанию можно задействовать программу для обновления и архивирования баз 1С.

Метод 1. Настройка таймаутов в консоли администрирования кластера

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

  1. Время засыпания пассивного сеанса: этот параметр определяет, через какой период неактивности пользователя сеанс перейдет в состояние «спящего».
  2. Время завершения спящего сеанса: это критически важный параметр. По умолчанию он может составлять 86 400 секунд (24 часа). Если мы хотим, чтобы «забытые» сеансы удалялись автоматически, это значение стоит существенно уменьшить, например, до 1200–3600 секунд (20–60 минут).

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

Метод 2. Программное завершение сеансов на встроенном языке 1С

Если нам необходимо принудительно завершить работу всех пользователей перед выполнением конкретной задачи (например, перед выгрузкой .dt), мы можем воспользоваться методами встроенного языка. Выясним, как это реализовано в различных версиях платформы.

Рассмотрим пример кода, который позволяет перебрать все активные сеансы и отключить их, за исключением текущего сеанса администратора, от имени которого запущен процесс:


ТекущийНомерСеанса = НомерСеансаИнформационнойБазы();
СеансыИБ = ПолучитьСеансыИнформационнойБазы();

Для Каждого Сеанс Из СеансыИБ Цикл
    Если Сеанс.НомерСеанса <> ТекущийНомерСеанса Тогда
        Сообщение = "";
        // Используем метод глобального контекста или функции БСП
        Результат = СоединенияИБКлиентСервер.ОтключитьСеанс(Сеанс.НомерСеанса, Сообщение);
        
        Если Не Результат Тогда
            ЗаписьЖурналаРегистрации("ОчисткаСеансов", УровеньЖурналаРегистрации.Ошибка, , , 
                "Не удалось отключить сеанс: " + Сеанс.НомерСеанса + ". Ошибка: " + Сообщение);
        КонецЕсли;
    КонецЕсли;
КонецЦикла;

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


Процедура УдалитьВсеСеансыКромеТекущего(ПараметрыАдминистрирования) Экспорт
    
    Фильтр = Новый Массив;
    ОписаниеФильтра = Новый Структура;
    ОписаниеФильтра.Вставить("Свойство", "Номер");
    ОписаниеФильтра.Вставить("ВидСравнения", ВидСравнения.НеРавно);
    ОписаниеФильтра.Вставить("Значение", СоединенияИБВызовСервера.НомерТекущегоСеанса());
    
    Фильтр.Добавить(ОписаниеФильтра);
    
    // Вызов метода БСП для массового удаления сеансов
    АдминистрированиеКластераКлиентСервер.УдалитьСеансыИнформационнойБазы(
        ПараметрыАдминистрирования, 
        , 
        Фильтр
    );
    
КонецПроцедуры

Метод 3. Использование утилиты RAC и службы RAS

Для полной автоматизации внешними средствами (например, из планировщика задач Windows или скриптов на Linux) идеально подходит утилита rac.exe. Это Remote Administration Client, который взаимодействует со службой ras (Remote Administration Service). Для облегчения этой работы можно воспользоваться альтернативной графической консолью администрирования 1С.

Рассмотрим шаги для настройки такой автоматизации:

  1. Убедимся, что служба ras запущена. Обычно она запускается командой: ras.exe cluster --port=1545 localhost:1540.
  2. Используем команду rac session terminate для удаления сеансов.

Пример командной строки для удаления конкретного сеанса (в реальном скрипте сначала потребуется получить список идентификаторов сеансов через rac session list):

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

Преимущество этого метода в том, что он не требует запуска тяжелого клиента 1С и может быть интегрирован в любой bash-скрипт или PowerShell-сценарий, который подготавливает базу к резервному копированию.

Метод 4. Блокировка соединений и завершение работы пользователей

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

Посмотрим, как правильно настроить блокировку:

При установке блокировки современные типовые решения (УТ 11, ERP, БСП) автоматически запускают регламентное задание, которое рассылает пользователям оповещение и корректно завершает работу клиентских приложений в течение 5 минут. Это гораздо гуманнее и безопаснее для целостности данных, чем принудительное «обрубание» по TCP-соединению.

Метод 5. Особенности работы с PostgreSQL и TCP Keep-Alive

Разберем причину, по которой сеансы могут «висеть» на уровне операционной системы. Часто это происходит из-за некорректного разрыва сетевого соединения (например, при переходе ноутбука в спящий режим). Сервер 1С ждет ответа от клиента и не закрывает сеанс.

Проанализируем настройки TCP Keep-Alive. В операционной системе (Windows или Linux) по умолчанию интервал проверки «живучести» соединения может быть очень большим (до 2 часов). Если сократить параметры KeepAliveTime и KeepAliveInterval в реестре Windows (ветка HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters) до 5-10 минут, операционная система будет быстрее сообщать серверу 1С о разрыве связи, и rphost сам инициирует закрытие сеанса.

В случае с PostgreSQL, если после удаления сеанса в консоли 1С в базе данных все еще висят процессы в статусе idle in transaction, можно воспользоваться командой SQL:


SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'имя_вашей_базы' 
AND state = 'idle' 
AND state_change < current_timestamp - interval '1 hour';

Однако помните, что прямое вмешательство в процессы СУБД — это крайняя мера, которую стоит использовать только тогда, когда штатные средства 1С не дали результата.

Подведение итогов

Мы рассмотрели несколько уровней автоматизации удаления сеансов: от простых настроек таймаутов кластера до использования внешних утилит и программного кода. Для стабильной работы системы рекомендуется комбинировать эти подходы: настроить адекватные таймауты для спящих сеансов и использовать механизмы блокировки соединений при выполнении регламентных задач. Это обеспечит чистоту списка активных пользователей и бесперебойную работу автоматических процедур обслуживания базы. Для этой задачи также можно использовать веб-приложение для управления сеансами 1С и процессами rphost.

← На главную