Почему зависают или пропадают модальные окна 1С при работе в RemoteApp и как это исправить?

Системный администратор 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При организации удаленного доступа к 1С через службу RemoteApp (публикация приложений) администраторы и пользователи часто сталкиваются с неприятной ситуацией. Пользователь открывает какой-либо отчет, пытается зайти в настройки или открывает документ, и программа "зависает". На самом деле приложение работает, но модальное окно (диалог, вопрос или форма настроек) открылось на заднем плане (под основным окном) или вовсе не отрисовалось на экране клиента. При этом основное окно блокируется, ожидая реакции пользователя на невидимый диалог.

Эта проблема связана с особенностями работы технологии RAIL (RemoteApp Integrated Locally) и нарушениями Z-порядка окон (Z-order). Давайте подробно разберем, как диагностировать эту проблему и какие существуют способы ее решения, от административных настроек сервера до конфигурации самой платформы 1С. Для оперативной диагностики сеанса пользователя пригодится утилита для теневого подключения к RDP-сессии.

Суть проблемы и симптомы

Прежде чем переходить к лечению, давайте убедимся, что мы имеем дело именно с этой проблемой. Симптоматика обычно выглядит следующим образом:

  1. Пользователь работает в терминальной сессии, но не через полноценный рабочий стол, а через опубликованное приложение (RemoteApp).
  2. При нажатии кнопки, которая должна открыть всплывающее окно (например, "Настройка" в отчетах, подбор номенклатуры или системные вопросы "Провести документ?"), интерфейс 1С перестает реагировать на нажатия мыши.
  3. Визуально окно диалога отсутствует.
  4. Если нажать Alt + Tab или Alt + Esc, "потерянное" окно может внезапно появиться.
  5. Иногда помогает клик правой кнопкой мыши в предполагаемую область заголовка невидимого окна, после чего появляется контекстное меню и форма "оживает".

Рассмотрим комплекс решений, начиная от настроек операционной системы и заканчивая адаптацией платформы 1С.

Решение 1. Настройка групповых политик (RemoteFX)

Одним из самых действенных методов, подтвержденных практикой на серверах Windows Server 2008 R2, 2012 R2 и даже 2019/2022, является отключение расширенных графических возможностей для сеансов удаленных рабочих столов. Технология RemoteFX пытается оптимизировать передачу графики, но именно она часто становится виновником неправильного наложения окон.

Давайте выполним настройку локальной групповой политики на терминальном сервере:

  1. Откроем редактор локальной групповой политики. Для этого нажмем Win + R и введем команду gpedit.msc.
  2. Перейдем по следующему пути в дереве конфигурации:
    Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Среда удаленных сеансов.
    (В английской версии: Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Remote Session Environment).
  3. Найдем параметр "Использовать дополнительную графику RemoteFX для удаленного приложения RemoteApp" (Use advanced RemoteFX graphics for RemoteApp).
  4. Дважды кликнем по параметру и переведем его в состояние Отключено (Disabled).
  5. После изменения политики необходимо обновить конфигурацию командой gpupdate /force в командной строке или перезагрузить сервер.

Отключение этого параметра заставляет систему использовать более простой механизм отрисовки, что исключает конфликты прозрачности и анимации, возвращая окнам правильный порядок (Z-order).

Решение 2. Установка специальных обновлений Windows (для Server 2008 R2)

Если вы используете Windows Server 2008 R2, убедитесь, что у вас установлены специфические исправления от Microsoft, выпущенные именно для устранения проблем с порядком окон в RemoteApp. Стандартного SP1 может быть недостаточно.

Проверим наличие следующих обновлений (KB):

Также важно поддерживать актуальную версию RDP-клиента на рабочих станциях пользователей. Убедитесь, что на клиентских машинах (особенно если это Windows 7) установлены последние обновления для компонента "Подключение к удаленному рабочему столу".

Решение 3. Тюнинг реестра на клиентских машинах

Иногда проблема кроется не на сервере, а в том, как операционная система клиента обрабатывает запросы приложений на получение фокуса. В Windows существует механизм, предотвращающий "кражу" фокуса окнами, появляющимися на переднем плане. В случае с RemoteApp это может сыграть злую шутку.

