Разработчики и системные администраторы 1С часто сталкиваются с загадочным поведением платформы: даже если пользователь не совершает никаких действий, а в конфигурации отключены все возможные обработчики ожидания, в консоли кластера серверов 1С «Момент последней активности» обновляется с завидной регулярностью — примерно раз в 400–600 секунд. Разберем подробно, почему это происходит, как работает этот механизм и что делать, если вам нужно принудительно завершать работу неактивных пользователей.
Представим типичный сценарий: вы хотите оптимизировать использование лицензий и настроили в параметрах информационной базы «Время засыпания пассивного сеанса» (например, 20 минут). Логично ожидать, что если кассир или менеджер отошел от компьютера, через 20 минут его сеанс станет «спящим» и освободит лицензию. Однако на практике мы видим, что сеанс продолжает оставаться активным часами.
Проанализируем поведение системы через замер производительности. Как отмечают участники обсуждения, замер производительности в этот момент ничего не показывает. Это происходит потому, что обращение идет на уровне ядра платформы, не исполняя код на языке 1С. Мы имеем дело с механизмом Keep-Alive.
Выясним причину такой активности. Начиная с версии 8.3.5, в платформе реализован встроенный алгоритм поддержания связи между клиентским приложением и сервером. Разберем по шагам, как это работает:
Рассмотрим взаимосвязь с параметром «Время засыпания пассивного сеанса». Этот параметр сработает только в том случае, если клиент перестал присылать те самые фоновые «пинги». Это случается, если:
Проанализируем ситуацию с точки зрения администратора. Если ваша задача — освобождать лицензии, которые занимают пользователи, просто «ушедшие на обед», стандартные настройки времени засыпания в консоли вам не помогут. Платформа будет сама себя «будить» каждые 400 секунд, поддерживая сеанс в тонусе.
Важно понимать различие между пассивным сеансом (с точки зрения платформы) и бездействием пользователя (с точки зрения бизнес-логики). Для платформы открытое окно 1С — это уже активность.
Поскольку мы выяснили, что платформа сама не прекратит активность, нам нужно реализовать контроль действий пользователя на уровне программного кода. Рассмотрим два основных пути решения этой задачи.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), в ней уже есть готовый функционал. Подсистема «Завершение работы пользователей» позволяет настроить автоматическое закрытие программы при отсутствии активности.
Этот механизм работает иначе, чем платформенный Keep-Alive. Он отслеживает именно события операционной системы — нажатия клавиш и движения мыши внутри окна 1С. Если таких событий нет в течение заданного времени, вызывается процедура завершения работы.
Если вы хотите реализовать свой контроль, нам понадобится метод ПодключитьОбработчикОжидания. Посмотрим на логику реализации. Нам нужно фиксировать время последнего действия пользователя и периодически проверять, сколько времени прошло.
В модуле управляемого приложения можно объявить переменную, которая будет хранить время последней активности, и обновлять её в интерактивных событиях. Однако проще использовать глобальный обработчик.
Рассмотрим пример кода для проверки времени простоя:
// В модуле управляемого приложения
Процедура ПриНачалеРаботыСистемы()
// Подключаем проверку раз в минуту (60 секунд)
ПодключитьОбработчикОжидания("ПроверитьАктивностьПользователя", 60);
КонецПроцедуры
Процедура ПроверитьАктивностьПользователя() Экспорт
// Логика определения бездействия
// В БСП для этого используются методы получения времени последней активности
ВремяПростоя = ПолучитьВремяБездействияСистемы();
МаксимальныйПростой = 1200; // 20 минут в секундах
Если ВремяПростоя > МаксимальныйПростой Тогда
ЗавершитьРаботуСистемы(Ложь); // Закрываем без подтверждения
КонецЕсли;
КонецПроцедуры
Стоит отметить, что для точного определения ВремяБездействияСистемы часто используются возможности операционной системы через Windows API (например, функция GetLastInputInfo), так как сама платформа 1С не предоставляет встроенного метода для получения времени последнего перемещения мыши во всем сеансе без доработок каждой формы.
Подведем итоги нашего анализа:
exe-файла или dll-библиотек платформы.ЗавершитьРаботуСистемы()), отслеживающие активность пользователя через механизмы БСП или кастомные обработчики.Таким образом, если вы видите активность каждые 400 секунд — это не «глюк» и не скрытый код в вашей конфигурации, а штатный «пульс» системы, подтверждающий стабильность соединения между клиентом и сервером.