ИР Адаптер. Модальное окно об ошибке при запуске клиентского приложения отображается позади окна конфигуратора

bolsun Закрыто Высокий

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

Я полагаю, что это происходит из-за отсутствия в скрипте вызова НачатьВызовВнешнегоОкнаАсинх() с включенным флагом управления модальными окнами.

Комментарии

tormozit
#1, ред. 23 мая 2024 19:33

До подключения этого приложения я не знаю какой у него будет идентификатор процесса и заголовок окна. Поэтому непонятно какие параметры передавать в НачатьВызовВнешнегоОкнаАсинх. А эта ошибка возникает в процессе подключения.
tormozit изменил статус на Открыто


bolsun
#2, 23 мая 2024 19:38

(1) tormozit, видимо нужен метод в АПИ, который будет отслеживать любое новое модальное окно и активировать его.


tormozit
#3, ред. 23 мая 2024 19:43

(2) bolsun, так можно чужое окно поймать вместо своего. Фильтр по строке запуска процесса окна поможет снизить эту вероятность.


bolsun
#4, ред. 23 мая 2024 19:43

(3) tormozit, я их определяю по классу и вероятность, что в момент запуска клиентского приложения появится такое новое модальное окно в другом конфигураторе или клиентском приложении очень низкая.


bolsun
#5, 23 мая 2024 19:44

Текущие модальные окна, конечно не будут учитываться


tormozit
#6, ред. 23 мая 2024 19:45

(4) bolsun, ERP может запускаться до 60 секунд. За это время пользователь легко успеет пооткрывать модальные окна в других приложениях 1С.


tormozit
#7, ред. 23 мая 2024 19:49

Вот пример строки запуска COM приложения 1С.
"C:\Program Files (x86)\1cv8\8.3.25.1257\bin\1cv8.exe" -Embedding
Она всегда имеет фрагмент "-Embedding"


bolsun
#8, ред. 23 мая 2024 20:21

Остается вопрос как долго мне ожидать этих модальных окон, если клиентское приложение может запускаться неизвестное время. Или ты будешь сам завершать его?


tormozit
#9, ред. 23 мая 2024 20:23

(8) bolsun, ну мне управление точно не вернется пока висит это окно, что конечно можно отнести к недоработке платформы 1С. Поэтому скриптом не смогу делать какие либо проверки на появление окна.


bolsun
#10, ред. 23 мая 2024 20:26

У нас же есть чудесный готовый метод, можно пока его использовать. Пусть без ПИДа но лучше чем блочить интерфейс.

/// <summary>
/// Ожидает открытия окна заданного класса. При появлении отключает блокировку ввода, скрывает оверлей и
/// переносит окно поверх всех окон.
/// </summary>
/// <param name="timeout">Время ожидания в миллисекундах. Число</param>/// 
/// <param name="className">Имя класса окна. Строка</param>/// 
/// <param name="pid">ИД процесса. Необязательный. Число.</param>
/// <param name="excludeCurrentWindows">Исключить все текущие окна данного класса. По умолчанию Истина. Булево.</param>
/// <param name="taskKey">Идентификатор фоновой задачи, для досрочного завершения задачи. Необязательный. Строка.</param>

[ContextMethod("НачатьУправлениеМодальнымиОкнами", "StartModalWindowsHandling")]


bolsun
#11, 23 мая 2024 20:29

/// <summary>
/// Завершает ожидание окна заданного класса.
/// </summary>
// <param name="taskKey">Идентификатор фоновой задачи. Строка.</param>
[ContextMethod("ЗавершитьУправлениеМодальнымиОкнами", "StopModalWindowsHandling")]


bolsun
#12, ред. 23 мая 2024 20:31

Ну раз в миллион лет активируется новое модальное окно другого клиента (вероятность, что это произойдет очень мала).


bolsun
#13, 23 мая 2024 20:34

Он вроде для этого случая и был сделан.


tormozit
#14, 23 мая 2024 21:45

Не наблюдаю эффекта от применения метода НачатьУправлениеМодальнымиОкнами

      ТурбоКонф.НачатьУправлениеМодальнымиОкнами(60, "V8NewLocalFrameBaseWnd",,, ИДЗадачи);
			УспехПодключения = ПодключениеИР.Connect(СтрокаСоединения);
			ТурбоКонф.ЗавершитьУправлениеМодальнымиОкнами(ИДЗадачи);

RDT.os


bolsun
#15, 23 мая 2024 23:02

(14) tormozit, логично. Ты поставил время ожидания 60мс.


tormozit
#16, ред. 23 мая 2024 23:14

Поставил 60000 мс. Экран замерз и примерно 5 минут я пытался его разблокировать. Другие приложения было невозможно активировать. Хорошо что диспетчер задач открывался (у него я заранее включил "Всегда поверх всех окон"). После ручного убийства процесса 1С, который показывал модальное окно, стал циклически появляться вопрос про подключение ИР адаптера. Я отвечал "Нет" и возникала ошибка, после которой вопрос снова появлялся бесконечно. Пришлось убить Турбоконфа.

Помню что в первый раз этот метод тоже не работал как надо.

