Как программно переключить фокус в форме списка на строку в 1С

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

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

Разберем понятия: Текущий элемент vs Текущая строка

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

  1. Текущий элемент (Focus): Это объект формы (кнопка, поле списка, флажок), который в данный момент принимает ввод с клавиатуры. Если «Текущий элемент» — это список, то нажатие клавиш «Вверх» или «Вниз» будет перемещать выделение по строкам.
  2. Текущая строка (Active Row): Это конкретная запись в таблице, которая выделена цветом. Важно понимать, что строка может быть выделена, но если фокус (Текущий элемент) находится на кнопке «ОК», нажатие клавиш управления курсором не приведет к перемещению по списку.

Наша задача — сделать так, чтобы и строка была выбрана, и фокус ввода находился на самой таблице.

Решение для Обычных форм (1С 8.1, 8.2)

Рассмотрим ситуацию, описанную в обсуждении. Имеется форма списка, где при нажатии на кнопку в подвале фокус уходит со списка. Для того чтобы вернуть его обратно, мы должны обратиться к свойству формы ТекущийЭлемент.

Проанализируем правильный синтаксис. Как было замечено в ходе дискуссии, свойство ТекущийЭлемент принадлежит самой форме, а не коллекции ЭлементыФормы. Рассмотрим правильный вариант кода внутри модуля формы:


// Пример возврата фокуса в табличное поле "Список"
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Список;

Почему это работает? Присваивая свойству ТекущийЭлемент объект типа ТабличноеПоле, мы заставляем платформу перерисовать рамку фокуса вокруг списка. Теперь пользователь может сразу нажимать клавиши навигации.

Важный нюанс: Если вы хотите не просто вернуть фокус, но и позиционировать список на конкретной строке, нужно сначала установить строку, а затем — фокус:


// 1. Устанавливаем нужную строку (если она известна)
ЭлементыФормы.Список.ТекущаяСтрока = СсылкаНаДокумент;

// 2. Активизируем сам элемент управления
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Список;

Решение для Управляемых форм (1С 8.2, 8.3)

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


// Установка фокуса на динамический список с именем "Список"
ЭтаФорма.ТекущийЭлемент = Элементы.Список;

Для активации конкретной строки в динамическом списке (например, после программного поиска или создания нового документа) используется свойство ТекущаяСтрока. Помните, что в управляемых формах идентификатором строки чаще всего выступает ссылка на объект базы данных:


// Устанавливаем активную строку по ссылке
Элементы.Список.ТекущаяСтрока = НужнаяСсылка;

// Передаем фокус списку
ЭтаФорма.ТекущийЭлемент = Элементы.Список;

Проблема «упрямого» фокуса и использование обработчика ожидания

Иногда возникают ситуации, когда стандартная команда ЭтаФорма.ТекущийЭлемент = ... не срабатывает. Это происходит из-за того, что после выполнения вашего кода в процедуре «НажатиеКнопки» платформа выполняет свои внутренние системные действия, которые могут принудительно вернуть фокус на кнопку (так называемое «залипание» фокуса).

Выясним, как обойти эту проблему. В таких случаях мы используем небольшой «костыль», который является профессиональным стандартом в 1С — ПодключитьОбработчикОжидания. Мы даем платформе завершить все свои дела и через 0.1 секунды выполняем установку фокуса.

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

  1. В процедуре нажатия кнопки вызываем обработчик ожидания.
  2. Создаем отдельную экспортную процедуру, которая выполнит переключение.

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

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

Параметр Истина в методе ПодключитьОбработчикОжидания означает, что процедура выполнится всего один раз, а не будет повторяться каждые 0.1 секунды.

Установка фокуса при открытии формы

Часто требуется, чтобы при открытии формы фокус сразу стоял на списке, а не на первом поле ввода или кнопке. Проанализируем способы настройки этого поведения:

  1. Порядок обхода (для Обычных форм): В конфигураторе откройте форму, выберите меню «Форма» — «Порядок обхода». Убедитесь, что ваш список стоит первым в очереди.
  2. Свойство «АктивизироватьПоУмолчанию» (для Управляемых форм): В свойствах элемента формы (Динамического списка) установите галочку АктивизироватьПоУмолчанию. Платформа сама передаст ему фокус при инициализации.
  3. Программная установка в «ПриОткрытии»: Если вышеуказанные способы не подходят (например, фокус нужен на списке только при определенных условиях), используйте уже знакомый нам метод в процедуре ПриОткрытии.

Типичные ошибки и методы их устранения

Рассмотрим ситуацию из сообщения 6, где предлагалось использовать ОбновитьСтроки(). Важно понимать: этот метод не управляет фокусом. Он заставляет систему перечитать данные из базы для отображения актуальной информации (например, если другой пользователь изменил статус документа). Использование его для «переброски курсора» — это использование побочного эффекта, который может работать нестабильно.

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

Итоги

Подводя итог, можно составить универсальный алгоритм возврата фокуса в список:

  1. Определите контекст: Для обычных форм используйте ЭлементыФормы, для управляемых — Элементы.
  2. Используйте свойство формы: Команда всегда должна выглядеть как ЭтаФорма.ТекущийЭлемент = ....
  3. Следите за последовательностью: Сначала устанавливайте значение ТекущаяСтрока, а только потом — ТекущийЭлемент.
  4. Применяйте таймеры: Если фокус «спрыгивает» обратно, используйте ПодключитьОбработчикОжидания.

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

← На главную