В процессе разработки управляемых форм в 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда стандартные свойства элементов ведут себя неочевидно. Одной из таких проблем является свойство ПропускатьПриВводе (SkipOnInput) для элементов типа Группа. Рассмотрим подробнее, почему это происходит и какими способами можно добиться желаемого поведения формы, чтобы пользователь не «застревал» на заголовках групп при нажатии клавиши Enter или Tab.
Многие разработчики замечают странную особенность: если открыть отладчик и проанализировать свойства элемента типа ГруппаФормы, то в списке доступных параметров можно обнаружить ПропускатьПриВводе. Однако попытка установить его интерактивно в конфигураторе заканчивается неудачей — этого свойства просто нет в палитре свойств. Попытка программной установки Элементы.Группа1.ПропускатьПриВводе = Истина также не приносит результата: платформа либо игнорирует команду, либо это не влияет на поведение фокуса.
Выясним причину этого явления. В архитектуре управляемого приложения 1С все элементы формы наследуются от базового класса УправляемыйЭлементФормы. Свойство ПропускатьПриВводе определено именно в этом базовом классе. Поскольку ГруппаФормы является его потомком, технически она содержит это свойство «внутри» своего программного объекта. Однако на уровне графического ядра платформы обработчик этого свойства для групп просто не реализован. Разработчики платформы исходят из логики, что группа — это логический контейнер, а не элемент ввода данных, поэтому управление пропуском для неё не предусмотрено стандартным механизмом.
Проблема становится критичной, когда мы используем специфические виды групп:
В этих случаях при последовательном обходе полей формы клавишей Enter фокус неожиданно останавливается на «пустом» месте — заголовке группы. Пользователю приходится нажимать клавишу еще раз, что замедляет массовый ввод данных и вызывает раздражение.
Самый правильный и «чистый» метод решения проблемы без написания программного кода — это использование штатного инструмента конфигуратора. Разберем по шагам, как это сделать:
Важный нюанс: Ручной порядок обхода требует поддержки при добавлении новых элементов на форму. Если вы добавите новое поле, оно может оказаться в самом конце очереди, и вам придется снова заходить в этот редактор.
Если нам нужно более гибкое решение, проанализируем ситуацию программно. Мы можем перехватить момент, когда фокус попадает на группу, и мгновенно перебросить его дальше. Для этого используется свойство формы ТекущийЭлемент.
Предположим, у нас есть ГруппаГруз, которую нужно пропустить. Мы можем использовать обработчик события ПриАктивизации для элемента, который стоит в очереди перед группой, или использовать общую логику формы.
Рассмотрим пример реализации:
&НаКлиенте
Процедура ПриАктивизацииЭлемента(Элемент)
Если Элемент = Элементы.ГруппаГруз Тогда
// Перебрасываем фокус на следующее осмысленное поле
ТекущийЭлемент = Элементы.НоменклатураГруза;
КонецЕсли;
КонецПроцедуры
Этот метод работает мгновенно и незаметно для пользователя, создавая эффект того, что группа действительно пропускается при вводе.
В некоторых случаях мы можем ограничить интерактивность группы целиком. Если установить свойство Доступность = Ложь для группы, она и все её дочерние элементы будут исключены из обхода. Однако это часто не подходит, так как поля внутри группы должны оставаться редактируемыми.
Более тонкий вариант — использование свойства ТолькоПросмотр. Для некоторых типов групп в последних версиях платформы 8.3 установка Группа.ТолькоПросмотр = Истина позволяет оставить вложенные элементы доступными для редактирования, но исключает заголовок группы из цепочки навигации клавишей Tab.
Рассмотрим ситуацию, описанную в сообщениях форума, где предлагается использовать WScript.Shell для имитации нажатия клавиши Tab. Мы проанализируем этот метод, но настоятельно не рекомендуем использовать его в современных конфигурациях.
&НаКлиенте
Процедура ОбработкаОжиданияПропуска()
Если ТекущийЭлемент = Элементы.ГруппаГруз Тогда
Shell = Новый COMОбъект("WScript.Shell");
Shell.SendKeys("{TAB}");
КонецЕсли;
КонецПроцедуры
Почему это плохое решение:
Проанализировав все возможности, мы можем сделать следующие выводы:
ПропускатьПриВводе для групп является фантомным: оно существует в объекте, но не поддерживается платформой.ТекущийЭлемент в коде на встроенном языке 1С.Помните, что удобство интерфейса (UX) складывается из таких мелочей. Правильно настроенная навигация по полям ввода позволяет пользователям работать с программой гораздо быстрее и эффективнее.