Многие администраторы и разработчики 1С сталкиваются с ситуацией, когда в «Параметрах информационной базы» выставлены значения для «Времени засыпания» и «Времени завершения спящего сеанса», но пользователи всё равно продолжают висеть в базе часами, занимая дефицитные лицензии — для решения этой проблемы есть универсальная утилита мониторинга и администрирования сеансов.
Для начала проанализируем, что именно платформа 1С считает «спящим» сеансом. Это критически важный момент, так как путаница в терминах мешает правильно настроить систему. Спящий сеанс (Hibernation) — это состояние, когда связь между клиентским приложением и сервером физически разорвана (например, компьютер ушел в сон, пропал Wi-Fi или процесс 1cv8.exe был убит через диспетчер задач), но сервер 1С еще хранит данные этого сеанса в памяти.
Если же программа у пользователя открыта, компьютер включен и связь с сервером стабильна, сеанс считается активным, даже если человек не нажимал ни одной кнопки в течение всего рабочего дня. Штатные настройки «Завершение спящих сеансов» на таких пользователей не распространяются, так как их соединение не считается потерянным.
Выясним причины, по которым сеанс остается активным с точки зрения сервера, даже если пользователь отошел от компьютера:
Наиболее надежный метод для серверных баз — это создание собственного регламентного задания, которое будет анализировать время последней активности пользователей. Проанализируем пример кода, который можно запустить на стороне сервера для принудительного завершения сеансов — для быстрой настройки можно использовать обработку управления сеансами и соединениями в реальном времени:
Процедура ЗавершитьНеактивныеСеансы() Экспорт
// Получаем все сеансы текущей информационной базы
СеансыИБ = ПолучитьСеансыИнформационнойБазы();
ТекущееВремя = ТекущаяДата();
// Допустимое время бездействия в секундах (например, 2 часа = 7200 сек)
МаксВремяБездействия = 7200;
Для Каждого Сеанс Из СеансыИБ Цикл
// Исключаем фоновые задания и текущий сеанс администратора
Если Сеанс.ИмяПриложения = "1CV8" Или Сеанс.ИмяПриложения = "1CV8C" Тогда
ВремяПростоя = ТекущееВремя - Сеанс.ПоследняяАктивность;
Если ВремяПростоя > МаксВремяБездействия Тогда
Попытка
// Завершаем сеанс программно
ЗавершитьСеанс(Сеанс);
ЗаписьЖурналаРегистрации("Сеансы.Завершение", УровеньЖурналаРегистрации.Информация, , ,
"Сеанс пользователя " + Сеанс.Пользователь.Имя + " завершен по причине бездействия.");
Исключение
ЗаписьЖурналаРегистрации("Сеансы.Ошибка", УровеньЖурналаРегистрации.Ошибка, , ,
"Не удалось завершить сеанс пользователя " + Сеанс.Пользователь.Имя);
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Этот метод хорош тем, что он работает на стороне сервера и не зависит от того, что открыто у пользователя на экране. Однако будьте осторожны: жесткое завершение сеанса может привести к потере неSaved-данных (например, если пользователь начал заполнять длинный документ и ушел на совещание).
Разберем более мягкий вариант, который позволяет предупредить пользователя перед закрытием. В модуле управляемого (или обычного) приложения можно реализовать проверку активности через ПодключитьОбработчикОжидания.
Рассмотрим логику реализации:
// В модуле приложения
Процедура ПриНачалеРаботыСистемы()
// Проверка каждые 10 минут (600 секунд)
ПодключитьОбработчикОжидания("ПроверитьАктивностьПользователя", 600);
КонецПроцедуры
Процедура ПроверитьАктивностьПользователя() Экспорт
// Если пользователь не нажимал ничего, выводим вопрос с таймаутом
Таймаут = 60; // 1 минута на ответ
ТекстВопроса = "Вы еще здесь? Программа будет закрыта через минуту для освобождения лицензии.";
// Используем Вопрос с таймаутом
Ответ = Вопрос(ТекстВопроса, РежимДиалога.ДаНет, Таймаут, КодВозвратаДиалога.Нет, "Внимание!");
Если Ответ = КодВозвратаДиалога.Нет Или Ответ = КодВозвратаДиалога.Таймаут Тогда
ЗавершитьРаботуСистемы(Ложь); // Завершаем без подтверждения сохранения
КонецЕсли;
КонецПроцедуры
Важное ограничение: Если у пользователя открыто модальное окно (например, выбор файла или предупреждение системы), обработчик ожидания может не сработать. В режиме совместимости с 8.2 это является частой проблемой.
Если программные методы по каким-то причинам не подходят, проанализируем системные настройки:
KeepAliveTime и KeepAliveInterval. Это заставит ОС быстрее понимать, что клиент «отвалился» или не отвечает, и переводить сеанс в разряд спящих, которые уже будут завершаться штатными параметрами ИБ.Посмотрим на ситуацию со стороны управления. Прежде чем внедрять «киллера» сеансов, рекомендуется:
Таким образом, штатные параметры завершения спящих сеансов в 1С работают только в случае аварийного обрыва связи. Для борьбы с обычным бездействием необходимо использовать комбинацию регламентных заданий на сервере и обработчиков ожидания на клиенте, учитывая специфику вашей конфигурации и режима совместимости — с этой задачей справится обработка принудительного завершения неактивных сеансов.