При разработке интерфейсов на платформе 1С:Предприятие 8.3 иногда возникает задача вызывать определенное действие сочетанием клавиш (например, для вызова сервисных функций администратора, служебных отладочных панелей или быстрых действий оператора), но при этом не загромождать интерфейс лишними элементами и скрыть наличие кнопки от обычных пользователей. Однако при попытке назначить горячую клавишу на скрытую команду разработчики сталкиваются с тем, что сочетание просто перестает реагировать.
Разберем, почему платформа ведет себя подобным образом, какие системные ограничения здесь действуют и какими способами можно реализовать требуемое поведение.
В управляемом приложении (в отличие от обычных форм платформы 8.2) архитектура клиентской части кардинально переработана. Проанализируем ключевые факторы, влияющие на перехват клавиатурных событий:
НажатиеКнопкиКлавиатуры, KeyDown или KeyUp. Горячие клавиши привязываются не к самому объекту формы, а к визуальным элементам интерфейса (кнопкам), связанным с командами.Видимость = Ложь (или видимость ограничена функциональными опциями и ролями), платформа тонкого и веб-клиента полностью исключает данный элемент из итогового дерева интерфейса (DOM в веб-клиенте). Соответственно, обработчик горячей клавиши на клиенте не регистрируется, и нажатие сочетания клавиш игнорируется.Поскольку платформе обязательно требуется физическое присутствие элемента в дереве формы со значением Видимость = Истина, применим способ визуальной маскировки. Наша цель — оставить элемент активным для платформы, но сделать его незаметным для человеческого глаза и исключить его появление в стандартном системном меню «Еще» («Все действия»).
Разберем по шагам, как настроить такой элемент в конфигураторе:
СочетаниеКлавиш задаем требуемую комбинацию (например, Ctrl + F11 или другое необходимое сочетание).ОтображениеФигуры и устанавливаем его в значение Нет. В этом случае кнопка перестает отрисовываться в виде стандартной выпуклой плашки.Заголовок задаем один символ пробела или оставляем поле пустым, а свойства Картинка и Отображение настраиваем так, чтобы никакой графический контент не выводился.ЦветТекста, ЦветФона и ЦветРамки значение Цвет фона формы или делаем элемент минимальной высоты и ширины (значение 1).В результате кнопка остается активной в клиентском приложении, перехват горячих клавиш успешно отрабатывает, но пользователь не видит никаких артефактов на экране.
Рассмотрим более аккуратный вариант размещения скрытой кнопки, который позволяет избежать искажения разметки основных рабочих полей ввода:
КоманднаяПанель (отдельный от командной панели формы).Автозаполнение. При отключенном автозаполнении платформа не будет генерировать для этой панели системную кнопку «Еще» («Все действия»).ОтображениеФигуры = Нет, пустой заголовок и минимальные размеры.Этот способ гарантирует, что команда не появится в общем выпадающем списке команд формы и не сместит соседние элементы интерфейса.
Если требуется отлавливать клавиатурные сочетания вообще без добавления фиктивных кнопок, можно воспользоваться элементом формы ПолеHTMLДокумента. Посмотрим на алгоритм реализации:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ТекстHTML =
"<html>
|<head>
|<script>
|document.addEventListener('keydown', function(e) {
| if (e.ctrlKey && e.keyCode == 50) { // Код клавиши '2'
| // Передаем сигнал платформе 1С
| window.location.href = 'exec:secret_action';
| }
|});
|</script>
|</head>
|<body style='margin:0;padding:0;background:transparent;'></body>
|</html>";
Элементы.ПолеHTML.Документ.write(ТекстHTML);
КонецПроцедуры
ПриНажатии перехватываем переход по сформированной ссылке и вызываем нужную логику:
&НаКлиенте
Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
Если Найти(ДанныеСобытия.href, "exec:secret_action") > 0 Тогда
СтандартнаяОбработка = Ложь;
ВыполнитьСекретноеДействие();
КонецЕсли;
КонецПроцедуры
При назначении горячих клавиш необходимо учитывать среду исполнения:
Ctrl + 1, Ctrl + 2 ... Ctrl + 9 в большинстве современных веб-браузеров жестко зарезервированы под переключение вкладок. При работе через браузер нажатие такого сочетания будет перехвачено самим браузером и не дойдет до формы 1С. Для кроссплатформенной работы лучше использовать сочетания с Alt, Shift или функциональными клавишами F2–F12.РольДоступна() или проверка прав доступа к объектам метаданных.