Почему не работают параметры завершения спящих сеансов в 1С и как принудительно закрыть программу у неактивных пользователей?

Программист 1С v8.3 (Обычные формы) Управленческий учет
← На главную

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

Различие между спящим сеансом и бездействием пользователя

Для начала проанализируем, что именно платформа 1С считает «спящим» сеансом. Это критически важный момент, так как путаница в терминах мешает правильно настроить систему. Спящий сеанс (Hibernation) — это состояние, когда связь между клиентским приложением и сервером физически разорвана (например, компьютер ушел в сон, пропал Wi-Fi или процесс 1cv8.exe был убит через диспетчер задач), но сервер 1С еще хранит данные этого сеанса в памяти.

Если же программа у пользователя открыта, компьютер включен и связь с сервером стабильна, сеанс считается активным, даже если человек не нажимал ни одной кнопки в течение всего рабочего дня. Штатные настройки «Завершение спящих сеансов» на таких пользователей не распространяются, так как их соединение не считается потерянным.

Почему сеансы не «засыпают» автоматически?

Выясним причины, по которым сеанс остается активным с точки зрения сервера, даже если пользователь отошел от компьютера:

  1. Работа механизмов БСП: Современные конфигурации (даже обновленные версии УПП 1.3) используют Библиотеку стандартных подсистем. В ней заложены фоновые процессы, которые периодически «дёргают» сервер. Например, проверка почты, обновление панели «Текущие дела» или оповещения о задачах. Каждый такой запрос обнуляет счетчик бездействия.
  2. Автообновление динамических списков: Если у пользователя открыт список заказов или реализаций, система может автоматически обновлять данные в нем. Платформа расценивает это как активность сеанса.
  3. Режим совместимости: В конфигурациях с установленным режимом совместимости (например, 8.2.13) механизмы управления сеансами работают по старым алгоритмам, которые менее эффективно определяют пассивность клиента.
  4. Сетевые пакеты (Keep-Alive): Операционная система и сетевое оборудование могут поддерживать TCP-соединение активным, посылая пустые пакеты. Сервер 1С видит это как активность сетевого уровня.

Способ 1: Создание регламентного задания-киллера

Наиболее надежный метод для серверных баз — это создание собственного регламентного задания, которое будет анализировать время последней активности пользователей. Проанализируем пример кода, который можно запустить на стороне сервера для принудительного завершения сеансов — для быстрой настройки можно использовать обработку управления сеансами и соединениями в реальном времени:


Процедура ЗавершитьНеактивныеСеансы() Экспорт
    // Получаем все сеансы текущей информационной базы
    СеансыИБ = ПолучитьСеансыИнформационнойБазы();
    ТекущееВремя = ТекущаяДата();
    
    // Допустимое время бездействия в секундах (например, 2 часа = 7200 сек)
    МаксВремяБездействия = 7200;

    Для Каждого Сеанс Из СеансыИБ Цикл
        // Исключаем фоновые задания и текущий сеанс администратора
        Если Сеанс.ИмяПриложения = "1CV8" Или Сеанс.ИмяПриложения = "1CV8C" Тогда
            ВремяПростоя = ТекущееВремя - Сеанс.ПоследняяАктивность;
            
            Если ВремяПростоя > МаксВремяБездействия Тогда
                Попытка
                    // Завершаем сеанс программно
                    ЗавершитьСеанс(Сеанс);
                    ЗаписьЖурналаРегистрации("Сеансы.Завершение", УровеньЖурналаРегистрации.Информация, , , 
                        "Сеанс пользователя " + Сеанс.Пользователь.Имя + " завершен по причине бездействия.");
                Исключение
                    ЗаписьЖурналаРегистрации("Сеансы.Ошибка", УровеньЖурналаРегистрации.Ошибка, , , 
                        "Не удалось завершить сеанс пользователя " + Сеанс.Пользователь.Имя);
                КонецПопытки;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Этот метод хорош тем, что он работает на стороне сервера и не зависит от того, что открыто у пользователя на экране. Однако будьте осторожны: жесткое завершение сеанса может привести к потере неSaved-данных (например, если пользователь начал заполнять длинный документ и ушел на совещание).

Способ 2: Использование обработчика ожидания на клиенте

Разберем более мягкий вариант, который позволяет предупредить пользователя перед закрытием. В модуле управляемого (или обычного) приложения можно реализовать проверку активности через ПодключитьОбработчикОжидания.

Рассмотрим логику реализации:

  1. При начале работы системы подключаем периодическую проверку.
  2. Раз в 15-30 минут проверяем время последнего действия.
  3. Если активность отсутствует долгое время, выводим окно с предупреждением и таймаутом.

// В модуле приложения
Процедура ПриНачалеРаботыСистемы()
    // Проверка каждые 10 минут (600 секунд)
    ПодключитьОбработчикОжидания("ПроверитьАктивностьПользователя", 600);
КонецПроцедуры

Процедура ПроверитьАктивностьПользователя() Экспорт
    // Если пользователь не нажимал ничего, выводим вопрос с таймаутом
    Таймаут = 60; // 1 минута на ответ
    ТекстВопроса = "Вы еще здесь? Программа будет закрыта через минуту для освобождения лицензии.";
    
    // Используем Вопрос с таймаутом
    Ответ = Вопрос(ТекстВопроса, РежимДиалога.ДаНет, Таймаут, КодВозвратаДиалога.Нет, "Внимание!");
    
    Если Ответ = КодВозвратаДиалога.Нет Или Ответ = КодВозвратаДиалога.Таймаут Тогда
        ЗавершитьРаботуСистемы(Ложь); // Завершаем без подтверждения сохранения
    КонецЕсли;
КонецПроцедуры

Важное ограничение: Если у пользователя открыто модальное окно (например, выбор файла или предупреждение системы), обработчик ожидания может не сработать. В режиме совместимости с 8.2 это является частой проблемой.

Способ 3: Административные и технические настройки сервера

Если программные методы по каким-то причинам не подходят, проанализируем системные настройки:

Рекомендации по внедрению

Посмотрим на ситуацию со стороны управления. Прежде чем внедрять «киллера» сеансов, рекомендуется:

  1. Выделить группу исключений: Создайте роль или параметр пользователя (например, «РазрешитьБездействие»), чтобы руководители или бухгалтеры, формирующие тяжелые отчеты часами, не выбрасывались из системы.
  2. Настроить логирование: Обязательно записывайте в журнал регистрации факты принудительного завершения. Это поможет обосновать покупку новых лицензий, если выяснится, что выкидывать приходится реально работающих людей.
  3. Обучение: Проведите инструктаж сотрудников о необходимости закрывать лишние базы. Часто пользователи открывают по 3-5 экземпляров одной и той же базы, забывая о них.

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

← На главную