Перехват клавиатуры в управляемой форме 1С: что можно, а что нельзя

· 9 мин

Содержание

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

Этого хватает почти для любой задачи: быстрый вызов действия с клавиатуры, живой поиск по мере набора, реакция на Enter. Если вы привыкли к keydown из JavaScript, перестраивайтесь: в 1С клавишу привязывают не к форме, а к действию.

Как устроена обработка клавиш в управляемой форме

Нажатие сначала получает клиентское приложение платформы. Часть сочетаний платформа забирает себе: например, F1 открывает справку, Ctrl+F вызывает поиск, Esc закрывает форму или отменяет редактирование. До вашего кода такие нажатия могут не дойти.

Разработчику доступны три точки входа:

  • 🎹 Сочетание клавиш команды. Вы назначаете клавишу команде, и при нажатии срабатывает её обработчик.
  • ✏️ События поля ввода. Реагируют на изменение текста в процессе набора, а не на конкретную клавишу.
  • ↩️ Кнопка по умолчанию. Принимает Enter и запускает привязанную команду.

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

Если вам нужно именно «код нажатой клавиши», задачу переформулируйте: что должно произойти? Почти всегда ответ укладывается в команду с сочетанием клавиш.

Сочетание клавиш на команде: самый надёжный способ

Это основной способ. Команда формы получает свойство «Сочетание клавиш», и платформа сама следит за нажатием.

Пошаговая настройка

  1. Откройте форму в конфигураторе, перейдите на вкладку «Команды».
  2. Добавьте команду и задайте ей имя, например БыстрыйОтбор.
  3. В свойствах команды найдите «Сочетание клавиш» и нажмите нужную комбинацию прямо в поле.
  4. Создайте обработчик действия — платформа предложит процедуру на клиенте.
  5. Перетащите команду на форму (в командную панель или как кнопку), иначе её не будет видно.

Обработчик выглядит так:

&НаКлиенте
Процедура БыстрыйОтбор(Команда)
	Элементы.Список.ТекущаяСтрока = Неопределено;
	ТекущийЭлемент = Элементы.СтрокаПоиска;
КонецПроцедуры

Команда сработает и тогда, когда фокус стоит в поле ввода, если комбинация не занята самим полем.

Какие комбинации выбирать

Безопаснее всего сочетания с 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С (кейлоггер), это не задача платформы. Для таких вещей используют внешние компоненты, и применять их допустимо только с ведома и согласия сотрудников.

Мини-кейс: быстрый поиск по справочнику с клавиатуры

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

Решение собирается из двух механизмов, описанных выше:

  1. Добавляете в форму списка команду ПерейтиКПоиску с сочетанием Ctrl+Shift+F. Простой Ctrl+F платформа занимает под свой поиск, поэтому берём вариант с Shift.
  2. В обработчике команды переводите фокус в поле: ТекущийЭлемент = Элементы.СтрокаПоиска;.
  3. На само поле вешаете ИзменениеТекстаРедактирования с паузой в полсекунды и отбором списка по введённому тексту.

Получается связка «комбинация, набор, результат» без единой строчки про коды клавиш. Пользователь видит быстрый отклик, а вы не боретесь с ограничениями платформы.

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

Что делать со старыми обычными формами

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

Как проверить, что клавиши работают

Прежде чем отдавать форму в работу, пройдите короткую проверку. Ошибки с клавиатурой всплывают на конкретных рабочих местах, а не у разработчика.

Проверка горячих клавиш перед выпуском
Выполнено: 0 / 7

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

Порядок событий при наборе текста

Когда пользователь печатает в поле ввода, последовательность примерно такая: сначала приходит ИзменениеТекстаРедактирования на каждое изменение текста, затем по завершении набора срабатывает ПриИзменении. Если поле связано со справочником и включён подбор, дополнительно вызываются АвтоПодборТекста и ОкончаниеВводаТекста.

Практический вывод: не дублируйте одну и ту же логику в нескольких событиях. Лёгкую реакцию на набор (фильтр, подсказка) держите в ИзменениеТекстаРедактирования, а запись значения и проверки — в ПриИзменении.

Особенности клиентов: тонкий, веб, мобильный

Один и тот же код ведёт себя по-разному в зависимости от того, как запущено приложение.

КлиентЧто учесть
Тонкий клиентСочетания работают предсказуемо, конфликтуют только с клавишами платформы
Веб-клиентБраузер забирает часть комбинаций (Ctrl+T, Ctrl+W, F5, F12); их назначить бесполезно
Мобильное приложениеФизической клавиатуры может не быть; не завязывайте функционал на сочетания

В веб-клиенте дополнительно мешают расширения браузера и переключение раскладки.

Для надёжности продублируйте действие обычной кнопкой на форме. Сочетание клавиш — удобство, а не единственный путь.

Типичные ошибки и способы их решения

Сочетание назначено, но не срабатывает. Проверьте, что команда размещена на форме: команда без элемента не получает клавишу. Затем убедитесь, что комбинация не занята платформой или браузером.

Событие ИзменениеТекстаРедактирования не вызывается. Не включено обновление текста редактирования у поля. Включите его в свойствах поля ввода.

Форма «подвисает» при наборе. В обработчике набора стоит тяжёлый серверный вызов. Добавьте обработчик ожидания с паузой, как в примере выше, и ограничьте минимальную длину строки.

Enter закрывает форму, а должен переходить к следующему полю. Кнопка по умолчанию назначена на «ОК». Уберите это свойство или перенесите его на нужную команду.

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

Какая задача у вас?

Частые вопросы

Можно ли узнать код нажатой клавиши в 1С?
Нет. В управляемой форме платформа не передаёт код клавиши. Назначьте клавишу команде или реагируйте на текст в поле ввода.
Как отловить Enter в поле ввода?
Если нужно значение после ввода, используйте ПриИзменении: оно вызывается при выходе из поля или Enter. Для запуска действия назначьте кнопку по умолчанию.
Работают ли сочетания клавиш в веб-клиенте?
Работают, но браузер резервирует часть комбинаций. Тестируйте в том браузере, который используют на работе.
Можно ли задать горячую клавишу из кода во время работы?
Нет. Сочетание клавиш фиксируется при проектировании в конфигураторе или расширении.
Как поймать клавишу на всей форме, а не в одном поле?
Через команду формы с сочетанием клавиш: она срабатывает, пока открыта форма и фокус не поглощён полем.