При активной работе в терминальном режиме или при аварийном завершении работы пользователи нередко закрывают программу 1С некорректно. Использование команды taskkill /IM 1cv8* /T /F на терминальном сервере полностью уничтожает клиентские процессы, однако на стороне сервера приложений 1С сеансы этих пользователей продолжают «висеть». Такие «зомби-сессии» не только занимают ценные лицензии, но и продолжают удерживать транзакции, блокировки и расходовать ресурсы сервера (в частности, оперативную память в процессах rphost.exe).
В этой статье мы подробно разберем, как решить проблему зависших сессий на сервере 1С. Мы рассмотрим как классические административные скрипты, так и современные встроенные инструменты платформы 1С:Предприятие.
Когда клиентское приложение принудительно завершает работу, сервер 1С не сразу узнает об обрыве соединения. Кластер отправляет сетевые запросы (пинги) для проверки активности. Если ответа нет, сеанс сначала помечается как «пассивный», затем переходит в статус «спящего» и только спустя определенное время окончательно удаляется. Если пользователи заходят в систему повторно, у них создаются новые сеансы, а старые продолжают расходовать лицензии и ресурсы.
Проанализируем ситуацию и рассмотрим по шагам основные способы автоматизации очистки таких сессий.
Одним из самых надежных способов полной очистки сервера от зависших процессов и сессий во внерабочее время является перезапуск служб 1С. Простое принудительное убийство процессов через taskkill в момент работы службы может повредить кэш сервера или журналы регистрации. Поэтому мы применим комбинированный метод: сначала отправим службе команду на остановку, подождем завершения транзакций и только затем принудительно добьем оставшиеся процессы.
Разберем по шагам командный скрипт для регулярного обслуживания сервера:
sc stop "1C:Enterprise 8.3 Server Agent (x86-64)"
sc stop "1C:Enterprise 8.3 Remote Server"
timeout 15
taskkill /f /im "rphost.exe"
taskkill /f /im "rmngr.exe"
taskkill /f /im "ragent.exe"
taskkill /f /im "ras.exe"
timeout 10
sc start "1C:Enterprise 8.3 Server Agent (x86-64)"
sc start "1C:Enterprise 8.3 Remote Server"
Как работает этот сценарий:
sc stop мы инициируем корректную остановку службы агента сервера и службы удаленного управления RAS.timeout 15 мы даем системе 15 секунд на то, чтобы завершить активные транзакции и выгрузить процессы из памяти.rphost.exe) зависли и не смогли закрыться самостоятельно, команда taskkill /f /im принудительно завершает их.sc start. Сервер снова готов к работе, а все зависшие сеансы гарантированно уничтожены.Если перезапускать весь сервер приложений нельзя (например, в базе круглосуточно работают другие пользователи), можно точечно удалять сеансы конкретных пользователей с помощью штатной консольной утилиты RAC (Remote Administration Console). Этот метод пришел на смену устаревшему и нестабильному COM-соединению. Для упрощения этой задачи можно использовать альтернативную консоль администрирования серверов 1С на базе утилит RAS и RAC.
Для работы этого способа на сервере должна быть запущена служба RAS (Remote Administration Server). Ее можно запустить командой:
ras cluster --daemon --port=1545 localhost:1540
После этого мы можем написать скрипт (например, на PowerShell), который будет опрашивать список сессий и завершать те из них, которые принадлежат отключившимся пользователям терминала. Основная команда для удаления конкретного сеанса выглядит так:
rac session terminate --cluster=<Идентификатор_Кластера> --session=<Идентификатор_Сеанса>
Этот способ позволяет точечно автоматизировать удаление «зомби-сессий» по расписанию без прерывания работы остальных пользователей системы.
Рассмотрим пример кода, с помощью которого можно программно подключиться к кластеру серверов из самой платформы 1С и завершить сеансы определенного пользователя. Этот метод часто используется во внутренних «выгонялках»:
// Создаем подключение к агенту сервера
Connector = Новый COMОбъект("V83.COMConnector");
Агент = Connector.ConnectAgent("АдресСервера");
Кластеры = Агент.GetClusters();
// Выбираем первый кластер
Кластер = КластерыValue(0);
Агент.Authenticate(Кластер, "", "");
// Получаем список сессий информационной базы
Сеансы = Агент.GetInfoBaseSessions(Кластер, ИнформационнаяБаза);
Для каждого Сеанс из Сеансы Цикл
Если Сеанс.UserName = НужноеИмяПользователя Тогда
// Принудительно завершаем сеанс
Агент.TerminateSession(Кластер, Сеанс);
КонецЕсли;
КонецЦикла;
Обратите внимание: для работы этого кода на 64-битном сервере должна быть корректно зарегистрирована соответствующая DLL-библиотека COM-соединения (comcntr.dll).
Выясним причину, почему сервер сам не закрывает такие сеансы. По умолчанию в параметрах информационной базы установлены слишком большие интервалы времени. Мы можем сократить их в конфигураторе (меню Администрирование -> Параметры информационной базы):
Важное ограничение: Помните, что изменение параметров засыпания и завершения сеансов на значения, отличные от нуля, в базах с количеством пользователей более 10 человек требует наличия лицензий уровня КОРП. Если ваша организация использует лицензии уровня ПРОФ, изменение этих параметров заблокирует вход пользователей в базу. В таком случае используйте перезапуск служб или утилиту RAC.
Если вы используете современные релизы платформы 1С:Предприятие, проблема зависших сессий решается силами самой платформы:
Для эффективной борьбы с зависшими сессиями рекомендуется использовать комплексный подход. Настройте ночной мягкий перезапуск служб 1С с помощью BAT-скрипта для профилактики утечек памяти. По возможности обновите платформу до версии 8.3.24 или выше, чтобы дать пользователям возможность самостоятельно сбрасывать свои зависшие сеансы при повторном входе в систему. В качестве готовой альтернативы также можно использовать веб-приложение для управления сеансами сервера 1С, которое позволяет автоматизировать перезапуск служб и удаление зависших rphost-процессов.