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