Разберем распространенную ситуацию при работе с обычными формами платформы 1С:Предприятие 8 (на примере 1С:Управление торговлей 10.3). Очень часто при выборе строки в табличном поле требуется автоматически передать фокус ввода на другой элемент формы — например, в реквизит СуммаПоКарте.
Разработчики часто сталкиваются с проблемой: если прописать активацию элемента напрямую через свойство ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СуммаПоКарте; в событии Выбор, код корректно отрабатывает при двойном клике мышью, но не срабатывает при выборе строки клавишей Enter.
Проанализируем механику работы обычных форм 1С при нажатии клавиши Enter в табличном поле:
Выбор.ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СуммаПоКарте; и фокус действительно переносится.При клике мышью внутреннего перехвата фокуса платформой не происходит, поэтому перенос фокуса работает штатно. Для решения проблемы с клавишей Enter разберем два надежных способа.
Наиболее эффективный способ — отменить встроенный сценарий платформы по обработке клавиши Enter с помощью параметра СтандартнаяОбработка.
Рассмотрим пример кода в обработчике события Выбор табличного поля:
Процедура ТаблицаЗначений1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
// Отключаем стандартную обработку платформы
СтандартнаяОбработка = Ложь;
// Переводим фокус на нужный элемент формы
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СуммаПоКарте;
КонецПроцедуры
Установка СтандартнаяОбработка = Ложь; блокирует последующий сброс фокуса платформой. В результате элемент СуммаПоКарте станет активным как при нажатии Enter, так и при двойном клике мышью.
Если в вашей логике отменять стандартную обработку выбора нежелательно, перенос фокуса можно выполнить асинхронно — сразу после того, как платформа полностью завершит отработку Enter.
Разберем по шагам реализацию данного варианта:
Шаг 1. В обработчике события Выбор подключаем однократный обработчик ожидания с минимальной задержкой:
Процедура ТаблицаЗначений1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
// Подключаем однократный обработчик ожидания (интервал 0.1 секунды)
ПодключитьОбработчикОжидания("АктивизироватьСумму", 0.1, Истина);
КонецПроцедуры
Шаг 2. В модуле формы создаем экспортную процедуру АктивизироватьСумму:
Процедура АктивизироватьСумму() Экспорт
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СуммаПоКарте;
КонецПроцедуры
При таком подходе платформа сначала завершает свои внутренние операции по кнопке Enter, а через 0.1 секунды вызывается процедура, которая гарантированно активизирует нужный реквизит.
При настройке поведения формы также проанализируем следующие свойства элементов:
РежимРедактирования (значения: Непосредственно, ВходПриВводе, Вход). Это помогает скорректировать поведение ячейки при вводе данных.КнопкаПоУмолчанию = Истина.Форма -> Порядок обхода), чтобы переход по клавише Tab и Enter между элементами был последовательным и удобным для пользователя.