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