Всем здравствуйте! Хочу программно закрыть модальное окно (в обычных формах - оповещение пользователя) и никак не найду решения, уже небольшой комод собрал, вот:
//1. только управляйки
//Для Каждого Запись Из АктивноеОкно().Содержимое Цикл
// Сообщить(Запись.Заголовок);
// Запись.Закрыть();
//КонецЦикла;
//2. Не работает
//Оповестить("ИзменениеОповещенияПользователей");
//3. Не работает
//ФормаОповещения = ПолучитьОбщуюФорму("ДиалогОшибкаВопрос");
//ФормаОповещения.Закрыть();
//4. не работает с модальным также
//Попытка
// Shell= Новый COMОбъект("Wscript.Shell");
// Shell.SendKeys("{ESC}");
//Исключение
//КонецПопытки;
Показать
Кто-нибудь знает решение? Отказаться от модальности здесь не реально
(2)
(4) В модуле обычного приложения раз в минуту (обработчик ожидания) запускается проверка оповещений пользователям. Поскольку имеем дело с обработчиком ожидания, то для запуска процедуры заново необязательно завершение предыдущего запуска, а при этом в ходе него может модально открыться окно формы. Я могу определить, закончилось ли выполнение предыдущей процедуры путем Сохранения значений в хранилище, однако, среагировать и закрыть открытое в предыдущей процедуре модальное окно я не в силах, оно не реагирует на мои попытки! Сохранять в хранилище дескриптор формы я даже не пытался, да, это не УФ, но думаю и здесь нелепо. Тысячу лет назад нам рассказывали об объектах Приложение или как-то так, может и в 8.3 есть подобный объект, от которого можно добраться даже до модального окна?
(6) Отправляй оповещение с определенным именем.
Оповестить("ЗакрытьЭтоМодальноеОкно");
В форме в обработчике оповещения проверяй имя события, и если имя совпадает - закрывай.
(11) Оповещения должны отправляться в том же сеансе, где открыто окно.
Во вложении обработка - из одного окна по кнопке Выполнить открывается другое модальное, и по оповещению через 20 секунд закрывается.
(15) Здесь работает, вижу, но видимо, модуль обычного приложения не совсем клиент, проверял - ОбработкаОповещения не срабатывает в принципе - такие дела8|
(11) Стоит понимать, что когда вы открываете модально, код останавливается на этой строке, и далее выполнится только после того как окно будет закрыто.
(17) Да, действительно - оповещения работают и в модуле обычного приложения, просто мой код в другом месте повлиял и оповещение не вызывалось. Так что извините!
(1) best practice, от вендора: не использовать модальность. Тем более, что все современные конфигурации выпускаются уже с отключенной возможностью модальных окон.
(5) Знаете другой способ показать окно поверх всех окон пользователя и затребовать (!) ответ, то есть, чтобы нельзя было переключиться, не отреагировав? При этом окно должно быть репрезентабельным, не мелким вопросом, который все равно читать никто не будет...
(7) Вы можете определить некий признак завершения процесса. Осталось программно в модальной форме создать функцию. И закрывать модальное окно при условии, что эта функция вернет ИСТИНА (по обработчику ожидания).
(7) У пользователя всегда должна быть возможность переключиться на другую задачу, а на вопрос ответить позже. А уже после его ответа пусть продолжит работать ваш код. Хотите вы того или нет, но ваш подход перестанет работать, поэтому его надо менять.
(14) Не парьтесь, вы, видимо, с такими задачами не сталкивались, на УФ тоже старался отходить от них, но здесь -
1. пользователь не вернется - забудет, а оповещение важное (тех работы)
2. пользователь в списке окон может не найти окно, чтобы вернуться
3. если окно не модальное, может просто быстро ткнуть и даже не заметить, что что-то выскочило
4. не обдуманные мной случаи...