Как управлять сеансами пользователей и завершать «зависшие» сессии в 1С без использования COM-соединения?

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

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

Понимание природы «зависших» сеансов

Прежде чем приступать к принудительному завершению сессий, важно проанализировать, почему они возникают. Зависание сеанса — это чаще всего следствие конфликтов блокировок на уровне SQL Server или нехватки системных ресурсов на сервере приложений. Если сеанс пользователя завис, это не всегда означает, что программа «сломалась». Зачастую сеанс ожидает завершения транзакции, и попытка грубого вмешательства может привести к повреждению данных или сбою в работе других пользователей, работающих в том же rphost (рабочем процессе).

Использование современных методов платформы (версии 8.3.14+)

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

Рассмотрим пример того, как можно завершить сеанс программно:


// Пример использования метода для завершения текущего сеанса
// или управления сессиями (в контексте прав администратора кластера)
Сеанс = ПолучитьТекущийСеанс();
Если ПроверитьУсловияДляЗавершения(Сеанс) Тогда
    Сеанс.ЗавершитьСеанс("Завершение сеанса по регламенту системы из-за отсутствия активности.");
КонецЕсли;

Этот подход предпочтительнее, так как он корректно сообщает платформе о необходимости закрытия сессии, позволяя системе правильно обработать разрыв связи с сервером.

Оптимизация работы кластера и рабочих процессов

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

  1. Объем памяти рабочих процессов до перезапуска: Установите лимиты, при которых сервер будет автоматически перезапускать rphost. Это позволяет очистить память и принудительно «выкинуть» зависшие сеансы, которые накопили критические ошибки.
  2. Безопасный расход памяти за один вызов: Ограничение этого параметра помогает защитить сервер от тяжелых запросов, которые могут «повесить» процесс на длительное время.
  3. Интервал перезапуска процессов: Настройте периодический перезапуск процессов в нерабочие часы или с определенной периодичностью, чтобы система всегда работала «чисто».

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

Автоматизация управления через утилиту RAC

Если использование COMConnector для вас нежелательно из-за времени на инициализацию или ограничений по версии, используйте утилиту командной строки rac.exe (Remote Administration Console). Это штатное средство 1С, которое работает независимо от процесса предприятия.

Вы можете вызывать rac.exe из скриптов PowerShell или через ЗапуститьСистему. Это позволяет быстро получить список сеансов, отфильтровать их по времени создания или пользователю и завершить нужные процессы без нагрузки на сервер приложений, характерной для COM-объектов.

Стратегия контроля при входе пользователя

Если вы хотите предотвратить дублирование сеансов одним пользователем, можно реализовать проверку при старте системы:

  1. При входе пользователя в базу (в процедуре ПриНачалеРаботыСистемы) выполняйте проверку количества активных сеансов данного пользователя.
  2. Если найдено более одного активного сеанса (при условии, что старые сеансы не являются критически важными фоновыми процессами), предлагайте пользователю закрыть предыдущие сессии.
  3. Используйте логирование в Технологический журнал для отслеживания всех подобных ситуаций. Это поможет выявить, почему сеанс не завершился корректно при выходе пользователя из программы (например, из-за аварийного завершения или «крестика» на окне клиента).

Помните, что борьба с зависшими сеансами — это борьба с симптомами. Если проблема носит массовый характер, в первую очередь анализируйте Технологический журнал на предмет событий PROC и CLSTR, а также оптимизируйте запросы к базе данных, которые могут вызывать критические блокировки на уровне SQL Server.

← На главную