Разработка и Конфигурация · 9 мин
Как в 1С отловить нажатие клавиши: события, сочетания и обработчики
Как в 1С отловить нажатие клавиши: события формы, сочетания клавиш, глобальные команды, обработка Enter и Escape в полях ввода. Примеры кода и типичные ошибки.
Задача отследить нажатие клавиши в 1С возникает регулярно: нужно обработать Enter в поле поиска, заблокировать Escape, назначить горячую клавишу на команду или реагировать на ввод штрихкода со сканера. Встроенный язык платформы не даёт прямого доступа к системным событиям клавиатуры, поэтому перехват реализуется через штатные механизмы — события формы, свойства сочетаний клавиш и события элементов управления.
Выбор подхода зависит от того, где именно нужно ловить нажатие: глобально по всей форме, в конкретном поле ввода или на уровне всего приложения. Ниже разобраны рабочие способы для управляемых и обычных форм с примерами кода и ограничениями каждого варианта.
Какие механизмы перехвата клавиш есть в платформе
Платформа 1С:Предприятие работает с клавиатурой на уровне событий, а не кодов клавиш. Разработчику доступны четыре основных инструмента: сочетания клавиш у команд формы, события элементов управления (полей ввода, табличных полей), событие нажатия клавиши в обычных формах и события внешнего оборудования для сканеров.
В управляемых формах акцент сделан на сочетания клавиш и команды: платформа сама сопоставляет нажатие с назначенной командой и вызывает её обработчик. В обычных формах доступно более низкоуровневое событие, передающее код клавиши. Это принципиальное различие определяет, какой код писать под конкретный режим работы.
Назначение горячих клавиш через сочетания клавиш
Самый правильный способ «отловить» нажатие в управляемой форме — не перехватывать его, а назначить команде сочетание клавиш. Для этого в редакторе формы выберите команду (глобальную команду формы или команду кнопки), откройте палитру свойств и в поле «СочетаниеКлавиш» задайте нужную комбинацию, например Ctrl+Enter или F2.
После этого нажатие комбинации вызовет обработчик команды. Никакого дополнительного кода перехвата не требуется — платформа сама следит за клавиатурой, пока форма активна. Этот подход работает и для кнопок командных панелей, и для невидимых команд формы, что позволяет создавать «скрытые» горячие клавиши.
Важное ограничение: сочетание срабатывает только когда фокус находится внутри формы, которой принадлежит команда. Для глобальных горячих клавиш всего приложения используются команды общего интерфейса или стандартные сочетания платформы, переопределить которые нельзя.
- 1Откройте форму в конфигураторе и перейдите на вкладку «Команды»
- 2Выберите команду и откройте палитру свойств
- 3В свойстве «СочетаниеКлавиш» укажите комбинацию, например Ctrl+Shift+S
- 4В модуле формы создайте обработчик команды &НаКлиенте
- 5Запустите форму и проверьте срабатывание при активном окне формы
Обработка Enter и Escape в поле ввода
Частая практическая задача — выполнить поиск или подтверждение по Enter в поле ввода. В управляемых формах для этого используется событие «ПриИзменении» или команда, привязанная к кнопке по умолчанию. У кнопки формы есть свойство «КнопкаПоУмолчанию»: если его установить, нажатие Enter в форме активирует именно эту кнопку.
Для более тонкой реакции на ввод применяют события «ИзменениеТекстаРедактирования» и «ОкончаниеВводаТекста». Первое срабатывает при каждом изменении текста в поле и подходит для «живого поиска», второе — при завершении ввода (Enter, потеря фокуса). В обработчике «ОкончаниеВводаТекста» доступен введённый текст, который можно сразу передать в поисковый запрос.
Клавишу Escape отдельно перехватывать обычно не нужно: она штатно закрывает форму или отменяет редактирование. Если требуется запретить закрытие по Escape, используют обработчик «ПередЗакрытием» формы с установкой параметра Отказ в Истина при определённых условиях.
Перехват нажатий в обычных формах
В обычных формах (режим обычного приложения) доступно событие, которого нет в управляемых, — обработчик нажатия клавиши на уровне элементов управления и формы. Он позволяет получить код нажатой клавиши и при необходимости подавить стандартную обработку.
Типовой сценарий — отловить F1–F12, стрелки или Enter в табличном поле. В обработчике анализируется переданный код клавиши, и при совпадении с нужным выполняется прикладная логика, а стандартная обработка отключается, чтобы платформа не выполнила своё действие по умолчанию.
Процедура ТабличноеПоле1ПриНажатииКлавиши(Элемент, КодКлавиши, Символ, СтандартнаяОбработка)
Если КодКлавиши = 13 Тогда // Enter
СтандартнаяОбработка = Ложь;
ОбработатьВыборСтроки();
КонецЕсли;
КонецПроцедурыКоды клавиш в обычных формах соответствуют виртуальным кодам Windows: 13 — Enter, 27 — Escape, 112–123 — функциональные F1–F12. Полный перечень кодов приводится в синтакс-помощнике и документации платформы. Полагаться на них стоит аккуратно: при переносе решения в управляемый интерфейс этот код потребует переписывания.
Отлов ввода со сканера штрихкодов
Сканер штрихкодов в режиме эмуляции клавиатуры «нажимает» клавиши очень быстро и завершает ввод суффиксом (обычно Enter). Перехватывать такой ввод через события полей ненадёжно: пользователь может ввести те же символы вручную. Правильное решение — подключение сканера как внешнего оборудования через драйвер и обработку события «ВнешнееСобытие» формы.
В обработчике «ВнешнееСобытие» проверяется источник события и тип данных: если это событие сканера со штрихкодом, выполняется поиск номенклатуры. Такой подход работает независимо от того, в каком поле формы находится фокус, и не конфликтует с ручным вводом.
Глобальный перехват и его ограничения
Платформа не предоставляет штатного механизма глобального перехвата всех нажатий клавиш на уровне клиентского приложения. Системные комбинации (Alt+Tab, Ctrl+Alt+Del и подобные) обрабатываются операционной системой и недоступны прикладному коду в принципе.
Если требуется реакция на клавиши вне контекста формы, варианты ограничены: команды глобального командного интерфейса с сочетаниями клавиш, внешние компоненты по технологии Native API или COM, либо пересмотр сценария в пользу штатных механизмов. Разработка внешней компоненты оправдана только для специфических задач вроде интеграции с нестандартным оборудованием.
Проверка результата и типичные ошибки
После внедрения обработчика проверьте поведение во всех состояниях формы: при фокусе в разных полях, при открытых всплывающих окнах, в режиме модального вызова. Сочетание клавиш, назначенное команде, не сработает, если фокус находится в поле HTML-документа или в окне другой формы — это нормальное поведение платформы, а не ошибка кода.
Ещё одна частая проблема — обработчик команды размещён с директивой &НаСервере, хотя реакция должна быть мгновенной. Горячие клавиши для интерфейсных действий (переход между полями, открытие списка) должны обрабатываться на клиенте, иначе каждое нажатие вызывает серверный вызов и заметную задержку.
Как проверить результат
Команда выполняется при любом активном поле внутри формы
Срабатывает только из конкретного поля или не срабатывает вовсе
Поиск запускается один раз по завершении ввода
Поиск запускается на каждый символ или дважды
Штрихкод обрабатывается независимо от положения фокуса
Штрихкод попадает в активное поле как текст
FAQ
Можно ли в управляемой форме получить код нажатой клавиши?
Нет, управляемые формы не передают коды клавиш прикладному коду. Доступны только сочетания клавиш, привязанные к командам, и события элементов управления. Если нужна реакция на конкретную клавишу, создайте невидимую команду формы и назначьте ей это сочетание.
Как запретить закрытие формы по Escape?
Используйте обработчик «ПередЗакрытием»: установите параметр Отказ в Истина, когда закрытие недопустимо (например, есть несохранённые данные). Полностью отключить Escape нельзя, но можно показать пользователю вопрос о подтверждении.
Почему сочетание Ctrl+S не вызывает мою команду?
Ctrl+S зарезервировано платформой для стандартной записи. Занятые системой сочетания нельзя переопределить. Выберите свободную комбинацию, например Ctrl+Shift+S, и проверьте её в синтакс-помощнике по списку стандартных сочетаний.
Как отличить ввод со сканера от ручного ввода без драйвера?
Только косвенно: сканер вводит символы с очень маленькими интервалами и завершает строку суффиксом (обычно Enter). Можно замерять время между символами, но такой метод ненадёжен. Рекомендуется подключить сканер через драйвер и обрабатывать событие «ВнешнееСобытие».
Работают ли горячие клавиши в веб-клиенте?
Да, сочетания клавиш команд формы работают в веб-клиенте, но с ограничением: комбинации, занятые браузером (например, Ctrl+T, Ctrl+W), перехватываются обозревателем и до формы не доходят. Проверяйте выбранные сочетания в целевых браузерах.
Можно ли отловить нажатие в табличном документе?
Табличный документ в режиме просмотра не поддерживает перехват клавиш. В режиме редактирования ячейки доступны события окончания ввода. Для навигации и действий по клавишам используйте команды формы с сочетаниями клавиш.
Что важно запомнить
В 1С нет прямого события нажатия клавиши: в управляемых формах используют сочетания клавиш команд и события полей ввода, в обычных — обработчик нажатия клавиши с кодом клавиши. Сканеры штрихкодов подключают через внешнее оборудование, а глобальный перехват клавиатуры штатными средствами невозможен.