Разработчики управляемых форм 1С часто сталкиваются с задачей оптимизации интерфейса. Одна из распространенных проблем — необходимость вызывать определенное действие по горячей клавише (например, обновление данных или переход на нужную вкладку), когда сам элемент управления (кнопка) скрыт от пользователя или находится на неактивной в данный момент странице панели.
В этой статье мы подробно разберем, почему платформа блокирует горячие клавиши для невидимых элементов, и рассмотрим практические способы решения этой проблемы с примерами реализации.
Для начала давайте выясним причину такого поведения системы. В управляемом приложении 1С действует строгая оптимизация отрисовки интерфейса. Если элемент формы имеет свойство Видимость = Ложь или расположен на странице панели, которая сейчас не активна, платформа полностью исключает этот элемент из активной структуры интерфейса на клиенте.
Как результат — связанная с кнопкой команда деактивируется, а назначенное ей сочетание клавиш перестает перехватываться платформой. Чтобы горячая клавиша сработала, элемент управления обязательно должен быть видимым и доступным на форме. Прямого низкоуровневого перехвата событий клавиатуры средствами встроенного языка 1С не существует.
Давайте рассмотрим несколько изящных обходных путей, которые позволяют сохранить работоспособность горячей клавиши, не загромождая при этом пользовательский интерфейс.
Этот способ является наиболее стандартным и «чистым» с точки зрения методологии разработки 1С. Мы выносим команду в основную командную панель формы, но скрываем ее в выпадающее подменю.
Разберем этот вариант по шагам:
СочетаниеКлавиш.Отображение и установите его в значение Только во всех функциях (или Только в "Еще" в зависимости от версии платформы).Поскольку сама командная панель формы активна и видима, назначенное сочетание клавиш будет прекрасно отрабатывать. При этом кнопка не занимает место на экране, а прячется в стандартном меню Еще.
Важное примечание: Если вы решите скрыть саму командную панель, установив для нее свойство Видимость = Ложь, горячие клавиши также перестанут функционировать.
Если вам вообще не нужна кнопка (даже в меню «Еще»), можно прибегнуть к хитрости с использованием элементов оформления. Мы создадим визуальный элемент, который физически будет присутствовать на форме, но пользователь его просто не увидит.
Проанализируем этот подход подробнее:
Гиперссылка (или обычную кнопку в режиме гиперссылки) и свяжем её с нашей командой.Заголовок введем один символ пробела: " ".Поскольку форма считает этот элемент видимым (свойство Видимость равно Истина), горячая клавиша будет отрабатывать мгновенно. Один пустой символ-пробел на форме будет абсолютно незаметен для пользователя и не нарушит компоновку интерфейса.
Настроить такое поведение можно также программно при открытии формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Настройка невидимой декорации для перехвата горячей клавиши
ЭлементДекорация = Элементы.Найти("ДекорацияПерехватчикКлавиш");
Если ЭлементДекорация <> Неопределено Тогда
ЭлементДекорация.Заголовок = " ";
ЭлементДекорация.Доступность = Истина;
ЭлементДекорация.Видимость = Истина;
КонецЕсли;
КонецПроцедуры
Еще один способ скрыть кнопку — привязать её к контекстному меню какого-либо часто используемого элемента формы, например, динамического списка или таблицы.
Однако здесь есть ключевой нюанс, который необходимо учитывать: команда в контекстном меню активна только тогда, когда фокус ввода находится на элементе, к которому это меню привязано.
Если пользователь в данный момент редактирует текстовое поле на форме, а контекстное меню с горячей клавишей привязано к таблице товаров, нажатие горячей клавиши не приведет к результату. Этот способ отлично подходит, если целевое действие жестко связано с обработкой конкретной таблицы или списка.
В управляемом приложении 1С 8.3 продолжает работать классический механизм акселераторов, пришедший еще из версии 7.7. Если в заголовке кнопки перед определенным символом поставить знак амперсанда &, этот символ станет горячей клавишей активации в сочетании с клавишей Alt.
Рассмотрим пример:
Если в свойстве Заголовок кнопки написать С&формировать, то на форме символ «ф» будет подчеркнут при зажатии клавиши Alt. Нажатие комбинации клавиш Alt + Ф мгновенно вызовет выполнение связанного действия. Это удобная альтернатива стандартным сочетаниям, не требующая сложной настройки свойств команды.
В исходном обсуждении автор планировал использовать клавишу F5. Давайте разберем, почему выбор этой клавиши может быть неудачным решением:
F5 зарезервирована в 1С для стандартного обновления динамических списков и табличных частей. Переопределение ее поведения может запутать пользователя или привести к двойному срабатыванию.F5 перехватывается самим веб-браузером для полной перезагрузки страницы. Перехватить это событие стандартными механизмами платформы 1С невозможно.Рекомендация: Для назначения кастомных действий и обновлений в управляемых формах используйте более безопасные и свободные комбинации клавиш, например: Ctrl + Shift + R, Ctrl + F5 или Alt + U.
Давайте объединим полученные знания и напишем рабочий шаблон кода. По нажатию горячей клавиши (связанной с нашей «невидимой» командой) нам необходимо переключить фокус на определенную страницу панели и выполнить обновление находящихся там данных.
&НаКлиенте
Процедура ВыполнитьПереходИОбновление(Команда)
// Переходим на нужную страницу панели управляемой формы
Если Элементы.ГруппаПанельСтраниц.ТекущаяСтраница <> Элементы.ГруппаСтраницаДанных Тогда
Элементы.ГруппаПанельСтраниц.ТекущаяСтраница = Элементы.ГруппаСтраницаДанных;
КонецЕсли;
// Вызываем процедуру обновления данных на этой странице
ОбновитьДанныеНаСтранице();
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеНаСтранице()
// Логика обновления, например, пересчет показателей или обновление динамического списка
Элементы.СписокДокументов.Обновить();
ПоказатьОповещениеПользователя("Данные успешно обновлены!");
КонецПроцедуры
Используя предложенные методы обхода ограничений видимости элементов, мы можем создавать интуитивно понятные и эргономичные интерфейсы, сохраняя при этом богатый функционал управления системой с клавиатуры.