Как сделать активным элемент формы в 1С при нажатии Enter и двойном клике мышью

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

Разберем распространенную ситуацию при работе с обычными формами платформы 1С:Предприятие 8 (на примере 1С:Управление торговлей 10.3). Очень часто при выборе строки в табличном поле требуется автоматически передать фокус ввода на другой элемент формы — например, в реквизит СуммаПоКарте.

Разработчики часто сталкиваются с проблемой: если прописать активацию элемента напрямую через свойство ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СуммаПоКарте; в событии Выбор, код корректно отрабатывает при двойном клике мышью, но не срабатывает при выборе строки клавишей Enter.

Выясним причину поведения платформы

Проанализируем механику работы обычных форм 1С при нажатии клавиши Enter в табличном поле:

  1. При нажатии Enter платформа сначала вызывает событие Выбор.
  2. Внутри этого события процедура выполняет код ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СуммаПоКарте; и фокус действительно переносится.
  3. Однако сразу после завершения процедуры платформа отрабатывает свой внутренний сценарий нажатия клавиши Enter (переход в режим редактирования ячейки или смену элемента по порядку обхода) и сбрасывает фокус обратно на табличное поле.

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

Способ 1. Отмена стандартной обработки в событии Выбор

Наиболее эффективный способ — отменить встроенный сценарий платформы по обработке клавиши Enter с помощью параметра СтандартнаяОбработка.

Рассмотрим пример кода в обработчике события Выбор табличного поля:


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

Установка СтандартнаяОбработка = Ложь; блокирует последующий сброс фокуса платформой. В результате элемент СуммаПоКарте станет активным как при нажатии Enter, так и при двойном клике мышью.

Способ 2. Использование асинхронного обработчика ожидания

Если в вашей логике отменять стандартную обработку выбора нежелательно, перенос фокуса можно выполнить асинхронно — сразу после того, как платформа полностью завершит отработку Enter.

Разберем по шагам реализацию данного варианта:

Шаг 1. В обработчике события Выбор подключаем однократный обработчик ожидания с минимальной задержкой:


Процедура ТаблицаЗначений1Выбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
	
	// Подключаем однократный обработчик ожидания (интервал 0.1 секунды)
	ПодключитьОбработчикОжидания("АктивизироватьСумму", 0.1, Истина);
	
КонецПроцедуры

Шаг 2. В модуле формы создаем экспортную процедуру АктивизироватьСумму:


Процедура АктивизироватьСумму() Экспорт
	
	ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.СуммаПоКарте;
	
КонецПроцедуры

При таком подходе платформа сначала завершает свои внутренние операции по кнопке Enter, а через 0.1 секунды вызывается процедура, которая гарантированно активизирует нужный реквизит.

Дополнительные настройки элементов формы

При настройке поведения формы также проанализируем следующие свойства элементов:

  1. Режим редактирования колонки: В свойствах колонок табличного поля проверьте параметр РежимРедактирования (значения: Непосредственно, ВходПриВводе, Вход). Это помогает скорректировать поведение ячейки при вводе данных.
  2. Кнопка по умолчанию: Если при выборе из таблицы должно срабатывать главное действие формы, для соответствующей кнопки можно установить свойство КнопкаПоУмолчанию = Истина.
  3. Порядок обхода: Проверьте настройку порядка обхода элементов формы (меню Форма -> Порядок обхода), чтобы переход по клавише Tab и Enter между элементами был последовательным и удобным для пользователя.
← На главную