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