Разработка и Конфигурация · 13 мин
Как установить фокус на элемент формы в 1С
Как установить фокус на элемент формы в 1С: свойство ТекущийЭлемент, примеры кода для управляемых и обычных форм, типичные ошибки и проверка результата.
При разработке форм в 1С часто возникает задача: после открытия формы, заполнения данных или выполнения команды перевести фокус ввода на конкретное поле, чтобы пользователю не приходилось кликать по нему вручную. Например, при создании нового документа логично сразу поставить курсор в поле «Номенклатура» или «Комментарий», а после сканирования штрихкода — вернуть фокус в поле ввода для следующего сканирования.
В управляемых формах 1С прямого метода «УстановитьФокус» нет. Вместо этого используется свойство формы ТекущийЭлемент, через которое назначается активный элемент. В обычных формах (толстый клиент, режим обычного приложения) применяется похожий механизм, но с особенностями. Ниже разберём оба подхода, ограничения платформы и типичные ошибки.
Как работает механизм фокуса в управляемой форме
В управляемых формах активный элемент определяется свойством ТекущийЭлемент объекта УправляемаяФорма. Чтобы установить фокус, достаточно присвоить этому свойству ссылку на нужный элемент формы из коллекции Элементы:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтаФорма.ТекущийЭлемент = Элементы.Комментарий;
КонецПроцедуры
После такого присваивания платформа передаст фокус ввода указанному полю, и пользователь сможет сразу начинать ввод. Если элемент — таблица, фокус установится на таблицу, а текущая строка и колонка определят конкретную ячейку.
Важно понимать: свойство ТекущийЭлемент доступно и на чтение. Это позволяет узнать, какой элемент сейчас активен, и использовать это в логике — например, при обработке внешнего события от сканера штрихкодов проверять, в каком поле находится курсор.
Установка фокуса при открытии формы
Самый частый сценарий — задать начальный фокус при открытии. Для этого подходят два обработчика: ПриСозданииНаСервере и ПриОткрытии. В первом элементы формы уже созданы, но форма ещё не отображена; во втором форма уже показана пользователю.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Номенклатура.Видимость = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЭтаФорма.ТекущийЭлемент = Элементы.Номенклатура;
КонецПроцедуры
На практике надёжнее устанавливать фокус в ПриОткрытии: к этому моменту все элементы гарантированно отрисованы и могут принять фокус. Присваивание в ПриСозданииНаСервере тоже допустимо — платформа запомнит текущий элемент и активирует его при отображении, но если логика зависит от клиентских условий (например, от режима работы), удобнее клиентский обработчик.
Если форма открывается с параметрами, по которым определяется нужное поле, логику удобно собрать в одном месте:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Параметры.Свойство("РежимВводаКоличества") Тогда
ЭтаФорма.ТекущийЭлемент = Элементы.Количество;
Иначе
ЭтаФорма.ТекущийЭлемент = Элементы.Номенклатура;
КонецЕсли;
КонецПроцедуры
Установка фокуса в таблицу и на конкретную колонку
Когда активным должен стать элемент табличной части, простого присваивания таблицы свойству ТекущийЭлемент недостаточно для точного позиционирования — нужно также задать текущую строку и колонку. Для поля таблицы используется свойство ТекущийЭлемент самой таблицы формы (не путайте со свойством формы):
&НаКлиенте
Процедура ДобавитьСтроку(Команда)
НоваяСтрока = Объект.Товары.Добавить();
Элементы.Товары.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
Элементы.Товары.ТекущийЭлемент = Элементы.ТоварыКоличество;
КонецПроцедуры
Здесь последовательность принципиальна: сначала устанавливается текущая строка таблицы, затем фокус формы переводится на таблицу, и только потом указывается активная колонка через ТекущийЭлемент элемента-таблицы. Если поменять порядок, колонка может не активироваться, потому что таблица в момент присваивания ещё не имела фокуса.
Дополнительно полезен метод ИзменитьСтроку() у таблицы формы — он переводит текущую строку в режим редактирования, и пользователь сразу может вводить значение, не нажимая Enter или F2:
Элементы.Товары.ИзменитьСтроку();
- 1Добавьте или найдите нужную строку табличной части
- 2Установите Элементы.Таблица.ТекущаяСтрока по идентификатору строки
- 3Присвойте ЭтаФорма.ТекущийЭлемент = Элементы.Таблица
- 4Укажите активную колонку: Элементы.Таблица.ТекущийЭлемент = Элементы.ТаблицаКолонка
- 5При необходимости вызовите Элементы.Таблица.ИзменитьСтроку() для входа в режим редактирования
Установка фокуса в обычной форме
В обычных формах (обычное приложение, толстый клиент) синтаксис отличается коллекцией элементов: вместо Элементы используется ЭлементыФормы. Свойство формы называется так же — ТекущийЭлемент:
Процедура ПриОткрытии()
ЭтаФорма.ТекущийЭлемент = ЭлементыФормы.Комментарий;
КонецПроцедуры
В обычных формах также доступен метод УстановитьФокус() у некоторых элементов, но присваивание через ТекущийЭлемент считается основным способом. Для табличных полей обычной формы действует тот же принцип: сначала активируется табличное поле, затем задаётся текущая колонка через свойство ТекущаяКолонка табличного поля.
Если конфигурация поддерживает оба режима работы, код установки фокуса придётся дублировать с учётом разных коллекций элементов, либо выносить в условные блоки по директивам компиляции #Если ТолстыйКлиентОбычноеПриложение Тогда.
Сравнение вариантов
Основной и единственный универсальный способ. Работает в тонком, толстом и веб-клиенте. Ограничение: элемент должен быть видим и доступен.
Применяется только в режиме обычного приложения. Синтаксис похож, но коллекция элементов другая; не работает в управляемых формах.
Дополняет основной способ для таблиц: задаёт активную колонку. Без установки фокуса формы на таблицу эффекта не даёт.
Условия, при которых фокус не установится
Платформа молча игнорирует присваивание ТекущийЭлемент, если элемент не может принять фокус. Это самая частая причина «неработающего» кода. Проверяйте следующие условия:
- элемент невидим (
Видимость = Ложь) или скрыт вместе с родительской группой; - элемент недоступен (
Доступность = Ложь) или доступен только для просмотра; - элемент находится на неактивной закладке — сначала нужно переключить страницу через
Элементы.ГруппаСтраницы.ТекущаяСтраница; - присваивание выполняется до создания элементов формы, например слишком рано в жизненном цикле;
- имя элемента указано с ошибкой — обращение к
Элементы.НесуществующееИмявызовет исключение, а не тихую отмену.
Отдельный случай — декорации и поля-надписи: они в принципе не принимают фокус ввода, поэтому установить на них текущий элемент нельзя. То же относится к кнопкам в некоторых клиентах: фокус на кнопку формально возможен, но поведение зависит от вида клиента.
Проверка результата и отладка
Проверить, какой элемент получил фокус, можно чтением свойства ТекущийЭлемент в любом клиентском обработчике, например по команде или в ОбработкаОповещения:
&НаКлиенте
Процедура ПоказатьТекущийЭлемент(Команда)
Если ЭтаФорма.ТекущийЭлемент <> Неопределено Тогда
Сообщить("Активен: " + ЭтаФорма.ТекущийЭлемент.Имя);
Иначе
Сообщить("Фокус не установлен");
КонецЕсли;
КонецПроцедуры
При отладке учитывайте, что в веб-клиенте поведение фокуса может незначительно отличаться от тонкого клиента: браузер накладывает собственные ограничения на программную установку фокуса. Поэтому сценарии, критичные к фокусу (рабочие места кассиров, сканирование), стоит проверять в том клиенте, в котором будут работать пользователи.
Как проверить результат
Возвращает нужный элемент, курсор в поле
Возвращает Неопределено или другой элемент
Оба свойства равны Истина, включая родительские группы
Элемент или его группа скрыты либо недоступны
Элемент на активной закладке
Элемент на скрытой странице — фокус не встаёт
Фокус работает в веб-клиенте и тонком клиенте одинаково
В одном из клиентов фокус теряется или не устанавливается
Типичные ошибки и их последствия
Чаще всего разработчики сталкиваются с тремя проблемами. Первая — обращение к элементу по имени реквизита, а не по имени элемента формы. Реквизит Объект.Комментарий и элемент формы Элементы.Комментарий обычно совпадают по имени, но если элемент был переименован, код перестанет работать. Всегда используйте имя элемента, как оно задано в дереве элементов формы.
Вторая ошибка — установка фокуса на сервере в контексте, где клиентское состояние ещё не синхронизировано, с последующим пересозданием элементов. После вызова серверных процедур, изменяющих состав формы, присваивание нужно повторять.
Третья — попытка установить фокус на элемент динамически созданной формы до её фактического отображения. Если элементы добавляются программно в ПриСозданииНаСервере, фокус на них надёжнее ставить в ПриОткрытии.
Практические сценарии применения
Типовой сценарий для рабочего места со сканером штрихкодов: после обработки каждого внешнего события фокус возвращается в поле ввода штрихкода, чтобы оператор не касался мыши. Для этого в обработчике ВнешнееСобытие в конце кода добавляется одна строка присваивания ТекущийЭлемент.
Другой сценарий — валидация при записи: если обязательное поле не заполнено, форма не только сообщает об ошибке, но и переводит курсор на проблемное поле. Это заметно ускоряет исправление данных, особенно в длинных формах с несколькими закладками — в сочетании с переключением ТекущаяСтраница пользователь сразу видит место ошибки.
Как выбрать действие
Что важно запомнить
Фокус в 1С устанавливается присваиванием свойства ЭтаФорма.ТекущийЭлемент: в управляемой форме через коллекцию Элементы, в обычной — через ЭлементыФормы. Элемент должен быть видим, доступен и находиться на активной странице. Для таблиц дополнительно задаются текущая строка и активная колонка. Проверяйте результат чтением ТекущийЭлемент в целевом клиенте.
Частые вопросы
Можно ли установить фокус на сервере?
Формально присваивание ЭтаФорма.ТекущийЭлемент допустимо и в серверном контексте (например, в ПриСозданииНаСервере) — платформа передаст это состояние клиенту. Но если элементы создаются или изменяются динамически, надёжнее выполнять присваивание на клиенте в ПриОткрытии или после завершения серверного вызова.
Почему присваивание ТекущийЭлемент не вызывает ошибку, но фокус не встаёт?
Платформа молча игнорирует установку фокуса на невидимый, недоступный или находящийся на скрытой закладке элемент. Проверьте свойства Видимость и Доступность самого элемента и всех родительских групп, а также активную страницу формы.
Как узнать, какой элемент формы сейчас в фокусе?
Прочитайте свойство ЭтаФорма.ТекущийЭлемент в любом клиентском обработчике. Если фокуса нет, свойство вернёт Неопределено. У возвращённого элемента можно прочитать свойство Имя для идентификации.
Как поставить фокус на конкретную ячейку табличной части?
Нужны три шага: установить Элементы.Таблица.ТекущаяСтрока по идентификатору строки, присвоить ЭтаФорма.ТекущийЭлемент = Элементы.Таблица, затем задать Элементы.Таблица.ТекущийЭлемент = Элементы.ИмяКолонки. Для входа в режим редактирования ячейки добавьте вызов Элементы.Таблица.ИзменитьСтроку().
Работает ли установка фокуса в веб-клиенте?
Да, механизм ТекущийЭлемент поддерживается в веб-клиенте, но браузерные ограничения могут влиять на момент фактической установки фокуса. Сценарии, критичные к фокусу, следует тестировать именно в том клиенте, который используют конечные пользователи.
Можно ли запретить пользователю уходить с поля, пока оно не заполнено?
Напрямую удерживать фокус нельзя — попытки возвращать его в обработчиках делают форму неудобной. Правильный подход: проверять заполнение в обработчике ПриЗаписи или в событии ОкончаниеВводаТекста поля и при ошибке выдавать сообщение с привязкой к полю, а фокус возвращать однократно.