В процессе разработки интерфейсов на платформе 1С:Предприятие часто возникает задача перехвата нажатия клавиши Enter. Типичный сценарий: на форме расположено единственное поле ввода (например, для ввода суммы или штрихкода), и пользователю удобнее нажать Enter для подтверждения действия, не переключая фокус на кнопки. Однако стандартные события, такие как ПриИзменении или ОкончаниеВводаТекста, могут не срабатывать, если значение в поле не редактировалось или фокусу просто «некуда уйти» с единственного элемента.
В данной статье мы разберем несколько эффективных способов решения этой задачи, начиная от штатных настроек платформы и заканчивая продвинутыми программными методами, использующими недокументированные возможности системы.
Прежде чем прибегать к сложному кодированию, проанализируем возможности, которые предоставляет сама платформа 8.3 для управляемых форм. У объекта УправляемаяФорма есть два ключевых свойства, которые определяют логику работы клавиши Enter. Для быстрого анализа и настройки этих свойств в пользовательском сеансе можно использовать инструмент для редактирования свойств форм в режиме предприятия.
Поведение клавиши Enter. Это свойство может принимать значения «Переход по элементам» или «Кнопка по умолчанию». Если мы установим значение «Кнопка по умолчанию», нажатие Enter в любом поле формы будет инициировать нажатие основной кнопки. Чтобы этот механизм заработал, необходимо выбрать конкретную кнопку в свойстве формы КнопкаПоУмолчанию.
Рассмотрим пошаговый алгоритм настройки:
ПоведениеКлавишиEnter в положение КнопкаПоУмолчанию.КнопкаПоУмолчанию выберем команду (кнопку), которая должна выполняться при нажатии Enter (например, «ОК» или «Записать»).Такой подход идеально работает в простых формах, где нет табличных частей, так как в таблицах Enter традиционно служит для входа в режим редактирования ячейки.
Бывают ситуации, когда стандартное поведение формы нас не устраивает — например, нам нужно, чтобы Enter срабатывал только в определенном контексте или кнопка должна быть скрыта. В этом случае воспользуемся «хитрым» методом программного формирования объекта СочетаниеКлавиш.
Платформа 1С не позволяет напрямую выбрать одиночный Enter в конфигураторе как сочетание клавиш для кнопки. Однако мы можем обойти это ограничение, используя метод ЗначениеИзСтрокиВнутр. Рассмотрим код функции, которая генерирует нужное нам сочетание:
&НаКлиенте
Функция ПолучитьСочетаниеКлавишEnter()
// Внутренний идентификатор объекта СочетаниеКлавиш с кодом 13 (Enter)
Возврат ЗначениеИзСтрокиВнутр("{""#"",69cf4251-8759-11d5-bf7e-0050bae2bc79,1, |{0,13,0} |}");
КонецФункции
Теперь выясним, как применить это на практике при открытии формы. Мы создадим кнопку (она может быть даже невидимой или находиться в скрытой командной панели) и назначим ей это сочетание:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Находим кнопку на форме и назначаем ей горячую клавишу
Элементы.ГруппаКомандыФормыВыполнить.СочетаниеКлавиш = ПолучитьСочетаниеКлавишEnter();
КонецПроцедуры
&НаКлиенте
Процедура КомандаВыполнить(Команда)
// Здесь описываем логику, которая сработает по нажатию Enter
Сообщить("Клавиша Enter успешно обработана!");
КонецПроцедуры
Важное примечание: Этот метод работает как в обычных, так и в управляемых формах (с небольшими корректировками обращения к элементам). Однако стоит помнить, что в мобильном приложении или веб-клиенте поведение может отличаться из-за ограничений среды исполнения.
Проанализируем ситуацию, когда нам нужно гарантированно закрыть форму или провести документ сразу после ввода текста, но событие ОкончаниеВводаТекста срабатывает нестабильно. В таких случаях можно использовать «костыль» в виде обработчика ожидания. Это позволяет системе «переварить» ввод данных и корректно завершить все внутренние процессы перед выполнением целевого действия.
Разберем пример кода для поля ввода:
&НаКлиенте
Процедура ПолеВводаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Запускаем обработчик с минимальной задержкой
ПодключитьОбработчикОжидания("ВыполнитьДействиеПослеВвода", 0.1, Истина);
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьДействиеПослеВвода()
// Логика завершения работы с формой
ЭтаФорма.Закрыть(ЗначениеПоляВвода);
КонецПроцедуры
Использование ПодключитьОбработчикОжидания с параметром Истина (однократно) гарантирует, что действие выполнится один раз сразу после того, как интерфейсный поток освободится.
Если вы работаете исключительно в управляемом приложении, можно применить более элегантный визуальный метод. Выясним, как использовать элементы типа Декорация. У декорации-гиперссылки также есть свойство СочетаниеКлавиш.
Преимущество этого метода в том, что декорация практически не занимает места на форме, если у нее очищен заголовок. Вы можете разместить такую «точку» в углу формы, назначить ей действие и через код (как показано выше) присвоить ей Enter. Это позволяет избежать нагромождения лишних кнопок в интерфейсе, сохраняя при этом функциональность «горячих клавиш». Для упрощения программного создания элементов и команд на форме можно использовать модуль для динамического изменения форм.
При реализации обработки Enter всегда учитывайте следующие моменты:
МногострочныйРежим клавиша Enter всегда будет служить для переноса строки, и перехватить ее вышеописанными методами без потери основной функции поля не получится.ЗначениеИзСтрокиВнутр могут требовать проверки на конкретной сборке, так как структура внутренних строк может незначительно меняться.Подводя итог, можно сказать, что для большинства бизнес-задач достаточно правильно настроить Кнопку по умолчанию. В специфических интерфейсах (например, рабочее место кассира или складской терминал) программное назначение сочетания клавиш через ЗначениеИзСтрокиВнутр остается самым мощным и надежным инструментом в руках разработчика 1С.