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