Как создать скрытую команду по горячим клавишам в управляемой форме 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке интерфейсов на платформе 1С:Предприятие 8.3 иногда возникает задача вызывать определенное действие сочетанием клавиш (например, для вызова сервисных функций администратора, служебных отладочных панелей или быстрых действий оператора), но при этом не загромождать интерфейс лишними элементами и скрыть наличие кнопки от обычных пользователей. Однако при попытке назначить горячую клавишу на скрытую команду разработчики сталкиваются с тем, что сочетание просто перестает реагировать.

Разберем, почему платформа ведет себя подобным образом, какие системные ограничения здесь действуют и какими способами можно реализовать требуемое поведение.

Выясним причину: почему не работают горячие клавиши для невидимых кнопок

В управляемом приложении (в отличие от обычных форм платформы 8.2) архитектура клиентской части кардинально переработана. Проанализируем ключевые факторы, влияющие на перехват клавиатурных событий:

  1. Отсутствие глобальных событий клавиатуры у формы. В управляемой форме нет низкоуровневых событий вроде НажатиеКнопкиКлавиатуры, KeyDown или KeyUp. Горячие клавиши привязываются не к самому объекту формы, а к визуальным элементам интерфейса (кнопкам), связанным с командами.
  2. Оптимизация рендеринга клиентского интерфейса. Если для кнопки или группы установлено свойство Видимость = Ложь (или видимость ограничена функциональными опциями и ролями), платформа тонкого и веб-клиента полностью исключает данный элемент из итогового дерева интерфейса (DOM в веб-клиенте). Соответственно, обработчик горячей клавиши на клиенте не регистрируется, и нажатие сочетания клавиш игнорируется.
  3. Ограничения контекстных меню. Если поместить команду в контекстное меню элемента (например, декорации), горячая клавиша будет срабатывать только в тот момент, когда фокус ввода находится на этом элементе. Поскольку декорации-надписи не могут удерживать фокус клавиатуры, вызов по горячей клавише в таком сценарии работать не будет.

Способ 1. Визуальная маскировка кнопки на форме

Поскольку платформе обязательно требуется физическое присутствие элемента в дереве формы со значением Видимость = Истина, применим способ визуальной маскировки. Наша цель — оставить элемент активным для платформы, но сделать его незаметным для человеческого глаза и исключить его появление в стандартном системном меню «Еще» («Все действия»).

Разберем по шагам, как настроить такой элемент в конфигураторе:

  1. Создаем команду формы. В окне редактирования формы на вкладке «Команды» добавляем новую команду, назначаем ей обработчик в модуле формы и в свойстве СочетаниеКлавиш задаем требуемую комбинацию (например, Ctrl + F11 или другое необходимое сочетание).
  2. Размещаем кнопку вне основной командной панели. Если перетащить кнопку на стандартную панелю формы, она автоматически попадет в выпадающий список меню «Еще». Чтобы этого избежать, перетаскиваем кнопку в тело формы — например, внутрь одной из существующих групп элементов рядом с надписью или полем ввода.
  3. Отключаем отображение рамки кнопки. В палитре свойств созданной кнопки находим свойство ОтображениеФигуры и устанавливаем его в значение Нет. В этом случае кнопка перестает отрисовываться в виде стандартной выпуклой плашки.
  4. Убираем заголовок и картинку. В свойстве Заголовок задаем один символ пробела или оставляем поле пустым, а свойства Картинка и Отображение настраиваем так, чтобы никакой графический контент не выводился.
  5. Настраиваем цветовую маскировку и размеры. Для исключения случайного выделения задаем свойствам ЦветТекста, ЦветФона и ЦветРамки значение Цвет фона формы или делаем элемент минимальной высоты и ширины (значение 1).

В результате кнопка остается активной в клиентском приложении, перехват горячих клавиш успешно отрабатывает, но пользователь не видит никаких артефактов на экране.

Способ 2. Вынос на отдельную командную панель без автозаполнения

Рассмотрим более аккуратный вариант размещения скрытой кнопки, который позволяет избежать искажения разметки основных рабочих полей ввода:

  1. Добавляем в элементы формы элемент управления КоманднаяПанель (отдельный от командной панели формы).
  2. Снимаем у добавленной панели флаг Автозаполнение. При отключенном автозаполнении платформа не будет генерировать для этой панели системную кнопку «Еще» («Все действия»).
  3. Переносим нашу секретную команду внутрь этой командной панели.
  4. Для самой кнопки устанавливаем свойства: ОтображениеФигуры = Нет, пустой заголовок и минимальные размеры.
  5. Размещаем саму панель в самом низу формы или внутри свернутой группы без отображения заголовка.

Этот способ гарантирует, что команда не появится в общем выпадающем списке команд формы и не сместит соседние элементы интерфейса.

Способ 3. Перехват клавиш через поле HTML-документа

Если требуется отлавливать клавиатурные сочетания вообще без добавления фиктивных кнопок, можно воспользоваться элементом формы ПолеHTMLДокумента. Посмотрим на алгоритм реализации:

  1. Размещаем на форме реквизит строкового типа и выводим его как поле HTML-документа с минимальными размерами (1x1 пиксель).
  2. При открытии формы загружаем минимальный 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);
    КонецПроцедуры
    
  3. В обработчике события поля HTML-документа ПриНажатии перехватываем переход по сформированной ссылке и вызываем нужную логику:
    
    &НаКлиенте
    Процедура ПолеHTMLПриНажатии(Элемент, ДанныеСобытия, СтандартнаяОбработка)
        Если Найти(ДанныеСобытия.href, "exec:secret_action") > 0 Тогда
            СтандартнаяОбработка = Ложь;
            ВыполнитьСекретноеДействие();
        КонецЕсли;
    КонецПроцедуры
    

Важные нюансы при выборе сочетаний клавиш

При назначении горячих клавиш необходимо учитывать среду исполнения:

  1. Конфликты веб-клиента. Комбинации вида Ctrl + 1, Ctrl + 2 ... Ctrl + 9 в большинстве современных веб-браузеров жестко зарезервированы под переключение вкладок. При работе через браузер нажатие такого сочетания будет перехвачено самим браузером и не дойдет до формы 1С. Для кроссплатформенной работы лучше использовать сочетания с Alt, Shift или функциональными клавишами F2–F12.
  2. Безопасность бизнес-логики. Помните, что скрытие кнопки в интерфейсе не является мерой защиты от несанкционированного доступа. Если выполнение скрытой процедуры требует повышенных привилегий, обязательна проверка прав на стороне сервера с помощью метода РольДоступна() или проверка прав доступа к объектам метаданных.
← На главную