При проектировании интерфейсов в управляемом приложении 1С:Предприятие 8.3 разработчики часто сталкиваются со стандартным поведением платформы: при нажатии клавиши Enter в поле ввода фокус автоматически переходит на следующий элемент формы (аналогично поведению клавиши Tab). Это удобно для быстрого заполнения последовательных реквизитов, но создает проблемы, если вам необходимо обработать введенные данные (например, при поиске, сканировании штрихкодов или заполнении табличной части) и оставить курсор в том же поле ввода.
В этой статье мы подробно разберем, как обойти это ограничение платформы. Рассмотрим несколько альтернативных вариантов решения задачи — от простых «лайфхаков» со свойствами элементов до использования штатных механизмов формы.
Это один из самых популярных и простых в реализации обходных путей (так называемых «лайфхаков»). Его суть заключается в том, что в многострочном текстовом поле клавиша Enter по умолчанию отвечает за перевод строки, а не за переход к следующему элементу формы. Мы можем использовать это поведение в своих целях.
Выполним настройку по шагам:
Истина.1.Ложь.Теперь при нажатии клавиши Enter фокус будет оставаться внутри поля, но в конец строки запишется невидимый символ перевода строки (символ возврата каретки). Нам необходимо перехватить его появление, обработать данные и очистить строку от лишних спецсимволов. Для этого напишем обработчик события ПриИзменении:
&НаКлиенте
Процедура ИмяПоляПриИзменении(Элемент)
// Проверяем наличие символа переноса строки
Если Найти(Объект.ИмяРеквизитаСтрока, Символы.ПС) > 0 Тогда
// Удаляем символ переноса строки, чтобы текст оставался корректным
Объект.ИмяРеквизитаСтрока = СтрЗаменить(Объект.ИмяРеквизитаСтрока, Символы.ПС, "");
Объект.ИмяРеквизитаСтрока = СокрЛП(Объект.ИмяРеквизитаСтрока);
// Вызываем процедуру обработки введенных данных
ОбработатьВводДанных();
КонецЕсли;
КонецПроцедуры
Преимущества метода: Фокус гарантированно никуда не перескакивает, решение работает стабильно и не требует сложных алгоритмов.
Недостатки: Подходит только для реквизитов с типом данных Строка. Если реквизит числовой или ссылочный, этот метод применить напрямую не удастся.
Мало кто знает, но в платформе 1С предусмотрен встроенный механизм переопределения клавиши Enter для всей управляемой формы. Мы можем заставить платформу выполнять определенную команду вместо перехода по элементам.
Разберем данный алгоритм:
КомандаEnter) и вынесем ее на форму в виде кнопки.Истина.Видимость = Ложь, иначе кнопка перестанет реагировать на горячие клавиши).Теперь при нажатии Enter в любом месте формы будет срабатывать наша команда. Напишем код обработчика действия:
&НаКлиенте
Процедура КомандаEnter(Команда)
ТекущийКонтрол = ЭтаФорма.ТекущийЭлемент;
// Проверяем, в каком именно поле ввода находился пользователь
Если ТекущийКонтрол.Имя = "ИмяВашегоПоляВвода" Тогда
// Выполняем полезную работу
ОбработатьВводДанных();
// Принудительно возвращаем фокус (на всякий случай)
ЭтаФорма.ТекущийЭлемент = ТекущийКонтрол;
КонецЕсли;
КонецПроцедуры
Этот способ является наиболее «чистым» с точки зрения стандартов разработки 1С, так как использует штатный функционал платформы без манипуляций со строками.
Еще один вариант — задействовать специализированное событие поля ввода ОкончаниеВводаТекста. Оно генерируется в тот момент, когда пользователь закончил редактирование (в том числе нажав клавишу Enter).
Посмотрим на пример реализации данного обработчика:
&НаКлиенте
Процедура ПолеВводаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
// Отменяем стандартный переход фокуса и вызов системного списка выбора
СтандартнаяОбработка = Ложь;
// Выполняем нужную нам бизнес-логику
ОбработатьВведенныйТекст(Текст);
// Явно удерживаем фокус на текущем элементе
ЭтаФорма.ТекущийЭлемент = Элемент;
КонецПроцедуры
Важный нюанс: Чтобы избежать появления всплывающих системных подсказок («облака» автоподбора) при установке параметра СтандартнаяОбработка = Ложь, рекомендуется у самого поля ввода отключить свойства КнопкаВыбора и БыстрыйВыбор в конфигураторе.
Проанализируем метод с использованием однократного обработчика ожидания. Суть метода заключается в том, что при изменении поля ввода мы регистрируем фоновое событие, которое мгновенно возвращает фокус обратно на исходный элемент.
Код в модуле формы будет выглядеть следующим образом:
&НаКлиенте
Процедура ПолеВводаПриИзменении(Элемент)
// Подключаем однократный обработчик с минимальной задержкой в 0.1 секунды
ПодключитьОбработчикОжидания("ВозвратФокусаНазад", 0.1, Истина);
// Выполнение логики изменения данных...
ОбработатьДанные();
КонецПроцедуры
&НаКлиенте
Процедура ВозвратФокусаНазад()
// Возвращаем фокус на поле ввода
ЭтаФорма.ТекущийЭлемент = Элементы.ИмяВашегоПоляВвода;
КонецПроцедуры
Внимание! Предупреждение: Этот способ имеет критический недостаток. Если пользователь решит покинуть поле ввода штатным образом (например, кликнув мышкой на другое поле), все равно сработает событие ПриИзменении, запустится обработчик ожидания и принудительно «засосет» фокус обратно. Пользователь окажется в своего рода интерфейсной «ловушке». Используйте этот метод с осторожностью.
Если ваша задача требует абсолютного и беспрецедентного контроля над клавиатурой (например, при разработке специализированных рабочих мест кассиров или кладовщиков под тонкий/веб-клиент), вы можете использовать элемент управления Поле HTML-документа.
Внутри HTML-кода разметки создается стандартный тег ввода, а обработка нажатий клавиш полностью перехватывается с помощью JavaScript:
document.getElementById("barcodeInput").addEventListener("keydown", function(event) {
if (event.key === "Enter") {
event.preventDefault(); // Полностью блокируем стандартное поведение браузера
let value = event.target.value;
// Передаем данные обратно в 1С через схему оповещения
window.location.href = "v8action://EnterPressed?Value=" + encodeURIComponent(value);
}
});
В самой платформе 1С перехват события из HTML-поля осуществляется через обработчик ПриНажатии поля HTML-документа, где вы можете проанализировать переданный URL и выполнить код 1С.