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