При работе пользователей через веб-клиент 1С часто возникает ситуация, когда вкладка браузера остается открытой, но фактически за компьютером никого нет. Такие "зависшие" сеансы продолжают удерживать клиентские лицензии, мешают обновлению конфигурации и создают угрозу информационной безопасности. Особенно остро эта проблема стоит в веб-клиенте, поскольку стандартные таймауты веб-серверов (IIS или Apache) часто игнорируются из-за регулярных фоновых запросов (пингов), которые платформа 1С отправляет каждые несколько минут для поддержания связи.
В этой статье мы подробно разберем, как решить проблему контроля неактивности пользователей. Мы рассмотрим как новые штатные механизмы платформы, так и альтернативные варианты настройки кластера серверов и программные методы с использованием JavaScript.
Прежде чем приступать к программной реализации, давайте проанализируем, что именно мы будем считать бездействием. Как справедливо заметили участники обсуждения, простое отсутствие кликов мышкой или нажатий клавиш не всегда означает, что пользователя нет на месте. Например, бухгалтер может внимательно сверять бумажную первичную документацию с данными на экране в течение 10–15 минут. Если в этот момент система принудительно завершит работу, это вызовет крайнее раздражение сотрудника и приведет к потере несохраненных данных.
Поэтому наиболее надежным подходом является комбинирование методов: отслеживание интерактивных действий пользователя, мониторинг изменения активных окон и использование предупреждения с обратным отсчетом времени перед закрытием сессии. Рассмотрим подробнее каждый из способов реализации этой задачи.
В современных версиях платформы 1С:Предприятие (начиная с релиза 8.3.26) фирма "1С" добавила встроенный инструмент для автоматического закрытия сессий при бездействии. Этот механизм работает аналогично интернет-банкам и идеально подходит для веб-клиента.
Основные возможности штатного механизма:
Настройку этих параметров можно выполнить в Конфигураторе или через меню "Функции для технического специалиста" в режиме предприятия. В Библиотеке стандартных подсистем (БСП) эти параметры выведены в удобную форму "Настройки входа" в разделе администрирования пользователей.
Мы также можем управлять этим поведением программно с помощью встроенного языка 1С. Рассмотрим пример кода для программной установки параметров бездействия:
// Пример настройки параметров автоматического завершения сеанса
ПараметрыБездействия = Новый ПараметрыЗавершенияСеансаПриБездействии;
ПараметрыБездействия.Использовать = Истина;
ПараметрыБездействия.ВремяБездействия = 1800; // Время бездействия в секундах (30 минут)
ПараметрыБездействия.ВремяПредупреждения = 60; // Время показа окна предупреждения в секундах (1 минута)
УстановитьПараметрыЗавершенияСеансаПриБездействии(ПараметрыБездействия);
Использование этого метода является наиболее приоритетным и безопасным, так как платформа сама корректно завершает транзакции и закрывает соединение, не вызывая сбоев в базе данных.
Если ваша информационная база работает на более старых версиях платформы (до 8.3.26), вы можете настроить параметры перевода пассивных сеансов в спящий режим на сервере 1С. Это позволяет временно высвобождать лицензии.
Разберем основные параметры настройки в консоли администрирования кластера серверов 1С:
IdleTimeout) — определяет период неактивности (в секундах), после которого сеанс засыпает. Спящий сеанс не расходует лицензию 1С, но при возобновлении активности пользователем сеанс быстро "просыпается".SleepTimeout) — определяет, через какое время спящий сеанс будет окончательно удален сервером.Важный нюанс: Не рекомендуется устанавливать время засыпания сеанса менее 10 минут (600 секунд). Дело в том, что веб-клиент и тонкий клиент регулярно отправляют на сервер фоновые пакеты (пинги) для подтверждения активности соединения. Если установить слишком короткий таймаут, сеанс будет постоянно засыпать и сразу же просыпаться от очередного автоматического пинга, что создаст избыточную нагрузку на сервер приложений.
Существует распространенное заблуждение, что в веб-клиенте 1С невозможно отследить движения мыши или активность клавиатуры (как утверждалось в сообщениях форума). На самом деле, мы можем легко решить эту задачу, внедрив JavaScript-код в поле HTML-документа на форме 1С.
Современные браузеры предоставляют мощный инструмент Page Visibility API (свойство document.hidden и событие visibilitychange), который позволяет узнать, видна ли вкладка с 1С пользователю в данный момент, или же она свернута/перекрыта другим окном.
Проанализируем пример схемы работы такого механизма:
mousemove), нажатия клавиш (keypress) и изменения видимости страницы (visibilitychange).Посмотрим на пример простейшего JavaScript-кода, который можно использовать для отслеживания событий внутри HTML-поля:
<html>
<head>
<script>
var lastActivityTime = Date.now();
function resetTimer() {
lastActivityTime = Date.now();
// Отправляем сообщение обратно в форму 1С через специальный обработчик
window.parent.postMessage({ type: "UserActivity", timestamp: lastActivityTime }, "*");
}
// Подписываемся на события мыши и клавиатуры
document.addEventListener("mousemove", resetTimer);
document.addEventListener("keypress", resetTimer);
// Отслеживаем сворачивание вкладки браузера
document.addEventListener("visibilitychange", function() {
if (document.hidden) {
// Вкладка скрыта, можно сразу зафиксировать потенциальное отсутствие
window.parent.postMessage({ type: "PageHidden" }, "*");
}
});
</script>
</head>
<body></body>
</html>
В коде 1С на форме мы обрабатываем событие ПриНажатии или специализированный обработчик ожидания, который считывает данные из HTML-поля и принимает решение о необходимости предупреждения или закрытия программы.
Если мы хотим избежать резкого отключения пользователя, который просто долго изучает сложный отчет на экране, мы можем использовать алгоритм анализа состояния окон в 1С. Это "мягкий" способ контроля, не требующий интеграции с JavaScript.
Для этого мы можем использовать глобальный обработчик ожидания, который будет периодически проверять состояние интерфейса с помощью встроенных функций платформы:
ПолучитьОкна() — позволяет узнать список всех открытых окон приложения.ТекущийЭлемент формы — позволяет определить, в каком поле ввода сейчас находится фокус.ВводДоступен() — проверяет, доступен ли сейчас интерактивный ввод пользователю.Рассмотрим логику работы такого алгоритма: обработчик ожидания раз в 5 минут проверяет, изменился ли состав открытых окон, активная форма или текущий элемент на ней. Если в течение долгого времени (например, 1 часа) состав окон и активный элемент остаются абсолютно неизменными — это явный признак того, что пользователь оставил компьютер открытым. В таком случае мы можем вывести программное предупреждение на экран с помощью метода ПоказатьВопрос() с таймаутом завершения, и если ответа не последует, завершить работу приложения командой ЗавершитьРаботуСистемы(Ложь).