Почему активность сеанса в 1С обновляется каждые 400 секунд и как это контролировать

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

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

Анализируем ситуацию: почему сеанс не «засыпает»?

Представим типичный сценарий: вы хотите оптимизировать использование лицензий и настроили в параметрах информационной базы «Время засыпания пассивного сеанса» (например, 20 минут). Логично ожидать, что если кассир или менеджер отошел от компьютера, через 20 минут его сеанс станет «спящим» и освободит лицензию. Однако на практике мы видим, что сеанс продолжает оставаться активным часами.

Проанализируем поведение системы через замер производительности. Как отмечают участники обсуждения, замер производительности в этот момент ничего не показывает. Это происходит потому, что обращение идет на уровне ядра платформы, не исполняя код на языке 1С. Мы имеем дело с механизмом Keep-Alive.

Механизм Keep-Alive: «пульс» платформы

Выясним причину такой активности. Начиная с версии 8.3.5, в платформе реализован встроенный алгоритм поддержания связи между клиентским приложением и сервером. Разберем по шагам, как это работает:

  1. Фоновое пингование: Клиентское приложение (тонкий или толстый клиент) периодически отправляет на сервер короткий пакет данных. Это необходимо для того, чтобы сервер «знал», что клиент жив, связь не оборвана, а приложение не закрыто аварийно.
  2. Интервал: Этот интервал жестко зашит в платформу и обычно составляет от 400 до 700 секунд. Именно эти «всплески» мы и видим в консоли кластера.
  3. Цель: Если бы этого механизма не было, любой сеанс при отсутствии действий пользователя неминуемо переходил бы в статус спящего через интервал, указанный в настройках базы. Платформа же считает, что если окно программы открыто и компьютер не ушел в режим гибернации, то закрывать сеанс преждевременно.

Рассмотрим взаимосвязь с параметром «Время засыпания пассивного сеанса». Этот параметр сработает только в том случае, если клиент перестал присылать те самые фоновые «пинги». Это случается, если:

Почему штатные настройки не помогают выгонять пользователей?

Проанализируем ситуацию с точки зрения администратора. Если ваша задача — освобождать лицензии, которые занимают пользователи, просто «ушедшие на обед», стандартные настройки времени засыпания в консоли вам не помогут. Платформа будет сама себя «будить» каждые 400 секунд, поддерживая сеанс в тонусе.

Важно понимать различие между пассивным сеансом (с точки зрения платформы) и бездействием пользователя (с точки зрения бизнес-логики). Для платформы открытое окно 1С — это уже активность.

Как реализовать принудительное завершение работы при бездействии?

Поскольку мы выяснили, что платформа сама не прекратит активность, нам нужно реализовать контроль действий пользователя на уровне программного кода. Рассмотрим два основных пути решения этой задачи.

Вариант 1: Использование механизмов БСП

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

Этот механизм работает иначе, чем платформенный Keep-Alive. Он отслеживает именно события операционной системы — нажатия клавиш и движения мыши внутри окна 1С. Если таких событий нет в течение заданного времени, вызывается процедура завершения работы.

Вариант 2: Собственный обработчик ожидания

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

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

Рассмотрим пример кода для проверки времени простоя:


// В модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
    // Подключаем проверку раз в минуту (60 секунд)
    ПодключитьОбработчикОжидания("ПроверитьАктивностьПользователя", 60);
КонецПроцедуры

Процедура ПроверитьАктивностьПользователя() Экспорт
    // Логика определения бездействия
    // В БСП для этого используются методы получения времени последней активности
    ВремяПростоя = ПолучитьВремяБездействияСистемы(); 
    
    МаксимальныйПростой = 1200; // 20 минут в секундах
    
    Если ВремяПростоя > МаксимальныйПростой Тогда
        ЗавершитьРаботуСистемы(Ложь); // Закрываем без подтверждения
    КонецЕсли;
КонецПроцедуры

Стоит отметить, что для точного определения ВремяБездействияСистемы часто используются возможности операционной системы через Windows API (например, функция GetLastInputInfo), так как сама платформа 1С не предоставляет встроенного метода для получения времени последнего перемещения мыши во всем сеансе без доработок каждой формы.

Резюме и выводы

Подведем итоги нашего анализа:

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

← На главную