Проблема «зависших» или «фантомных» сеансов в 1С:Предприятие — это классическая ситуация для клиент-серверной архитектуры, особенно когда пользователи работают через RDP (Remote Desktop Protocol). Суть проблемы заключается в том, что пользователь закрывает программу (или сеанс RDP прерывается), а на сервере приложений 1С сеанс продолжает числиться активным. Такие сеансы могут занимать лицензии, блокировать записи в базе данных и потреблять ресурсы сервера впустую.
Рассмотрим подробнее, почему это происходит и как настроить систему так, чтобы «мертвые» соединения обрывались автоматически. Проанализируем ситуацию на разных уровнях: от настроек самого кластера 1С до глубоких параметров операционной системы Windows.
Первым делом нам необходимо заглянуть в консоль Администрирования серверов 1С. Именно здесь задаются базовые правила «жизненного цикла» каждого сеанса. Выясним причину, по которой сервер считает сеанс активным, даже если клиентское приложение уже закрыто.
В свойствах рабочего сервера (или параметров информационной базы, в зависимости от версии платформы) нас интересуют два ключевых таймаута:
1200 (20 минут) или 1800 (30 минут).0, сеанс может висеть вечно. Оптимально установить от 600 до 1200 секунд.Разберем на примере: если мы установим оба параметра по 1200 секунд, то через 40 минут полной неактивности (или после некорректного закрытия приложения) сервер гарантированно очистит список активных пользователей.
Часто сервер приложений 1С продолжает «держать» соединение, потому что протокол TCP считает сокет открытым. Если клиент отключился некорректно (например, пропал интернет или завис процесс 1cv8.exe), сервер ждет подтверждения от клиента. По умолчанию в Windows время ожидания может составлять до 2 часов.
Чтобы ускорить этот процесс, нам нужно изменить параметры Keep-Alive в реестре Windows на сервере 1С. Разберем по шагам, какие ключи нужно создать или изменить в ветке HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:
KeepAliveTime — время, через которое ОС начнет проверять, живо ли соединение. Установите значение 300000 (в миллисекундах, что соответствует 5 минутам).KeepAliveInterval — интервал между повторными проверками, если ответ не получен. Установите 1000 (1 секунда).TcpMaxDataRetransmissions — количество попыток пересылки данных перед разрывом. Можно уменьшить до 5.Пример внесения изменений через реестр (командная строка от администратора):
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v KeepAliveTime /t REG_DWORD /d 300000 /f
reg add "HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" /v KeepAliveInterval /t REG_DWORD /d 1000 /f
После внесения этих изменений операционная система будет гораздо быстрее определять «мертвые» сетевые сеансы и сообщать об этом серверу 1С.
Поскольку в нашем случае используется RDP, велика вероятность, что сеансы висят из-за того, что пользователи просто закрывают окно терминала «крестиком». При этом сеанс внутри Windows переходит в статус Disconnected, но все процессы (включая 1С) продолжают выполняться.
Проанализируем настройки групповых политик (GPO) на терминальном сервере. Нам нужно настроить автоматическое завершение отключенных сеансов:
gpedit.msc).5 минут или 15 минут.Теперь, как только пользователь закроет окно RDP, через 5–15 минут операционная система принудительно завершит его сеанс, что приведет к корректному закрытию 1cv8.exe и освобождению лицензии 1С.
Как было отмечено в обсуждении, одной из частых причин «зависания» процесса 1С при закрытии является блокировка клиентского процесса внешними библиотеками. Чаще всего это:
1cv8.exe выгрузиться из памяти.Что мы можем сделать в этой ситуации?
Во-первых, проанализируем используемые драйверы. Рекомендуется переходить с устаревших COM-технологий на современные Native API драйверы, которые поставляются самой фирмой 1С или сертифицированными производителями. Они работают более стабильно и корректно освобождают ресурсы.
Во-вторых, если проблему вызывает dlm.exe или подобные службы лицензирования драйверов, имеет смысл вынести их работу в отдельные процессы или настроить их перезапуск по расписанию.
Если штатные средства не справляются, мы можем прибегнуть к автоматизации с помощью утилиты RAC (Remote Administration Console). Это консольная версия администрирования 1С, которая позволяет программно управлять сеансами.
Рассмотрим пример логики скрипта (PowerShell), который можно запускать по планировщику раз в час:
ras.LastActive (время последней активности).session terminate.Пример команды для завершения конкретного сеанса:
rac session --cluster={ID-кластера} terminate --session={ID-сеанса}
Использование таких скриптов — это «тяжелая артиллерия», которая помогает поддерживать порядок в высоконагруженных системах, где количество пользователей исчисляется сотнями.
Выясним еще одну неочевидную причину: иногда сеанс не закрывается, потому что сервер 1С считает, что в нем выполняется важная работа. Это происходит, если в сеансе пользователя было инициировано фоновое задание или запущена длительная процедура с использованием ПодключитьОбработчикОжидания.
Посмотрите в консоли администрирования 1С столбец «Фоновые задания». Если вы видите, что за «висящим» сеансом закреплено активное задание, значит, проблема в программном коде конфигурации. Необходимо оптимизировать длительные операции, чтобы они не блокировали завершение работы пользователя.
Подводя итог, скажем, что наиболее эффективным решением является комплексный подход: настройка таймаутов в консоли 1С, ограничение времени жизни сеансов в RDP и корректировка параметров Keep-Alive в реестре Windows. Это позволит системе автоматически очищать «мусорные» сеансы, сохраняя лицензии и производительность сервера.