Как принудительно завершить спящие или неактивные сеансы в 1С 8.3?

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

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

Понимание природы проблемы

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

Решение 1: Управление сеансами через COM-соединение с кластером

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


&НаСервере
Процедура УдалитьСпящиеСеансыЭтойБазыНаСервере()
    СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
    // Проверка на клиент-серверный вариант
    Если Лев(СтрокаСоединения, 5) <> "Srvr=" Тогда
        Сообщить("Это не клиент-серверное соединение");
        Возврат;
    КонецЕсли;

    // Парсинг параметров подключения (упрощенно)
    // Подключаемся к агенту сервера
    Соединитель = Новый COMОбъект("V83.COMConnector");
    СоединениеСАгентом = Соединитель.ConnectAgent(ИмяСервера + ":" + ПортСервера);
    
    // Аутентификация в кластере
    СоединениеСАгентом.Authenticate(НашКластер, Админ, Пароль);
    
    // Получение списка сеансов
    СеансыНашейБазы = СоединениеСАгентом.GetInfoBaseSessions(НашКластер, НашаБаза);
    
    Для Каждого Сеанс Из СеансыНашейБазы Цикл
        // Если сеанс в состоянии сна - завершаем его
        Если Сеанс.Hibernate Тогда
            СоединениеСАгентом.TerminateSession(НашКластер, Сеанс);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Важные замечания по этому методу:

Решение 2: Клиентский таймер неактивности

Если задача требует завершения работы пользователя именно через 15 минут бездействия (независимо от фоновых заданий), самым надежным способом будет реализация клиентского таймера. Этот подход не зависит от состояния «спящего» сеанса на сервере, так как он выполняется на стороне пользователя.

  1. Создайте обработчик ожидания ПодключитьОбработчикОжидания() в модуле управляемого приложения.
  2. В процедуре-обработчике отслеживайте время последнего взаимодействия пользователя с системой (например, обновление переменной при нажатии кнопок).
  3. Если разница между текущим временем и временем последнего действия превышает лимит (например, 900 секунд), вызовите метод ЗавершитьРаботуСистемы().

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

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

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

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

← На главную