C4dKLKwnqa.mp4

Ссылка скрыта


bolsun
#17, 23 мая 2024 23:16

(16) tormozit, возможно. Метод так и не был толком протестирован, посмотрю.


bolsun
#18, 24 мая 2024 12:44

(16) tormozit, исправил активацию модального окна
6.2.8910.26450
https://disk.yandex.ru/d/XKCz9ijzgtoO1w


bolsun
#19, 24 мая 2024 16:42

Жду подтверждения работоспособности метода, для отправки исправлений в релиз.


tormozit
#20, 24 мая 2024 19:07

Улучшений не заметил

				ТурбоКонф.НачатьУправлениеМодальнымиОкнами(5000, "V8NewLocalFrameBaseWnd",,, ИДЗадачи);
				УспехПодключения = ПодключениеИР.Connect(СтрокаСоединения);
				ТурбоКонф.ЗавершитьУправлениеМодальнымиОкнами(ИДЗадачи);

Ссылка скрыта


bolsun
#21, 24 мая 2024 19:17

(20) tormozit, что предшествует запуску клиента, какая команда или действие?


tormozit
#22, 24 мая 2024 19:24

(21) bolsun, вызов подсказки через CTRL+Space


bolsun
#23, 24 мая 2024 19:43

(16) tormozit, сейчас точно такое же поведение с зависанием?
В логе видно, что новое модальное окно было найдено и фокус в него установлен. Также оно было закрыто кликом мыши.


tormozit
#24, 24 мая 2024 19:47

(23) bolsun, Да. В логе я видел что окно найдено. Но экран при этом заморожен похоже оверлеем, т.к. уведомлений не видно. А после убийства COM приложения экран размораживается и видны все уведомления.


bolsun
#25, 24 мая 2024 19:47

Похоже нужно в скрипте добавить установку фокуса в окно конфигуратора, после ТурбоКонф.ЗавершитьУправлениеМодальнымиОкнами(ИДЗадачи);
не важно было модальное окно или нет, т.к. фокус после закрытия окна остается в клиенте


bolsun
#26, ред. 24 мая 2024 19:48

(25) tormozit, отключи оверлей принудительно в Настройках, чтобы убедится что это он мешает клику.


bolsun
#27, 24 мая 2024 19:54

Есть еще подозрение, что мешает уведомление с анимацией о появлении модального окна, убрал его.

https://disk.yandex.ru/d/XKCz9ijzgtoO1w


tormozit
#28, 24 мая 2024 21:55

(26) bolsun, с отключенным оверлеем работает вроде нормально


tormozit
#29, 24 мая 2024 21:57

(27) bolsun, в этой версии не заметил изменений в поведении с включенным оверлеем.


bolsun
#30, 25 мая 2024 13:54

(29) tormozit, у меня включение/отключение оверлея не влияет на работу метода, т.к. оверлей уже закрыт в момент появления модального окна.

Нужен лог из этой версии 6.2.8911.27918.
https://disk.yandex.ru/d/XKCz9ijzgtoO1w

Также файл настроек, в каком модуле вызывается подсказка, развернуто окно или нет.


tormozit
#31, 25 мая 2024 14:19

(30) bolsun, в этой версии не удалось воспроизвести проблему. Ты что то менял кроме логирования?


bolsun
#32, 25 мая 2024 14:20

(31) tormozit, да, немного улучшил закрытие оверлея.


bolsun
#33, 25 мая 2024 14:21

(31) tormozit, можешь лог сделать? я проверю на всякий случай, что оверлей корректно закрывается.


tormozit
#34, ред. 25 мая 2024 14:24

В режиме обычного клиентского приложения проблема больше не проявляется.

Но в управляемом клиентском приложении все еще немного присутствует. В нем окно ошибки сначала не выходит на передний план. Но при кликах появляется уведомление о разблокировке и после разблокировки уже активируется окно ошибки.

Ссылка скрыта


tormozit
#35, 25 мая 2024 14:26

(34) tormozit, понял причину. В управляемом приложении другие классы окон.
V8TopLevelFrameSDI - главное
V8TopLevelFrameSDIsec - окно ошибки


tormozit
#36, ред. 25 мая 2024 14:28

Можно в параметр КлассОкна передать регулярку, т.е. "V8TopLevelFrameSDIsec|V8NewLocalFrameBaseWnd"? Или может вообще без класса окна сделать (PID я добыл надежно)?


tormozit
#37, ред. 25 мая 2024 14:37

Получилось без класса окна. Обнови документацию параметра className. По факту он не обязательный.
Регулярка "V8TopLevelFrameSDIsec|V8NewLocalFrameBaseWnd" в качестве класса окна не сработала.


bolsun
#38, 25 мая 2024 14:37

(37) tormozit, да, пустое значение класса - игнорируется и не проверяется. Сделал параметр необязательным.


bolsun
#39, 25 мая 2024 15:24

(34) tormozit, да, в логе теперь вижу правильное закрытие оверлея.


tormozit
#40, 26 мая 2024 22:12

Исправлено в 1.54


tormozit
#41, 30 мая 2024 08:32

tormozit изменил статус на Закрыто


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера