При решении задач контроля доступа (например, фиксация проходов через турникет, вывод оповещений оператору или вывод информации о звонке) часто требуется показать информационное окно поверх всех остальных элементов программы. При этом окно не должно блокировать ввод данных в основном интерфейсе, желательно должно позиционироваться в углу экрана и закрываться автоматически по истечении времени.
Разберем возможности платформы 1С:Предприятие 8.3, проанализируем штатные ограничения и рассмотрим лучшие способы реализации такого поведения.
В управляемом приложении разработчик ограничен возможностями модели окон интерфейсов Такси и В закладках. Проанализируем свойства формы:
РежимОткрытияОкна со значениями БлокироватьОкноВладельца или БлокироватьВесьИнтерфейс выводит окно поверх остальных, но полностью запрещает работу с заблокированными формами до момента закрытия всплывающего окна.Независимый не блокирует интерфейс, но при клике пользователя в любое другое окно открытая форма сразу же уходит на задний план.Если цель заключается в выводе кратких сведений о событии (например, фото сотрудника, ФИО и статус прохода через турникет), наиболее правильным решением является использование процедуры ПоказатьОповещениеПользователя.
Данный метод обладает всеми необходимыми характеристиками:
ОписаниеОповещения.Посмотрим на пример вызова всплывающего оповещения:
&НаКлиенте
Процедура ЗафиксироватьПроход(ФИОСотрудника, ТекстСобытия, КартинкаСотрудника, СсылкаНаСобытие)
// Формируем неблокирующее оповещение в углу экрана
ПоказатьОповещениеПользователя(
"Проход через турникет: " + ФИОСотрудника,
ПолучитьНавигационнуюСсылку(СсылкаНаСобытие),
ТекстСобытия,
КартинкаСотрудника
);
КонецПроцедуры
Если для работы требуется полноценная форма обработки со сложным набором элементов управления, автоматическое закрытие окна реализуется с помощью метода ПодключитьОбработчикОжидания.
Разберем по шагам создание автозакрывающейся формы:
ПриОткрытии подключаем однократный обработчик ожидания с заданным интервалом в секундах.ЭтаФорма.Закрыть().Рассмотрим пример кода в модуле всплывающей формы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Подключаем однократный таймер на 5 секунд
// Третий параметр Истина указывает на однократное выполнение
ПодключитьОбработчикОжидания("АвтоматическоеЗакрытиеФормы", 5, Истина);
КонецПроцедуры
&НаКлиенте
Процедура АвтоматическоеЗакрытиеФормы()
Если ЭтаФорма.Открыта() Тогда
ЭтаФорма.Закрыть();
КонецЕсли;
КонецПроцедуры
Если стандартного функционала платформы недостаточно, рассмотрим следующие альтернативы:
SetWindowPos с флагом HWND_TOPMOST. Это позволяет удерживать окно поверх всех окон операционной системы без захвата фокуса ввода.