Вопрос об эффективном использовании лицензий и обеспечении информационной безопасности часто приводит к необходимости принудительного завершения работы пользователей, которые оставили открытую программу и ушли с рабочего места. В системе 1С:Предприятие существует несколько подходов к решению этой задачи: от стандартных настроек сервера до низкоуровневых функций операционной системы. Разберем подробно каждый из них, проанализируем преимущества и возможные трудности реализации.
Первым делом проанализируем возможности, которые предоставляет сама платформа 1С. В консоли администрирования кластера серверов (или через параметры информационной базы в Конфигураторе) предусмотрены специальные настройки для управления «спящими» сеансами. Рассмотрим, как это работает:
Однако здесь мы можем столкнуться с проблемой, которую часто обсуждают на форумах: в современных типовых конфигурациях (УТ 11, БП 3.0, ERP) существует множество фоновых процессов и обработчиков ожидания, работающих на клиенте. Например, автоматическое обновление динамических списков или проверка новых сообщений в обсуждениях. Эти действия система может расценивать как активность пользователя, из-за чего сеанс никогда не уснет. Поэтому данный метод эффективен только в тех случаях, когда в конфигурации минимизированы фоновые клиентские вызовы.
Если нам необходимо гарантированно определить, нажимал ли пользователь кнопки или двигал ли мышью, наиболее надежным способом будет обращение к функциям операционной системы Windows. Выясним, как использовать функцию GetLastInputInfo из библиотеки user32.dll.
Эта функция возвращает время последнего ввода данных в миллисекундах с момента запуска системы. Для реализации в 1С нам потребуется внешняя компонента или использование специализированных объектов. Проанализируем алгоритм работы:
Пример логики на встроенном языке (при наличии соответствующей компоненты):
Процедура ПроверитьАктивностьПользователя() Экспорт
ВремяПростоя = ВнешняяКомпонента.ПолучитьВремяБездействияВСекундах();
ЛимитПростоя = 900; // 15 минут
Если ВремяПростоя > ЛимитПростоя Тогда
ЗавершитьРаботуСистемы(Ложь, Ложь);
КонецЕсли;
КонецПроцедуры
Основное преимущество этого метода в том, что он игнорирует любые программные запросы к серверу 1С и ориентируется только на реальные действия человека за компьютером.
Рассмотрим ситуацию, когда мы не можем использовать WinAPI (например, работа в Web-клиенте или под Linux). В этом случае мы можем реализовать программный монитор активности внутри самой конфигурации. Идея заключается в отслеживании событий форм.
Разберем по шагам, как это реализовать:
ДатаПоследнейАктивности.ПриАктивизацииОкна или ПриАктивизацииЭлемента во всех формах.ДатаПоследнейАктивности = ТекущаяДата();.ТекущаяДата() и нашей переменной.Пример реализации обработчика:
Перем ДатаПоследнейАктивности Экспорт;
Процедура ПриНачалеРаботыСистемы()
ДатаПоследнейАктивности = ТекущаяДата();
ПодключитьОбработчикОжидания("ПроверитьТаймерБездействия", 60); // проверка раз в минуту
КонецПроцедуры
Процедура ПроверитьТаймерБездействия() Экспорт
Если ТекущаяДата() - ДатаПоследнейАктивности > 1800 Тогда // 30 минут
ТекстСообщения = "Работа завершена из-за отсутствия активности.";
ПоказатьПредупреждение(, ТекстСообщения, 10);
ЗавершитьРаботуСистемы(Ложь);
КонецЕсли;
КонецПроцедуры
Важный момент: Чтобы этот механизм работал точно, необходимо в коде каждой формы (или через общий механизм расширений) добавить вызов функции сброса таймера при любых интерактивных действиях пользователя.
Проанализируем ситуацию, когда пользователи работают через удаленный рабочий стол. Часто проблему эффективнее решить средствами системного администрирования, не затрагивая код 1С. В настройках службы удаленных рабочих столов (RDS) существуют параметры:
Если настроить эти параметры, операционная система сама «прибьет» процесс 1С вместе с сеансом пользователя, если он не совершает действий в окне терминала. Это наиболее «дешевый» в плане разработки способ, который отлично подходит для крупных компаний с терминальным доступом.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), то в ней уже заложен функционал по управлению сеансами. Перейдем в раздел «Администрирование» — «Обслуживание» — «Блокировка работы пользователей». Здесь можно настроить параметры завершения работы при бездействии. БСП умеет корректно завершать сеансы, учитывая открытые окна и несохраненные данные, используя стандартный механизм ЗавершитьРаботуСистемы().
Подведем итог: выбор метода зависит от вашей инфраструктуры. Для локальных сетей и Windows-клиентов идеально подходит WinAPI. Для кроссплатформенных решений — программный таймер в 1С. А для терминальных серверов лучшим выбором будут настройки ОС. В любом случае, перед внедрением системы принудительного завершения работы, обязательно предупредите пользователей, чтобы избежать потери данных в открытых, но не записанных документах.