При организации удаленного доступа к 1С через службу RemoteApp (публикация приложений) администраторы и пользователи часто сталкиваются с неприятной ситуацией. Пользователь открывает какой-либо отчет, пытается зайти в настройки или открывает документ, и программа "зависает". На самом деле приложение работает, но модальное окно (диалог, вопрос или форма настроек) открылось на заднем плане (под основным окном) или вовсе не отрисовалось на экране клиента. При этом основное окно блокируется, ожидая реакции пользователя на невидимый диалог.
Эта проблема связана с особенностями работы технологии RAIL (RemoteApp Integrated Locally) и нарушениями Z-порядка окон (Z-order). Давайте подробно разберем, как диагностировать эту проблему и какие существуют способы ее решения, от административных настроек сервера до конфигурации самой платформы 1С. Для оперативной диагностики сеанса пользователя пригодится утилита для теневого подключения к RDP-сессии.
Прежде чем переходить к лечению, давайте убедимся, что мы имеем дело именно с этой проблемой. Симптоматика обычно выглядит следующим образом:
Alt + Tab или Alt + Esc, "потерянное" окно может внезапно появиться.Рассмотрим комплекс решений, начиная от настроек операционной системы и заканчивая адаптацией платформы 1С.
Одним из самых действенных методов, подтвержденных практикой на серверах Windows Server 2008 R2, 2012 R2 и даже 2019/2022, является отключение расширенных графических возможностей для сеансов удаленных рабочих столов. Технология RemoteFX пытается оптимизировать передачу графики, но именно она часто становится виновником неправильного наложения окон.
Давайте выполним настройку локальной групповой политики на терминальном сервере:
Win + R и введем команду gpedit.msc.gpupdate /force в командной строке или перезагрузить сервер.Отключение этого параметра заставляет систему использовать более простой механизм отрисовки, что исключает конфликты прозрачности и анимации, возвращая окнам правильный порядок (Z-order).
Если вы используете Windows Server 2008 R2, убедитесь, что у вас установлены специфические исправления от Microsoft, выпущенные именно для устранения проблем с порядком окон в RemoteApp. Стандартного SP1 может быть недостаточно.
Проверим наличие следующих обновлений (KB):
Также важно поддерживать актуальную версию RDP-клиента на рабочих станциях пользователей. Убедитесь, что на клиентских машинах (особенно если это Windows 7) установлены последние обновления для компонента "Подключение к удаленному рабочему столу".
Иногда проблема кроется не на сервере, а в том, как операционная система клиента обрабатывает запросы приложений на получение фокуса. В Windows существует механизм, предотвращающий "кражу" фокуса окнами, появляющимися на переднем плане. В случае с RemoteApp это может сыграть злую шутку.
Попробуем изменить параметр ForegroundLockTimeout на клиентских ПК:
regedit.HKEY_CURRENT_USER\Control Panel\Desktop.ForegroundLockTimeout.200000 (в шестнадцатеричной системе 30d40). Изменим его значение на 0.Это разрешит приложениям немедленно перехватывать фокус и выводить свои окна на передний план. После внесения изменений необходим перезапуск сеанса пользователя или перезагрузка компьютера.
Еще один способ, который помогает в ситуациях, когда визуальные темы оформления Windows (Aero и прочие) конфликтуют с отрисовкой границ окон 1С в терминальном режиме.
Давайте настроим совместимость на сервере:
1cv8.exe (или 1cv8c.exe для тонкого клиента) в папке bin установленной платформы.Если вы являетесь разработчиком или имеете возможность менять конфигурацию, кардинальным решением проблемы будет отказ от использования системных модальных окон. В современных версиях платформы 1С (8.3 и выше) реализована концепция блокирующих окон, которые рисуются внутри интерфейса 1С, а не средствами операционной системы.
Рассмотрим, как переключить этот режим:
Важно: Это действие потребует рефакторинга кода. Все синхронные вызовы модальных окон (такие как Вопрос, Предупреждение, ОткрытьФормуМодально) перестанут работать или будут вызывать ошибки. Их необходимо заменить на асинхронные аналоги с описанием оповещения. Для практического освоения асинхронного подхода пригодится пример чтения файла с применением асинхронных методов.
Пример изменения кода. Старый вариант (вызывающий проблемы в RemoteApp):
Ответ = Вопрос("Вы уверены?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
// Действия
КонецЕсли;
Новый вариант (безопасный для RemoteApp):
Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Вы уверены?", РежимДиалогаВопрос.ДаНет);
// Отдельная процедура для обработки ответа
&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
// Действия
КонецЕсли;
КонецПроцедуры
Использование метода ПоказатьВопрос (и аналогичных Показать...) создает окно средствами интерфейса 1С, которое гарантированно отображается поверх родительского окна и не зависит от причуд RDP-протокола.
Пока администратор устраняет проблему глобально, давайте обучим пользователей "первой помощи", чтобы они могли продолжить работу без принудительного закрытия программы через Диспетчер задач.
Если окно зависло, предложите пользователям следующие комбинации:
В новых версиях RDP (начиная с Windows 8/Server 2012) протокол по умолчанию использует UDP для передачи данных, что хорошо для видео, но иногда вызывает артефакты в статических интерфейсах бизнес-приложений. Попробуйте принудительно отключить UDP в групповых политиках:
Путь: Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Клиент подключения к удаленному рабочему столу.
Параметр: "Отключение UDP на клиенте" (Turn off UDP On Client) -> Включено.
Применяя эти методы комплексно, вы сможете стабилизировать работу пользователей в режиме RemoteApp и избавиться от "невидимых" блокирующих окон.