В процессе администрирования систем на базе «1С:Предприятие 8.3» часто возникает вопрос эффективного использования лицензий и ресурсов сервера. Одной из самых запутанных тем является классификация состояний сеансов. Администраторы часто сталкиваются с ситуацией, когда пользователь уже давно не работает в программе, но его сеанс продолжает висеть в списке активных. В этой статье мы подробно разберем, что такое спящий сеанс, чем он отличается от пассивного, и какими способами можно автоматизировать процесс завершения работы неактивных пользователей.
Для начала проанализируем внутреннюю логику платформы. Чтобы эффективно управлять подключениями, нам нужно четко разделять три состояния, в которых может находиться сеанс пользователя:
1cv8.exe через диспетчер задач, «падение» операционной системы, сбой сетевого оборудования или закрытие крышки ноутбука с последующим переходом в спящий режим.Рассмотрим подробнее механизм «засыпания». Когда связь обрывается, сервер не убивает сеанс мгновенно. Он «замораживает» его, сохраняя состояние объектных данных (например, содержимое еще не записанного документа в памяти сервера). Это делается для того, чтобы при восстановлении связи пользователь мог продолжить работу ровно с того места, где остановился, без потери введенных данных. Это поведение регулируется механизмом Reconnect.
Для управления жизненным циклом сеансов мы должны обратиться к консоли администрирования кластера серверов 1С. Разберем основные параметры, которые влияют на поведение системы:
Если в вашей организации наблюдается дефицит лицензий или спящие сеансы блокируют регламентные операции (например, мешают обновлению конфигурации в монопольном режиме), мы рекомендуем сократить «Время завершения спящего сеанса» до приемлемых значений, например, до 1200–1800 секунд (20–30 минут). Если установить значение 0, сеанс будет удаляться сервером немедленно при обнаружении обрыва связи.
В обсуждениях часто звучит вопрос: «Как выкинуть бухгалтера, который открыл отчет и просто смотрит в него 3 часа?». С точки зрения сервера такой сеанс может быть пассивным, но он все равно удерживает лицензию, если не настроено иное. Рассмотрим три метода решения этой задачи.
Это самый цивилизованный и рекомендуемый метод для современных конфигураций (УТ 11, БП 3.0, ERP 2). В составе БСП есть подсистема «Завершение работы пользователей». Проанализируем ее преимущества:
Если ваша конфигурация не использует БСП или вам нужно специфическое решение, мы можем реализовать собственный механизм. Рассмотрим пример использования метода ПодключитьОбработчикОжидания.
В модуле управляемого приложения пропишем инициализацию:
Процедура ПриНачалеРаботыСистемы()
// Проверяем активность каждые 5 минут (300 секунд)
ПодключитьОбработчикОжидания("ПроверитьАктивностьПользователя", 300);
КонецПроцедуры
В этом же модуле опишем саму процедуру проверки. Нам потребуется переменная, в которой будет храниться время последнего взаимодействия. Однако проще всего использовать глобальный контекст для отслеживания времени бездействия системы:
Процедура ПроверитьАктивностьПользователя() Экспорт
МаксимальноеВремяПростоя = 3600; // 1 час в секундах
ТекущийПростой = ПолучитьВремяБездействияСистемы();
Если ТекущийПростой > МаксимальноеВремяПростоя Тогда
ЗавершитьРаботуСистемы(Ложь, Ложь); // Завершаем без подтверждения
КонецЕсли;
КонецПроцедуры
Важно помнить, что функция ПолучитьВремяБездействияСистемы() доступна в некоторых расширениях или может быть реализована через вызов Windows API, так как штатные средства 1С фиксируют только обращения к серверу.
Рассмотрим ситуацию, когда нам нужно принудительно завершать сеансы со стороны сервера. Мы можем написать регламентное задание, которое анализирует ЖурналРегистрации. Выясним причину, по которой этот метод считается спорным: чтение журнала регистрации — ресурсоемкая операция.
Тем не менее, алгоритм может быть следующим:
МенеджерКластера или СеансыИнформационнойБазы.Пример получения списка сеансов:
СписокСеансов = МенеджерИнформационнойБазы.ПолучитьСеансы();
Для Каждого ТекущийСеанс Из СписокСеансов Цикл
// Анализ времени последнего обращения
Если ТекущийСеанс.ПоследняяАктивность < (ТекущаяДата() - 10800) Тогда
// Код для завершения сеанса через COM-соединение или внешнее управление
КонецЕсли;
КонецЦикла;
Проанализируем еще один важный аспект. Спящие сеансы — это не просто строчки в консоли. Пока сеанс «спит», он может удерживать:
Поэтому в высоконагруженных системах мы рекомендуем устанавливать жесткие лимиты на время жизни спящих сеансов. Оптимально — от 15 до 40 минут. Этого времени достаточно, чтобы пользователь мог перезагрузить компьютер или переподключиться к Wi-Fi, не потеряв контекст работы, но при этом система не будет «мусорить» старыми соединениями.
Выясним итоговую рекомендацию: для борьбы с «забытыми» сеансами используйте настройки кластера (параметр «Время завершения спящего сеанса») в сочетании с механизмами БСП на стороне клиента. Это обеспечит баланс между удобством пользователей и стабильностью работы сервера 1С.