Попробуем изменить параметр ForegroundLockTimeout на клиентских ПК:

  1. Запустим редактор реестра regedit.
  2. Перейдем в ветку: HKEY_CURRENT_USER\Control Panel\Desktop.
  3. Найдем параметр ForegroundLockTimeout.
  4. По умолчанию его значение часто равно 200000 (в шестнадцатеричной системе 30d40). Изменим его значение на 0.

Это разрешит приложениям немедленно перехватывать фокус и выводить свои окна на передний план. После внесения изменений необходим перезапуск сеанса пользователя или перезагрузка компьютера.

Решение 4. Настройка свойств исполняемого файла 1С

Еще один способ, который помогает в ситуациях, когда визуальные темы оформления Windows (Aero и прочие) конфликтуют с отрисовкой границ окон 1С в терминальном режиме.

Давайте настроим совместимость на сервере:

  1. Найдем исполняемый файл платформы 1cv8.exe (или 1cv8c.exe для тонкого клиента) в папке bin установленной платформы.
  2. Кликнем правой кнопкой мыши и выберем "Свойства".
  3. Перейдем на вкладку "Совместимость".
  4. Установим галочку "Отключить визуальное оформление" (Disable visual themes).
  5. Применим изменения для всех пользователей.

Решение 5. Отказ от модальности в конфигурации 1С (Для программистов)

Если вы являетесь разработчиком или имеете возможность менять конфигурацию, кардинальным решением проблемы будет отказ от использования системных модальных окон. В современных версиях платформы 1С (8.3 и выше) реализована концепция блокирующих окон, которые рисуются внутри интерфейса 1С, а не средствами операционной системы.

Рассмотрим, как переключить этот режим:

  1. Откроем конфигуратор.
  2. Кликнем правой кнопкой мыши по корню конфигурации и выберем "Свойства".
  3. Найдем свойство "Режим использования модальности".
  4. Установим значение "Не использовать".

Важно: Это действие потребует рефакторинга кода. Все синхронные вызовы модальных окон (такие как Вопрос, Предупреждение, ОткрытьФормуМодально) перестанут работать или будут вызывать ошибки. Их необходимо заменить на асинхронные аналоги с описанием оповещения. Для практического освоения асинхронного подхода пригодится пример чтения файла с применением асинхронных методов.

Пример изменения кода. Старый вариант (вызывающий проблемы в RemoteApp):


Ответ = Вопрос("Вы уверены?", РежимДиалогаВопрос.ДаНет);
Если Ответ = КодВозвратаДиалога.Да Тогда
    // Действия
КонецЕсли;

Новый вариант (безопасный для RemoteApp):


Оповещение = Новый ОписаниеОповещения("ПослеОтветаНаВопрос", ЭтотОбъект);
ПоказатьВопрос(Оповещение, "Вы уверены?", РежимДиалогаВопрос.ДаНет);

// Отдельная процедура для обработки ответа
&НаКлиенте
Процедура ПослеОтветаНаВопрос(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = КодВозвратаДиалога.Да Тогда
        // Действия
    КонецЕсли;
КонецПроцедуры

Использование метода ПоказатьВопрос (и аналогичных Показать...) создает окно средствами интерфейса 1С, которое гарантированно отображается поверх родительского окна и не зависит от причуд RDP-протокола.

Временные меры для пользователей

Пока администратор устраняет проблему глобально, давайте обучим пользователей "первой помощи", чтобы они могли продолжить работу без принудительного закрытия программы через Диспетчер задач.

Если окно зависло, предложите пользователям следующие комбинации:

Дополнительно: Протокол UDP

В новых версиях RDP (начиная с Windows 8/Server 2012) протокол по умолчанию использует UDP для передачи данных, что хорошо для видео, но иногда вызывает артефакты в статических интерфейсах бизнес-приложений. Попробуйте принудительно отключить UDP в групповых политиках:

Путь: Конфигурация компьютера -> Административные шаблоны -> Компоненты Windows -> Службы удаленных рабочих столов -> Клиент подключения к удаленному рабочему столу.
Параметр: "Отключение UDP на клиенте" (Turn off UDP On Client) -> Включено.

Применяя эти методы комплексно, вы сможете стабилизировать работу пользователей в режиме RemoteApp и избавиться от "невидимых" блокирующих окон.

← На главную