Перехват клавиатуры в управляемой форме 1С: что можно, а что нельзя
Содержание
Прямого события «нажата клавиша X» у управляемой формы 1С 8.3 нет. Платформа не отдаёт разработчику сырые коды клавиш. Вместо этого есть три рабочих механизма: сочетание клавиш на команде формы, событие изменения текста в поле ввода и кнопка по умолчанию для клавиши Enter.
Этого хватает почти для любой задачи: быстрый вызов действия с клавиатуры, живой поиск по мере набора, реакция на Enter. Если вы привыкли к keydown из JavaScript, перестраивайтесь: в 1С клавишу привязывают не к форме, а к действию.
Как устроена обработка клавиш в управляемой форме
Нажатие сначала получает клиентское приложение платформы. Часть сочетаний платформа забирает себе: например, F1 открывает справку, Ctrl+F вызывает поиск, Esc закрывает форму или отменяет редактирование. До вашего кода такие нажатия могут не дойти.
Разработчику доступны три точки входа:
- 🎹 Сочетание клавиш команды. Вы назначаете клавишу команде, и при нажатии срабатывает её обработчик.
- ✏️ События поля ввода. Реагируют на изменение текста в процессе набора, а не на конкретную клавишу.
- ↩️ Кнопка по умолчанию. Принимает Enter и запускает привязанную команду.
Код в обработчиках исполняется на клиенте, поэтому процедуры помечайте директивой &НаКлиенте. Обращение к серверу из такого обработчика допустимо, но каждый вызов — это задержка. В событиях, которые срабатывают при наборе, этого лучше не делать.
Если вам нужно именно «код нажатой клавиши», задачу переформулируйте: что должно произойти? Почти всегда ответ укладывается в команду с сочетанием клавиш.
Сочетание клавиш на команде: самый надёжный способ
Это основной способ. Команда формы получает свойство «Сочетание клавиш», и платформа сама следит за нажатием.
Пошаговая настройка
- Откройте форму в конфигураторе, перейдите на вкладку «Команды».
- Добавьте команду и задайте ей имя, например
БыстрыйОтбор. - В свойствах команды найдите «Сочетание клавиш» и нажмите нужную комбинацию прямо в поле.
- Создайте обработчик действия — платформа предложит процедуру на клиенте.
- Перетащите команду на форму (в командную панель или как кнопку), иначе её не будет видно.
Обработчик выглядит так:
&НаКлиенте
Процедура БыстрыйОтбор(Команда)
Элементы.Список.ТекущаяСтрока = Неопределено;
ТекущийЭлемент = Элементы.СтрокаПоиска;
КонецПроцедуры
Команда сработает и тогда, когда фокус стоит в поле ввода, если комбинация не занята самим полем.
Какие комбинации выбирать
Безопаснее всего сочетания с Ctrl или Alt и буквой либо функциональные клавиши. Одиночные буквы и цифры не используйте: они нужны для набора текста.
| Вариант | Когда подходит | Риск |
|---|---|---|
Ctrl + буква | Частое действие в форме | Может совпасть с системной комбинацией платформы |
Alt + буква | Редкие действия | Конфликт с мнемониками меню в веб-клиенте |
F2–F12 | Стандартные действия документов | Браузер перехватывает часть F-клавиш |
Ctrl+Shift + буква | Когда нужна уверенность в отсутствии конфликта | Неудобно набирать одной рукой |
Назначая сочетание, проверьте его в том клиенте, где работают пользователи. Тонкий клиент, веб-клиент и мобильное приложение ведут себя по-разному, особенно с функциональными клавишами.
События полей ввода: реакция на набор текста
Для живого поиска и подсказок нужен не код клавиши, а изменённый текст. У поля ввода есть события, которые приходят до завершения редактирования.
ИзменениеТекстаРедактирования
Событие вызывается, когда пользователь меняет текст в поле. Платформа передаёт в процедуру текущий введённый текст, ещё не записанный в реквизит:
&НаКлиенте
Процедура СтрокаПоискаИзменениеТекстаРедактирования(Элемент, Текст, СтандартнаяОбработка)
Если СтрДлина(Текст) >= 3 Тогда
ПоискТекст = Текст;
ПодключитьОбработчикОжидания("ВыполнитьПоиск", 0.5, Истина);
КонецЕсли;
КонецПроцедуры
Обратите внимание на ожидание в полсекунды. Без него поиск стартует после каждой буквы и форма начинает тормозить. Обработчик ожидания с признаком «однократно» сбрасывает предыдущий запуск: поиск выполнится только после паузы в наборе.
Чтобы событие приходило по мере набора, у поля должно быть включено обновление текста редактирования. Если событие не срабатывает, проверьте это свойство в палитре свойств поля ввода.
ПриИзменении и ОкончаниеВводаТекста
Эти события иначе устроены, и путать их стоит осторожно:
ПриИзменении— значение зафиксировано, пользователь покинул поле или нажал Enter.ОкончаниеВводаТекста— завершён ввод в поле с выбором из списка; здесь формируют данные для подбора.АвтоПодборТекста— вызывается при наборе, чтобы подставить подсказку в выпадающий список.
Для живой подсказки как раз подходит АвтоПодборТекста: вы получаете набранный текст и возвращаете список вариантов, а платформа сама рисует выпадающее меню.
Текстовый документ и поле HTML
В поле форматированного документа и в текстовом документе обычный ввод идёт внутри самого элемента, и события клавиш наружу не выходят. Поле HTML-документа выводит содержимое в отдельный контейнер: отслеживание клавиш там возможно только скриптом внутри самой HTML-страницы, а в 1С вы получите событие нажатия на ссылку или кнопку.
Enter и Esc: кнопка по умолчанию и закрытие формы
Две самые частые клавиши обрабатываются без кода.
Enter. У командной панели формы или группы есть кнопка по умолчанию. Назначьте командой нужную кнопку: свойство «Кнопка по умолчанию» превращает её в целевую для Enter. В диалогах «ОК/Отмена» это стандартный приём.
Esc. В модальных диалогах закрывает окно и возвращает отрицательный результат. Для обычной формы платформа сама решает, закрывать окно или отменить редактирование поля.
Если нужно спросить подтверждение при закрытии, используйте не перехват Esc, а событие формы ПередЗакрытием:
&НаКлиенте
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если Модифицированность И Не ЗавершениеРаботы Тогда
Отказ = Истина;
ПоказатьВопрос(Новый ОписаниеОповещения("ПослеВопроса", ЭтотОбъект),
"Закрыть без сохранения?", РежимДиалогаВопрос.ДаНет);
КонецЕсли;
КонецПроцедуры
Так вы ловите и Esc, и крестик, и Alt+F4, и завершение работы одним обработчиком.
Глобальный перехват: чего платформа не умеет
Запрос «ловить любые клавиши во всём приложении» упирается в ограничения платформы. Подключить обработчик на нажатие любой клавиши во всех формах нельзя.
Что есть вместо этого:
- 🔗 Общая команда с сочетанием клавиш. Добавьте команду в подсистему и задайте ей сочетание. Она будет доступна из интерфейса, где подсистема отображается.
- 📋 Общий модуль форм. Вынесите логику в клиентский общий модуль и вызывайте его из команд каждой нужной формы.
- 🧩 Расширение конфигурации . Добавьте нужную команду с сочетанием клавиш в формы, которые нельзя править в основной конфигурации.
Назначить сочетание клавиш программно, во время работы формы, нельзя: его задают при проектировании в конфигураторе или расширении.
Если задача — следить за клавиатурой пользователя вне 1С (кейлоггер), это не задача платформы. Для таких вещей используют внешние компоненты, и применять их допустимо только с ведома и согласия сотрудников.
Мини-кейс: быстрый поиск по справочнику с клавиатуры
Задача из практики: в форме списка номенклатуры кладовщик хочет нажать одну комбинацию, сразу оказаться в строке поиска и набирать название, не трогая мышь.
Решение собирается из двух механизмов, описанных выше:
- Добавляете в форму списка команду
ПерейтиКПоискус сочетаниемCtrl+Shift+F. ПростойCtrl+Fплатформа занимает под свой поиск, поэтому берём вариант сShift. - В обработчике команды переводите фокус в поле:
ТекущийЭлемент = Элементы.СтрокаПоиска;. - На само поле вешаете
ИзменениеТекстаРедактированияс паузой в полсекунды и отбором списка по введённому тексту.
Получается связка «комбинация, набор, результат» без единой строчки про коды клавиш. Пользователь видит быстрый отклик, а вы не боретесь с ограничениями платформы.
Задайте пользователям понятную подсказку у кнопки: в заголовке команды укажите сочетание в скобках. Иначе о горячей клавише никто не узнает.
Что делать со старыми обычными формами
Всё написанное относится к управляемым формам. Обычные формы толстого клиента устроены иначе, и набор их событий отличается. Если ваша конфигурация ещё работает на обычных формах, сверьтесь со справкой по конкретному элементу формы в конфигураторе. Для новой разработки выбирайте управляемые формы: за ними будущее платформы, и сочетания клавиш там задаются единообразно.
Как проверить, что клавиши работают
Прежде чем отдавать форму в работу, пройдите короткую проверку. Ошибки с клавиатурой всплывают на конкретных рабочих местах, а не у разработчика.
Отдельно проверьте поведение при открытой модальной форме и при фокусе в табличной части: там набор текста и навигация стрелками перехватываются самим элементом, и сочетание может не дойти до команды.
Порядок событий при наборе текста
Когда пользователь печатает в поле ввода, последовательность примерно такая: сначала приходит ИзменениеТекстаРедактирования на каждое изменение текста, затем по завершении набора срабатывает ПриИзменении. Если поле связано со справочником и включён подбор, дополнительно вызываются АвтоПодборТекста и ОкончаниеВводаТекста.
Практический вывод: не дублируйте одну и ту же логику в нескольких событиях. Лёгкую реакцию на набор (фильтр, подсказка) держите в ИзменениеТекстаРедактирования, а запись значения и проверки — в ПриИзменении.
Особенности клиентов: тонкий, веб, мобильный
Один и тот же код ведёт себя по-разному в зависимости от того, как запущено приложение.
| Клиент | Что учесть |
|---|---|
| Тонкий клиент | Сочетания работают предсказуемо, конфликтуют только с клавишами платформы |
| Веб-клиент | Браузер забирает часть комбинаций (Ctrl+T, Ctrl+W, F5, F12); их назначить бесполезно |
| Мобильное приложение | Физической клавиатуры может не быть; не завязывайте функционал на сочетания |
В веб-клиенте дополнительно мешают расширения браузера и переключение раскладки.
Для надёжности продублируйте действие обычной кнопкой на форме. Сочетание клавиш — удобство, а не единственный путь.
Типичные ошибки и способы их решения
Сочетание назначено, но не срабатывает. Проверьте, что команда размещена на форме: команда без элемента не получает клавишу. Затем убедитесь, что комбинация не занята платформой или браузером.
Событие ИзменениеТекстаРедактирования не вызывается. Не включено обновление текста редактирования у поля. Включите его в свойствах поля ввода.
Форма «подвисает» при наборе. В обработчике набора стоит тяжёлый серверный вызов. Добавьте обработчик ожидания с паузой, как в примере выше, и ограничьте минимальную длину строки.
Enter закрывает форму, а должен переходить к следующему полю. Кнопка по умолчанию назначена на «ОК». Уберите это свойство или перенесите его на нужную команду.
Обработчик вызывается дважды. Команда вынесена в командную панель и дублируется кнопкой на форме. Оставьте один способ вызова.
ИзменениеТекстаРедактирования в поле ввода и обработчик ожидания с паузой.АвтоПодборТекста у поля ввода: верните список, платформа покажет его сама.ПередЗакрытием — оно ловит и Esc, и крестик.Частые вопросы
Можно ли узнать код нажатой клавиши в 1С?
Как отловить Enter в поле ввода?
ПриИзменении: оно вызывается при выходе из поля или Enter. Для запуска действия назначьте кнопку по умолчанию.