Как отловить нажатие клавиш клавиатуры в управляемой форме 1С

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

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

Ограничения платформы 1С при работе с горячими клавишами

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

Рассмотрим, какие ограничения действуют при настройке свойства Сочетание клавиш у команд формы:

  1. Одиночные буквенные клавиши: назначить одиночную букву (например, «А», «R») напрямую в свойство команды невозможно. Платформа требует обязательного использования клавиш-модификаторов (Ctrl, Alt, Shift).
  2. Одиночные сервисные и функциональные клавиши: без модификаторов платформа позволяет назначать только клавиши F1–F12, Enter, Esc, Space, Backspace, Delete, Insert и клавиши навигации (стрелки).
  3. Системные комбинации: ряд сочетаний (например, Ctrl+F, Ctrl+S, Ctrl+O, F1) зарезервирован самой платформой или браузером (в случае веб-клиента). Такие комбинации перехватываются глобально и не передаются в обработчик команды формы.

Вариант 1. Использование поля ввода и события АвтоПодбор

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

Разберем по шагам, как настроить такую схему:

  1. Добавляем на форму реквизит ПолеВводаКоманд с типом Строка и связываем его с элементом формы.
  2. В свойствах элемента формы включаем флаг РежимВыбораИзСписка или флаг КнопкаВыпадающегоСписка, а также подключаем обработчик события АвтоПодбор.
  3. При открытии формы и после выполнения любых действий принудительно возвращаем фокус на это поле через установку свойства ТекущийЭлемент.

Посмотрим на пример реализации обработчика в модуле управляемой формы:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ТекущийЭлемент = Элементы.ПолеВводаКоманд;
КонецПроцедуры

&НаКлиенте
Процедура ПолеВводаКомандАвтоПодбор(Элемент, Текст, ДанныеВыбора, ПараметрыОжидания, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    Если ПустаяСтрока(Текст) Тогда
        Возврат;
    КонецЕсли;
    
    // Получаем последний введенный символ
    ВведенныйСимвол = ВРег(Прав(Текст, 1));
    
    // Очищаем поле ввода для следующей команды
    ЭтаФорма.ПолеВводаКоманд = "";
    
    // Обрабатываем действие
    ОбработатьВводСимвола(ВведенныйСимвол);
    
    // Гарантируем возврат фокуса в поле ввода
    ТекущийЭлемент = Элементы.ПолеВводаКоманд;
КонецПроцедуры

&НаКлиенте
Процедура ОбработатьВводСимвола(СимволКоманды)
    Если СимволКоманды = "А" Или СимволКоманды = "A" Тогда
        ВыбратьДисконтнуюКартуТипА();
    ИначеЕсли СимволКоманды = "Б" Или СимволКоманды = "B" Тогда
        ВыбратьДисконтнуюКартуТипБ();
    КонецЕсли;
КонецПроцедуры

Такой подход позволяет перехватывать одиночные символы на лету в момент их нажатия, не дожидаясь нажатия клавиши Enter.

Вариант 2. Перехват событий через поле HTML-документа

Рассмотрим альтернативное решение, когда требуется более гибкий контроль над событиями нажатия клавиш без отображения стандартных элементов ввода 1С. Для этого на управляемой форме размещается элемент ПолеHTMLДокумента.

Внутри HTML-страницы с помощью JavaScript перехватывается событие keydown или keyup, после чего информация о нажатой клавише передается обратно в контекст 1С.

Разберем пример генерации HTML с обработчиком клавиатуры:


&НаКлиенте
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    HTMLТекст = 
        "<html>
        |<head>
        |<script type='text/javascript'>
        |   document.onkeydown = function(e) {
        |       var code = e.key;
        |       // Передаем данные в 1С через смену хэша или навигацию
        |       location.href = 'v8action://keypressed?key=' + encodeURIComponent(code);
        |   };
        |</script>
        |</head>
        |<body style='margin:0; padding:0; overflow:hidden;'>
        |</body>
        |</html>";
    
    ЭтаФорма.ПолеHTML = HTMLТекст;
КонецПроцедуры

Для приема события в модуле формы используется обработчик события ПриНажатии или ДокументСформирован соответствующего элемента поля HTML-документа. Важно учитывать, что для работы этого метода область HTML-документа должна быть активна (находиться в фокусе ввода).

Вариант 3. Использование внешних компонент (Native API)

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

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

Посмотрим на типовую структуру обработки:


&НаКлиенте
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
    Если Источник = "KeyboardHook" И Событие = "KeyPressed" Тогда
        КодКлавиши = Данные;
        ВыполнитьДействиеПоКоду(КодКлавиши);
    КонецЕсли;
КонецПроцедуры

Важный момент: при использовании внешних компонент необходимо учитывать разрядность клиентского приложения (32-бит или 64-бит) и совместимость компоненты с архитектурой тонкого клиента и операционной системой (Windows/Linux).

Вариант 4. Настройка оборудования через БПО или программируемую клавиатуру

В условиях реальной автоматизации кассового узла (РМК) лучшей практикой является аппаратная адаптация:

  1. Программируемые клавиатуры (POS-клавиатуры): на уровне прошивки контроллера клавиатуры на требуемые клавиши назначаются разрешенные платформой комбинации (например, F2–F12 или Ctrl+Shift+Буква). В этом случае в форме 1С создаются обычные команды с указанными горячими клавишами, что гарантирует стабильную работу без доработок низкоуровневого кода.
  2. Клавиатурные сканеры: если данные вводятся как последовательность символов со специального устройства, подключение выполняется через библиотеку подключаемого оборудования (БПО) с настройкой префиксов и суффиксов.
← На главную