При разработке интерфейсов на управляемых формах 1С часто возникает задача: реализовать вызов определенного действия (процедуры) по «горячим клавишам» так, чтобы сама кнопка не загромождала экран. Это может быть сервисная функция для администратора, «бэкдор» для отладки или просто редко используемое действие. Однако стандартное свойство Видимость = Ложь в 1С работает радикально — оно не просто скрывает элемент, но и полностью исключает связанную с ним команду из обработки на стороне клиента. В итоге горячая клавиша просто перестает срабатывать.
В этой статье мы подробно рассмотрим, как обойти это ограничение платформы, разберем различные методы «маскировки» элементов и проанализируем продвинутые способы перехвата нажатий клавиш.
Прежде чем переходить к решениям, разберем ситуацию с точки зрения архитектуры управляемого приложения. Когда мы устанавливаем флаг Видимость в значение Ложь (на уровне элемента формы или через функциональные опции), платформа оптимизирует передачу данных. Элемент не отрисовывается в браузере или тонком клиенте, и, как следствие, обработчик событий для этого элемента не регистрируется. Горячая клавиша привязана к команде, а команда активна только тогда, когда в интерфейсе есть хотя бы один доступный и видимый элемент, связанный с ней.
Это одно из самых эстетичных и простых решений, найденных сообществом. Смысл заключается в том, чтобы оставить кнопку «видимой» для платформы, но сделать её абсолютно незаметной для человеческого глаза.
Рассмотрим по шагам, как это реализовать:
Вид — Кнопка гиперссылки. Это уберет рамки и стандартный серый фон.Отображение в значение Картинка.Заголовок), чтобы он не занимал место.В результате на форме физически присутствует объект, который реагирует на нажатие клавиш, но пользователь его не видит. Единственный нюанс — при наведении курсора в это место указатель может измениться на «руку», поэтому рекомендуется размещать такую кнопку в углу формы или за другими элементами.
Если нам нужно скрыть целую панель инструментов с горячими клавишами, можно воспользоваться хитростью с программным переключением страниц. Проанализируем этот алгоритм:
Страницы.ОтображениеЗакладок в значение Не отображать.Платформа 1С считает элементы на неактивных страницах группы страниц «видимыми» (но не активными в плане фокуса), однако поведение горячих клавиш здесь может отличаться в зависимости от версии платформы. Чтобы гарантировать срабатывание, некоторые разработчики используют следующий код для перехвата:
&НаКлиенте
Процедура ПриСменеСтраницы(Элемент)
// Если по каким-то причинам фокус ушел на скрытую страницу
Если Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаСКомандами Тогда
// Выполняем действие
ВыполнитьСекретноеДействие();
// Немедленно возвращаем пользователя на основную страницу
Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаОсновная;
КонецЕсли;
КонецПроцедуры
Если предыдущие методы не подходят, можно использовать «костыль», который часто выручает в простых формах. Разберем его настройку:
Фон формы).ВидРамки = Нет линии).Этот метод менее эстетичен, так как «дырка» в 1 пиксель всё же присутствует, но для быстрого решения задачи он вполне применим.
Рассмотрим вариант, когда кнопка не должна быть на самой форме, но может присутствовать в меню. Если поместить команду в Командную панель и спрятать её внутрь вложенного Подменю, горячая клавиша продолжит работать. При этом сама кнопка будет скрыта от глаз пользователя до тех пор, пока он не раскроет это подменю. Это штатный и наиболее «правильный» с точки зрения методологии 1С способ организации редких команд.
Для реализации по-настоящему глобальных горячих клавиш, которые работают даже без фокуса на конкретной кнопке, можно использовать более сложные технические решения.
Использование поля HTML-документа:
Мы можем разместить на форме невидимое (размером 1x1) поле HTML-документа. Внутри него можно прописать JavaScript-код, который перехватывает нажатия любых клавиш (событие onkeydown). При срабатывании нужной комбинации скрипт передает сигнал обратно в 1С через механизм window.external.OnClick() или изменение заголовка окна.
Внешние компоненты (Native API):
Это самый надежный способ. Внешняя компонента может зарегистрировать системный «хук» (hook) на клавиатуру. В коде 1С это будет выглядеть так:
&НаКлиенте
Процедура ВнешнееСобытие(Источник, Событие, Данные)
Если Источник = "KeyboardHook" И Событие = "HotKeyPress" Тогда
Если Данные = "Ctrl+Alt+S" Тогда
ВыполнитьАдминДействие();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализировав все варианты, можно сделать следующие выводы:
Важно помнить, что в версиях платформы 8.3.18 и выше поведение элементов в веб-клиенте и тонком клиенте может незначительно различаться, поэтому всегда тестируйте работу горячих клавиш непосредственно в той среде, где будет работать конечный пользователь.