При использовании 1С в режиме RemoteApp системные администраторы часто сталкиваются с ситуацией, когда пользователь закрывает программу, но значок «Подключения к удаленным рабочим столам и приложениям RemoteApp» продолжает висеть в трее, а сеанс на сервере остается в статусе «Активен» или «Отключен». Это приводит к избыточному потреблению лицензий RDP и ресурсов сервера (подобные сложности возникают, когда настроено удаленное подключение к другим компьютерам без контроля сессий). Разберем по шагам, почему это происходит и как настроить систему так, чтобы при закрытии 1С соединение разрывалось автоматически.
Для начала проанализируем содержимое ярлыка, через который запускается 1С. Часто причина кроется в настройках автоматического переподключения. Если в параметрах файла указано autoreconnection enabled:i:1, клиентская часть будет пытаться поддерживать сессию даже после того, как основное приложение было закрыто, если сервер не подал явную команду на завершение. Рассмотрим ключевые строки в конфигурации:
redirectclipboard:i:1
remoteapplicationmode:i:1
full address:s:1C-TEST-SERV
alternate shell:s:||1cv8c
autoreconnection enabled:i:0
Обратим внимание на параметр autoreconnection enabled. Рекомендуется установить его в значение 0, чтобы предотвратить фоновые попытки клиента восстановить «уснувшую» сессию. Однако, как показывает практика, редактирования только RDP-файла часто недостаточно, так как проблема обычно лежит на стороне серверной части терминального сервера.
Выясним причину, почему Windows считает сеанс активным. Операционная система завершает сеанс RemoteApp только тогда, когда закрыты все процессы, запущенные в рамках этой сессии. Часто 1С оставляет после себя дочерние процессы или взаимодействует с системными службами, которые «держат» сессию. Проанализируем ситуацию: если в диспетчере задач 1cv8c.exe исчезает, но сессия висит, значит, ее удерживает другой исполняемый файл.
Для решения этой задачи в Windows предусмотрен механизм Sysprocs. Мы можем указать системе, какие процессы не должны считаться критичными для поддержания работы сеанса. Выполним следующие действия в реестре сервера:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Sysprocs.1cv8c.exe или 1cv8.exe.0.Это просигнализирует службе терминалов, что при закрытии основного окна приложения данные процессы можно игнорировать и завершать сеанс принудительно.
Рассмотрим еще одну специфическую причину зависания сессий, характерную именно для 1С. Если пользователь в процессе работы что-то распечатывал, в сеансе запускается процесс splwow64.exe (Print Driver Host). На 64-битных системах Windows Server этот процесс по умолчанию остается активным в течение 2 минут после последней операции печати, чтобы ускорить последующие задания. Пока он активен, RemoteApp не закроется.
Чтобы изменить это поведение, настроим таймаут завершения процесса печати:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server.Splwow64TimeOut.1 (означает 1 секунду ожидания).Теперь подсистема печати будет закрываться практически мгновенно после выхода из 1С, позволяя сеансу корректно завершиться.
Проанализируем ситуацию, когда сессия переходит в состояние «Disconnected», но не закрывается. Это может происходить из-за настроек по умолчанию в Windows Server 2019. Нам необходимо принудительно ограничить время жизни таких сессий. Разберем по шагам настройку через GPO:
gpedit.msc на сервере.Важный момент: если вы используете RemoteApp, также крайне полезно настроить параметр «Установить предел времени для выхода из сеанса RemoteApp». Если установить его в положение «Немедленно», сервер будет терминировать сессию сразу после закрытия последнего окна опубликованного приложения.
Если вышеуказанные методы не помогают из-за особенностей конфигурации 1С, рассмотрим вариант запуска приложения через командный файл. Вместо публикации напрямую 1cv8c.exe, создадим и опубликуем .bat или .cmd файл. Посмотрим на пример кода:
@echo off
start /wait "1C" "C:\Program Files\1cv8\common\1cestart.exe"
logoff
В данном сценарии команда start /wait заставляет командный интерпретатор ждать, пока процесс 1С не будет завершен пользователем. Как только 1С закрывается, выполняется следующая строка — logoff, которая инициирует немедленный выход пользователя из системы и закрытие всех фоновых соединений. При публикации такого скрипта в качестве RemoteApp не забудьте указать правильную рабочую директорию и иконку, чтобы для пользователя запуск выглядел привычно.
Иногда система слишком долго ждет отклика от зависших фоновых окон или подтверждения закрытия от приложений. Мы можем ускорить этот процесс, изменив пользовательские настройки таймаутов в реестре. Это особенно актуально, если 1С при закрытии пытается выполнить длительные регламентные операции (например, выгрузку данных в облако или очистку кэша).
Посмотрим на параметры в ветке HKEY_CURRENT_USER\Control Panel\Desktop:
WaitToKillAppTimeout — установим значение 2000 (2 секунды). Это время, которое система ждет перед принудительным закрытием приложения.AutoEndTasks — установим значение 1. Это позволит системе автоматически завершать задачи, которые не отвечают на запрос о закрытии, не дожидаясь реакции пользователя.Комплексное применение этих настроек (реестр, групповые политики и оптимизация RDP-файла) позволяют добиться стабильной работы RemoteApp и гарантированного освобождения лицензий сразу после выхода пользователя из 1С. Для быстрого поиска готовых инструкций по настройке серверов и окружения можно использовать справочник по типовым задачам системного администрирования Windows, Linux и 1С.