Как перехватить нажатие Enter в поле ввода 1С:Предприятие 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При проектировании интерфейсов в управляемом приложении 1С:Предприятие 8.3 разработчики часто сталкиваются со стандартным поведением платформы: при нажатии клавиши Enter в поле ввода фокус автоматически переходит на следующий элемент формы (аналогично поведению клавиши Tab). Это удобно для быстрого заполнения последовательных реквизитов, но создает проблемы, если вам необходимо обработать введенные данные (например, при поиске, сканировании штрихкодов или заполнении табличной части) и оставить курсор в том же поле ввода.

В этой статье мы подробно разберем, как обойти это ограничение платформы. Рассмотрим несколько альтернативных вариантов решения задачи — от простых «лайфхаков» со свойствами элементов до использования штатных механизмов формы.

Решение 1. Трюк с многострочным режимом поля ввода

Это один из самых популярных и простых в реализации обходных путей (так называемых «лайфхаков»). Его суть заключается в том, что в многострочном текстовом поле клавиша Enter по умолчанию отвечает за перевод строки, а не за переход к следующему элементу формы. Мы можем использовать это поведение в своих целях.

Выполним настройку по шагам:

  1. Откроем палитру свойств нужного поля ввода в конфигураторе.
  2. Установим свойство МногострочныйРежим (Multiline) в значение Истина.
  3. Для того чтобы поле визуально не отличалось от обычного однострочного, установим свойство Высота в значение 1.
  4. Свойство РастягиватьПоВертикали установим в значение Ложь.

Теперь при нажатии клавиши Enter фокус будет оставаться внутри поля, но в конец строки запишется невидимый символ перевода строки (символ возврата каретки). Нам необходимо перехватить его появление, обработать данные и очистить строку от лишних спецсимволов. Для этого напишем обработчик события ПриИзменении:


&НаКлиенте
Процедура ИмяПоляПриИзменении(Элемент)
    
    // Проверяем наличие символа переноса строки
    Если Найти(Объект.ИмяРеквизитаСтрока, Символы.ПС) > 0 Тогда
        
        // Удаляем символ переноса строки, чтобы текст оставался корректным
        Объект.ИмяРеквизитаСтрока = СтрЗаменить(Объект.ИмяРеквизитаСтрока, Символы.ПС, "");
        Объект.ИмяРеквизитаСтрока = СокрЛП(Объект.ИмяРеквизитаСтрока);
        
        // Вызываем процедуру обработки введенных данных
        ОбработатьВводДанных();
        
    КонецЕсли;
    
КонецПроцедуры

Преимущества метода: Фокус гарантированно никуда не перескакивает, решение работает стабильно и не требует сложных алгоритмов.

Недостатки: Подходит только для реквизитов с типом данных Строка. Если реквизит числовой или ссылочный, этот метод применить напрямую не удастся.

Решение 2. Использование штатного поведения клавиши Enter на форме

Мало кто знает, но в платформе 1С предусмотрен встроенный механизм переопределения клавиши Enter для всей управляемой формы. Мы можем заставить платформу выполнять определенную команду вместо перехода по элементам.

Разберем данный алгоритм:

  1. Перейдем в свойства самой управляемой формы.
  2. Найдем параметр ПоведениеКлавишиEnter (EnterKeyBehavior) и заменим стандартное значение «Переход по элементам» на значение Кнопка по умолчанию.
  3. Создадим новую команду формы (например, КомандаEnter) и вынесем ее на форму в виде кнопки.
  4. В свойствах созданной кнопки установим признак КнопкаПоУмолчанию в значение Истина.
  5. Чтобы кнопка не загромождала интерфейс, мы можем поместить ее в скрытую группу или сделать ее размер минимальным (но не устанавливайте свойство Видимость = Ложь, иначе кнопка перестанет реагировать на горячие клавиши).

Теперь при нажатии Enter в любом месте формы будет срабатывать наша команда. Напишем код обработчика действия:


&НаКлиенте
Процедура КомандаEnter(Команда)
    
    ТекущийКонтрол = ЭтаФорма.ТекущийЭлемент;
    
    // Проверяем, в каком именно поле ввода находился пользователь
    Если ТекущийКонтрол.Имя = "ИмяВашегоПоляВвода" Тогда
        
        // Выполняем полезную работу
        ОбработатьВводДанных();
        
        // Принудительно возвращаем фокус (на всякий случай)
        ЭтаФорма.ТекущийЭлемент = ТекущийКонтрол;
        
    КонецЕсли;
    
КонецПроцедуры

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

Решение 3. Использование события «ОкончаниеВводаТекста»

Еще один вариант — задействовать специализированное событие поля ввода ОкончаниеВводаТекста. Оно генерируется в тот момент, когда пользователь закончил редактирование (в том числе нажав клавишу Enter).

Посмотрим на пример реализации данного обработчика:


&НаКлиенте
Процедура ПолеВводаОкончаниеВводаТекста(Элемент, Текст, ДанныеВыбора, ПараметрыПолученияДанных, СтандартнаяОбработка)
    
    // Отменяем стандартный переход фокуса и вызов системного списка выбора
    СтандартнаяОбработка = Ложь;
    
    // Выполняем нужную нам бизнес-логику
    ОбработатьВведенныйТекст(Текст);
    
    // Явно удерживаем фокус на текущем элементе
    ЭтаФорма.ТекущийЭлемент = Элемент;
    
КонецПроцедуры

Важный нюанс: Чтобы избежать появления всплывающих системных подсказок («облака» автоподбора) при установке параметра СтандартнаяОбработка = Ложь, рекомендуется у самого поля ввода отключить свойства КнопкаВыбора и БыстрыйВыбор в конфигураторе.

Решение 4. Возврат фокуса через обработчик ожидания

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

Код в модуле формы будет выглядеть следующим образом:


&НаКлиенте
Процедура ПолеВводаПриИзменении(Элемент)
    
    // Подключаем однократный обработчик с минимальной задержкой в 0.1 секунды
    ПодключитьОбработчикОжидания("ВозвратФокусаНазад", 0.1, Истина);
    
    // Выполнение логики изменения данных...
    ОбработатьДанные();
    
КонецПроцедуры

&НаКлиенте
Процедура ВозвратФокусаНазад()
    
    // Возвращаем фокус на поле ввода
    ЭтаФорма.ТекущийЭлемент = Элементы.ИмяВашегоПоляВвода;
    
КонецПроцедуры

Внимание! Предупреждение: Этот способ имеет критический недостаток. Если пользователь решит покинуть поле ввода штатным образом (например, кликнув мышкой на другое поле), все равно сработает событие ПриИзменении, запустится обработчик ожидания и принудительно «засосет» фокус обратно. Пользователь окажется в своего рода интерфейсной «ловушке». Используйте этот метод с осторожностью.

Решение 5. Для веб-интерфейсов и сложных UI: Поле HTML-документа

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

Резюме: какой метод выбрать?

← На главную