Выполнял типичный сценарий в файловой базе 1С 8.3.23 - остановка в отладчике кода 1С, вызов команды "ИР Отладить объект". После нее Турбоконф перестает отвечать и лишь выводит уведомление о блокировке ввода.
Повторил сценарий 3 раза и все 3 раза получил зависание.
[20231206 14-23-Ссылка скрыта
#1, 06 декабря 2023 15:42
Вижу, что зависание возникает после, сохранения каких то данных на сетевой ресурс, может с этим что-то связано.
#2, ред. 06 декабря 2023 15:44
Сетевая папка локальная, т.е. находится на этом компьютере и проблем с доступом к ней нет.
#3, 06 декабря 2023 15:50
(2) tormozit, после вывода сообщения
"[06.12.23 15:12:55:883] Warning: Снимок объекта = "Скопируйте эту строку и используйте команду "Открыть объект для отладки". Данные помещены в файл. Файл "
совсем ничего не происходит в логе, до клика разблокировки. Что там выполняется в скрипте в это время я не знаю.
Следующая строка в скрипте
МодулиИР.ирКлиент.ОтладитьОтложенныйОбъектЛкс(СнимокОбъекта);
Доходит ли до ВосстановитьОкноПриложения() - не понятно
сюда точно не доходит -
ТурбоКонф.НачатьВызовВнешнегоОкнаАсинх(МодулиИР.ирОбщий.ПодготовитьТекстДляРегВыраженияЛкс(ЗаголовокПриложенияИР), 2000, ОкноКонфигуратора, РежимОткрытияВнешнегоОкна.ГлавноеОкно,
Истина, ИдентификаторПроцесса);
#4, 06 декабря 2023 16:19
Кажется понял в чем дело. В данном случае внутри COM вызова
МодулиИР.ирКлиент.ОтладитьОтложенныйОбъектЛкс(СнимокОбъекта);
Должно открыться модальное окно с вопросом. Но я его не видел. Вероятно зависло из-за этого.
#5, 06 декабря 2023 16:24
Непонятно как от этого застраховаться универсально. Чтобы предварительно запускать асинхронное ожидание окна, нужно звать ТурбоКонф.НачатьВызовВнешнегоОкнаАсинх. Но я не помню всех заголовков модальных окон которые там будут появляться. Хотелось бы какую то более универсальную защиту. Например режим "ждать появления любого модального окна от процесса ХХХ" или "ждать появления окна кроме главного от процесса ХХХ"
#6, 06 декабря 2023 16:29
Вспомнил. Отдельное окно с вопросом через какое то время я видел после этого зависания уже после убийства Турбоконфа.
#7, 06 декабря 2023 20:13
Как получить PID клиентского приложения при его запуске через COM, но до возможного появления модального окна?
#8, 06 декабря 2023 21:52
(7) bolsun, смотри ирКэш.ИдентификаторПроцессаОСЛкс()
#9, ред. 06 декабря 2023 22:05
(8) tormozit, мне собственно нужно это в скрипте RDT получить, для теста нового метода.
Добавил Предупреждение("Test!"); в ПриНачалеРаботыСистемы()
Код для перехвата диалога
В методе ПодключениеИР() хочу перехватить этот диалог, но мне нужен PIDКлиента и нужен соответсвующий пример кода для RDT.
#10, 06 декабря 2023 22:09
Либо если это сложно, то не в момент создания COM, а например при вызове какой-то команды.
Мне нужно смоделировать появление модального окна и его перехват.
#11, 06 декабря 2023 22:43
ВосстановитьЗначениеСеансаКонфигуратора("ПодключениеИР.ИД")
#12, ред. 06 декабря 2023 22:55
(11) tormozit, ПИД клиента получил, куда мне добавить в ИР код Предупреждение("Test!")?
Чтобы он был вызван в команде ИР Адаптера, к примеру РедактироватьТекст() и появился модальный диалог?
#13, ред. 06 декабря 2023 23:18
Вот ссылка на метод Обработка.ирКлсПолеТекстаПрограммы.МодульОбъекта.ОткрытьРедакторСтроковогоЛитерала
{Обработка.ирКлсПолеТекстаПрограммы.МодульОбъекта(4112:ОткрытьРедакторСтроковогоЛитерала,2)}: Если ирОбщий.ПроверитьПлатформаНеWindowsЛкс(,, Истина) Тогда
Он вызывается командой ИР.РедактироватьТекст
#14, 07 декабря 2023 15:38
@tormozit, достаточно же будет просто вытащить модальное окно наверх? Пользователь закроет его и скрипт продолжит выполнение.
#15, 07 декабря 2023 15:40
Городить обработчик на это не хочется, это сложно, т.к. ожидание запускается в другом потоке, там нет этой скриптовой машины, которая выполняет текущий скрипт. Придется запускать новый инстанс и т.д.
#16, 07 декабря 2023 15:42
Да. Показать это окно пользователю - достаточно.
#17, 07 декабря 2023 19:47
@tormozit, при обнаружении модального окна и отображении его буду выбрасывать исключение, т.к. ситуация явно нештатная и продолжать выполнение скрипта нет смысла.
#18, ред. 07 декабря 2023 19:59
В исходном сценарии ситуация штатная. Там пользователю задается запланированный вопрос. После ответа на вопрос COM метод завершается и возвращает управление скрипту. Но даже если ты выбросишь исключение, то видимо я смогу его поймать и продолжить выполнение скрипта конкретно в этой ситуации, т.к. от ответа на вопрос дальнейшие действия скрипта не зависят.
Но есть и другие ситуации, в которых тоже может явиться какой то вопрос, и там выброс исключения может нарушить логику выполнения команды, т.к. дальнейший код опирается на возвращаемое из COM вызова значение.
Выброс тобой исключения в таких ситуациях решит главную проблему - зависание. Более универсальное решение можно отложить, если делать его сложно.
#19, 07 декабря 2023 20:08
(18) tormozit, да, нужно индивидуально разбирать ситуации. Например если ты вызвал НачатьВызовВнешнегоОкнаАсинх с ожиданием 2000мс, в это время показалось модальное окно, то явно дальше пойдет не так как задумано. Ожидание завершится раньше чем будет закрыт диалог и не сможет передвинуть окна как нужно. Тогда нужно увеличивать время ожидания и т.д.
#20, 07 декабря 2023 20:09
А например, если модальное окно было показано при инициализации COM, то там в принципе нормально работает продолжение скрипта.
#21, 07 декабря 2023 20:10
https://disk.yandex.ru/d/XKCz9ijzgtoO1w
#22, ред. 07 декабря 2023 20:19
1 метод, не вызывает исключения, просто ожидает появление окна заданного класса и перемещает его наверх, со снятием блокировки ввода. Может работать с неизвестным ид процесса, будет проверять окна всех процессов, исключая открытые на момент запуска задачи. Задача завершается либо по таймауту либо принудительно.
[ContextMethod("НачатьУправлениеМодальнымиОкнами", "StartModalWindowsHandling")]
#23, 07 декабря 2023 20:13
1-й метод полезен для инициализации COM или при вызове методов COM без показа его окон.
#24, ред. 07 декабря 2023 20:17
2-й способ, передать нужные опции в метод НачатьВызовВнешнегоОкнаАсинх. Делает тоже самое, только вызывает исключение и выполняется параллельно с вызовом внешнего окна, завершаясь вместе с ним по таймауту. Требует ПИД клиента
#25, 07 декабря 2023 20:17
Для перемещения диалога в X,Y они также добавляются в Опции.
#26, 07 декабря 2023 22:00
Жду обратной связи, для мерджа всех текущих изменений за эти дни в основную ветку.
#27, ред. 07 декабря 2023 23:40
Окно с вопросом стало появляться. Но после его закрытия и переключении на окно конфигуратора любые клики не приходят в окно модуля. Оно как бы остается заблокированным твоим псевдомодальным режимом. Приходится убивать Турбоконф, чтобы снять эту блокировку с окна конфигуратора.
[20231207 23-02-Ссылка скрыта
#28, 07 декабря 2023 23:43
И в сценарии, когда COM не открывает модальное окно (сразу открывает немодальное), поведение аналогичное.
#29, 07 декабря 2023 23:45
(27) tormozit, почему заголовок искомого окна установлен в пустую строку ""?
#30, 07 декабря 2023 23:46
Потому что я не знаю какие там будут окна открываться. Мне надо активировать любое модальное окно этого процесса, если оно появится.
#31, 07 декабря 2023 23:47
(30) tormozit, это работает не так. НачатьВызовВнешнегоОкнаАсинх ждет окно с нужным наименованием, а модальные окна будут автоматически показаны, если они возникнут.
#32, 07 декабря 2023 23:48
либо изначально мы не правильно определили задачу
#33, ред. 07 декабря 2023 23:49
Сейчас запускаются 2 разные задачи в одном вызове. Ожидание нужного окна, и вывод наверх любого модального, если оно вдруг возникло во время ожидания.
#34, 07 декабря 2023 23:50
Если ты точно знаешь, что должно возникнуть модальное и ждешь его, то это отдельный метод нужен.
#35, 07 декабря 2023 23:50
или те окна тоже модальные, которые ты ждешь?
#36, 07 декабря 2023 23:52
Да. теперь понял. Они тоже модальные, значит нужно переделать логику.
#37, 07 декабря 2023 23:53
Я решал проблему с внезапным появлением модального окна, которое мы не ждали. А не появление любого модального окна.
#38, 07 декабря 2023 23:57
В общем нужна четкая постановка задачи, что мы ждем, чего не ждем. Что делаем в момент появления того или иного окна.
#39, ред. 08 декабря 2023 00:32
Понял. Я открываю немодальное окно. Перед открытием которого иногда будет задаваться модально вопрос.
Переделал код скрипта на такой
Теперь работает с модальным окном и без него. Блокировка с окна конфигуратора снимается как надо. Но главное окно COM приложения каждый раз не максимизировано (не развернуто на полный экран) и немного сдвинуто.
#40, 07 декабря 2023 23:58
(39) tormozit, сдвинуто, если появлялось модальное окно?
#41, ред. 08 декабря 2023 00:29
Сдвиг не зависит от того, появлялось модальное окно или нет. Во обоих случаях он происходит. Ну и главное - хочется чтобы главное окно COM приложения было максимизировано как это происходит в остальных сценариях.
#42, ред. 08 декабря 2023 08:20
Доработал взаимодействие и сделал метод более гибким, теперь можно ждать окно и без заданного заголовка.
ПриНахожденииВызыватьИсключение. По умолчанию Ложь - тут все понятно
ПриНахожденииПрерватьОжидание. По умолчанию Ложь - окно активируется, ожидание прерывается, скрипт идет дальше без исключения
Если оба флага Ложь - то взаимодействие будет происходить с первым найденным окном заданного класса, не учитывая заданное условие по заголовку. Полезно, если мы точно не знаем какой заголовок будет у модального окна.
https://disk.yandex.ru/d/XKCz9ijzgtoO1w
#43, 08 декабря 2023 08:22
УправлениеМодальнымиОкнами,PIDКлиента - скорее всего лишние свойства в опциях.
PIDКлиента - уже есть параметр,
без УправлениеМодальнымиОкнами тоже можно обойтись, если задан КлассОкна
#44, ред. 08 декабря 2023 09:20
Теперь вроде все работает - окно приложения появляется с ожидаемым размером. Но только метод НачатьВызовВнешнегоОкнаАсинх() заругался на отсутствие свойства ПриНахожденииПрерватьВыполнение в структуре. Я его добавил видимо вместо ПриНахожденииПрерватьОжидание и все заработало.
#45, 08 декабря 2023 09:26
(44) tormozit, я его переименовал у себя в ПриНахожденииПрерватьОжидание и исправил в описании, но не выложил версию.
#46, ред. 08 декабря 2023 09:28
или ты раньше скачал, чем я выложил обновленную версию )) в общем не важно уже
#47, 08 декабря 2023 09:29
Это оставляем или убираем?
УправлениеМодальнымиОкнами,PIDКлиента
#48, 08 декабря 2023 09:32
PIDКлиента - явно избыточное свойство.
УправлениеМодальнымиОкнами - лучше пока оставить, т.к. есть другие сценарии, которые все сразу вспомнить и проверить тяжело.
#49, ред. 08 декабря 2023 09:36
(48) tormozit, вообще при задании этого флага метод управляет не только модальными окнами. Он ждет и управляет любыми окнами заданного класса. Поэтому название не совсем корректное.
#50, 08 декабря 2023 09:47
Ладно тогда пока PIDКлиента убираю, и мерджу с основной веткой.
#51, 08 декабря 2023 10:02
bolsun изменил статус на Закрыто