Как программно сделать активной конкретную кнопку на управляемой форме?

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

При разработке интерфейсов на управляемых формах 1С программисты часто сталкиваются с необходимостью управлять фокусом ввода. Одной из неочевидных проблем является попытка программно активировать конкретную кнопку, расположенную на командной панели. В этой статье мы подробно разберем, почему стандартный метод присвоения значения свойству ТекущийЭлемент может не срабатывать, и какие существуют способы решения этой задачи.

Анализ проблемы: почему фокус «улетает» на первую кнопку

Рассмотрим стандартную ситуацию. У нас есть управляемая форма, на ней расположена Командная панель с несколькими кнопками. Нам нужно, чтобы при выполнении определенного условия (например, после заполнения поля или нажатия другой кнопки) фокус ввода переместился на конкретную кнопку, допустим, ФормаКомандаЗапустить.

Типичный код, который пишет разработчик, выглядит следующим образом:


&НаКлиенте
Процедура ПослеВыполненияДействия()
    // Пытаемся установить фокус на нужную кнопку
    ЭтаФорма.ТекущийЭлемент = Элементы.ФормаКомандаЗапустить;
КонецПроцедуры

Проанализируем ситуацию в отладчике. Мы увидим, что свойство Элементы.ФормаКомандаЗапустить имеет правильный тип КнопкаФормы. Однако после выполнения строки присваивания значение ЭтаФорма.ТекущийЭлемент либо не меняется, либо (что чаще случается в командных панелях) активной становится самая первая кнопка в списке, даже если мы указывали третью или четвертую.

Выясним причину такого поведения. В управляемом интерфейсе элемент Командная панель (и некоторые другие системные группы) воспринимается платформой как единый блок-контейнер. Когда мы пытаемся передать фокус на кнопку внутри такой панели, платформа сначала передает фокус самой панели. А по внутренним правилам отрисовки интерфейса «1С:Предприятие», при получении фокуса командной панелью он автоматически делегируется первому доступному, видимому и активному элементу внутри неё. Именно поэтому наши попытки программно «перепрыгнуть» через первую кнопку игнорируются.

Решение №1: Замена «Командной панели» на «Обычную группу»

Это самый эффективный и рекомендуемый способ, если вам критически важно управлять фокусом. Рассмотрим алгоритм действий по шагам:

  1. Откройте редактор управляемой формы.
  2. Найдите элемент Командная панель, в которой находятся ваши кнопки.
  3. Создайте новый элемент формы с типом Группа - Обычная группа.
  4. В свойствах новой группы установите Вид — «Обычная группа без отображения» или «Группа кнопок».
  5. Установите Группировка — «Горизонтальная, если возможно».
  6. Перенесите все кнопки из старой командной панели в новую группу.
  7. Удалите (или скройте) старую командную панель.

Разберем, почему это работает. В отличие от системной командной панели, Обычная группа не перехватывает фокус для делегирования его первому элементу. Она является прозрачным контейнером для системы навигации. В этом случае код установки текущего элемента начнет работать корректно:


&НаКлиенте
Процедура ПерейтиККнопке()
    // Теперь фокус будет установлен точно на указанный элемент
    ЭтаФорма.ТекущийЭлемент = Элементы.МояСпециальнаяКнопка;
КонецПроцедуры

Важный нюанс: при использовании обычной группы вы можете потерять некоторые визуальные особенности командной панели (например, специфические отступы или разделители), но с точки зрения логики работы интерфейса это дает полный контроль над фокусом.

Решение №2: Использование свойства «Кнопка по умолчанию»

Если ваша задача состоит не столько в физическом перемещении «рамки» фокуса, сколько в том, чтобы пользователь мог сразу нажать Enter и активировать команду, можно воспользоваться механизмом кнопки по умолчанию. Разберем этот пример:


&НаКлиенте
Процедура ВыделитьКнопкуКакОсновную()
    // Устанавливаем кнопку по умолчанию для всей формы
    ЭтаФорма.КнопкаПоУмолчанию = Элементы.ФормаКомандаЗапустить;
КонецПроцедуры

Проанализируем результат. Кнопка выделится цветом (в стандартных темах — желтым). Теперь, даже если фокус находится в текстовом поле, нажатие клавиши Enter приведет к выполнению действия именно этой кнопки. Это отличный UX-прием для линейных процессов заполнения данных.

Решение №3: Работа через обработчик ожидания

Иногда фокус не устанавливается из-за того, что в данный момент платформа занята обработкой события изменения элемента, из которого вы пытаетесь уйти. Чтобы «дать форме продышаться», можно использовать небольшой программный трюк. Посмотрим на пример кода:


&НаКлиенте
Процедура ПослеДействия()
    // Вместо прямой установки фокуса вызываем процедуру с задержкой 0.1 сек
    ПодключитьОбработчикОжидания("УстановитьФокусНаКнопку", 0.1, Истина);
КонецПроцедуры

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

Этот метод часто помогает, когда стандартное присвоение ТекущийЭлемент просто игнорируется без видимых причин. Однако помните, что ограничение командной панели (активация именно первой кнопки) этот способ сам по себе не обходит — его нужно комбинировать с использованием Обычной группы.

Резюме и рекомендации

Подводя итог, можно сказать, что поведение фокуса в 1С жестко регламентировано структурой элементов формы. Для реализации сложной логики переходов между элементами придерживайтесь следующих правил:

Используя эти методики, вы сможете создавать более отзывчивые и интуитивно понятные интерфейсы, в которых управление с клавиатуры работает именно так, как ожидает пользователь.

← На главную