Как автоматически завершать сеанс пользователя 1С при отсутствии активности?

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

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

Метод 1. Использование штатных параметров кластера серверов 1С

Первым делом проанализируем возможности, которые предоставляет сама платформа 1С. В консоли администрирования кластера серверов (или через параметры информационной базы в Конфигураторе) предусмотрены специальные настройки для управления «спящими» сеансами. Рассмотрим, как это работает:

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

Однако здесь мы можем столкнуться с проблемой, которую часто обсуждают на форумах: в современных типовых конфигурациях (УТ 11, БП 3.0, ERP) существует множество фоновых процессов и обработчиков ожидания, работающих на клиенте. Например, автоматическое обновление динамических списков или проверка новых сообщений в обсуждениях. Эти действия система может расценивать как активность пользователя, из-за чего сеанс никогда не уснет. Поэтому данный метод эффективен только в тех случаях, когда в конфигурации минимизированы фоновые клиентские вызовы.

Метод 2. Использование WinAPI для отслеживания физической активности

Если нам необходимо гарантированно определить, нажимал ли пользователь кнопки или двигал ли мышью, наиболее надежным способом будет обращение к функциям операционной системы Windows. Выясним, как использовать функцию GetLastInputInfo из библиотеки user32.dll.

Эта функция возвращает время последнего ввода данных в миллисекундах с момента запуска системы. Для реализации в 1С нам потребуется внешняя компонента или использование специализированных объектов. Проанализируем алгоритм работы:

  1. Создаем обработчик ожидания, который будет запускаться раз в минуту.
  2. Через внешнюю компоненту или скрипт запрашиваем системное время последнего ввода.
  3. Сравниваем его с текущим временем системы.
  4. Если разница превышает заданный лимит (например, 15 минут), вызываем штатное завершение работы 1С.

Пример логики на встроенном языке (при наличии соответствующей компоненты):


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

Основное преимущество этого метода в том, что он игнорирует любые программные запросы к серверу 1С и ориентируется только на реальные действия человека за компьютером.

Метод 3. Реализация собственного таймера активности внутри 1С

Рассмотрим ситуацию, когда мы не можем использовать WinAPI (например, работа в Web-клиенте или под Linux). В этом случае мы можем реализовать программный монитор активности внутри самой конфигурации. Идея заключается в отслеживании событий форм.

Разберем по шагам, как это реализовать:

  1. В глобальном модуле или в модуле управляемого приложения определим переменную ДатаПоследнейАктивности.
  2. Используем расширение для конфигурации, чтобы «подцепиться» к событиям ПриАктивизацииОкна или ПриАктивизацииЭлемента во всех формах.
  3. При каждом срабатывании этих событий будем обновлять значение переменной ДатаПоследнейАктивности = ТекущаяДата();.
  4. Подключим обработчик ожидания, который будет периодически проверять разницу между ТекущаяДата() и нашей переменной.

Пример реализации обработчика:


Перем ДатаПоследнейАктивности Экспорт;

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

Процедура ПроверитьТаймерБездействия() Экспорт
    Если ТекущаяДата() - ДатаПоследнейАктивности > 1800 Тогда // 30 минут
        ТекстСообщения = "Работа завершена из-за отсутствия активности.";
        ПоказатьПредупреждение(, ТекстСообщения, 10);
        ЗавершитьРаботуСистемы(Ложь);
    КонецЕсли;
КонецПроцедуры

Важный момент: Чтобы этот механизм работал точно, необходимо в коде каждой формы (или через общий механизм расширений) добавить вызов функции сброса таймера при любых интерактивных действиях пользователя.

Метод 4. Настройки терминального сервера (RDP и RemoteApp)

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

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

Метод 5. Использование возможностей БСП

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

Подведем итог: выбор метода зависит от вашей инфраструктуры. Для локальных сетей и Windows-клиентов идеально подходит WinAPI. Для кроссплатформенных решений — программный таймер в 1С. А для терминальных серверов лучшим выбором будут настройки ОС. В любом случае, перед внедрением системы принудительного завершения работы, обязательно предупредите пользователей, чтобы избежать потери данных в открытых, но не записанных документах.

← На главную