К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как активизировать элемент формы в 1С

Как активизировать элемент формы в 1С: метод Активизировать(), Элементы.ТекущийЭлемент, установка фокуса программно, типичные ошибки и примеры кода.

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

Для решения задачи в платформе есть два основных механизма: метод формы Активизировать() и свойство ТекущийЭлемент объекта Элементы формы. Они работают по-разному, у каждого есть ограничения, и выбор зависит от контекста — обычная или управляемая форма, толстый или тонкий клиент, где вызывается код.

Ниже разобраны оба способа с примерами кода, условия, при которых каждый из них срабатывает, и типичные ошибки, из-за которых элемент «не активизируется».

Что значит «активизировать элемент формы»

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

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

Способ 1: свойство ТекущийЭлемент в управляемой форме

Основной способ для управляемых форм — присвоить свойству ТекущийЭлемент коллекции Элементы ссылку на нужный элемент. Свойство доступно и для чтения, и для записи, поэтому через него можно не только установить, но и узнать, где сейчас находится фокус.

&НаКлиенте

Процедура УстановитьФокусНаКомментарий(Команда)

Элементы.ТекущийЭлемент = Элементы.Комментарий;

КонецПроцедуры

Ключевое ограничение: присваивание должно выполняться в клиентском контексте. Если попытаться установить ТекущийЭлемент в серверной процедуре, платформа выдаст ошибку о недопустимости операции, потому что управление фокусом — прерогатива клиентского приложения, сервер о состоянии экрана пользователя ничего не знает.

Типичный сценарий — установить фокус сразу после открытия формы. Для этого используют обработчик ПриОткрытии:

&НаКлиенте

Процедура ПриОткрытии(Отказ)

Элементы.ТекущийЭлемент = Элементы.Наименование;

КонецПроцедуры

Способ 2: метод Активизировать() в обычных формах

В обычных формах (режим обычного приложения) используется метод Активизировать(), вызываемый у самого элемента формы. Он доступен для полей ввода, табличных полей и ряда других элементов.

Процедура ПриОткрытии()

ЭлементыФормы.Контрагент.Активизировать();

КонецПроцедуры

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

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

Сравнение способов

Элементы.ТекущийЭлемент

Управляемые формы. Работает только на клиенте, позволяет и прочитать текущий фокус. Основной современный способ.

ЭлементыФормы.Имя.Активизировать()

Обычные формы (обычное приложение). Не существует в управляемых формах, при миграции требует замены.

Перейти на страницу + ТекущаяСтрока

Не активизация в чистом виде, а подготовка контекста: часто нужна перед установкой фокуса на таблицу.

Активизация табличной части и конкретной строки

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

&НаКлиенте

Процедура ДобавитьИАктивизировать(Команда)

НоваяСтрока = Объект.Товары.Добавить();

Элементы.Товары.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();

Элементы.ТекущийЭлемент = Элементы.Товары;

КонецПроцедуры

Если нужно, чтобы курсор оказался в конкретной колонке, укажите её как текущий элемент после установки строки:

Элементы.ТекущийЭлемент = Элементы.ТоварыКоличество;

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

Порядок действий
  1. 1
    Определите тип формы: управляемая или обычная
  2. 2
    Для управляемой — присвойте Элементы.ТекущийЭлемент в клиентской процедуре
  3. 3
    Для обычной — вызовите ЭлементыФормы.Имя.Активизировать()
  4. 4
    Для таблицы сначала установите ТекущаяСтрока, затем фокус
  5. 5
    Запустите форму и проверьте, что курсор оказался в нужном элементе

Активизация при ошибках заполнения и проверке данных

Частая прикладная задача — при неудачной проверке заполнения перевести пользователя к полю с ошибкой. В управляемой форме это делается в клиентском обработчике после вызова серверной проверки: серверная процедура возвращает имя проблемного реквизита, а клиентская устанавливает фокус.

&НаКлиенте

Процедура ПослеПроверки(РезультатПроверки)

Если Не РезультатПроверки.Успешно Тогда

Элементы.ТекущийЭлемент = Элементы[РезультатПроверки.ИмяПоля];

КонецЕсли;

КонецПроцедуры

Если поле находится на другой странице формы, перед установкой фокуса переключите страницу: Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.СтраницаОсновное;. Иначе фокус либо не установится, либо установится «вслепую» — пользователь не увидит, куда перевели курсор.

Почему элемент не активизируется: типичные причины

Первая и самая частая причина — код выполняется на сервере. Установка ТекущийЭлемент в серверной процедуре либо вызывает ошибку, либо молча игнорируется в зависимости от контекста. Перенесите установку фокуса в клиентскую процедуру или верните из серверной процедуры имя элемента и обработайте его на клиенте.

Вторая причина — неверное имя элемента. Обращение Элементы.Имя требует точного имени из дерева элементов формы, а не имени реквизита данных. Если поле называется ТоварыКоличество, а вы пишете Элементы.Количество, получите ошибку или обращение к другому элементу.

Третья причина — момент вызова. В ПриСозданииНаСервере элементы формы ещё формируются, и установка фокуса там бессмысленна. Используйте ПриОткрытии или более поздние события. Также фокус может «перебиваться» стандартной логикой платформы, которая после открытия сама устанавливает фокус на первый доступный элемент — в таком случае помогает отложенная установка через обработчик ожидания.

Типичные ошибки
01
Установка ТекущийЭлемент на сервере — ошибка или молчаливый отказ, фокус не меняется
02
Использование Активизировать() в управляемой форме — ошибка «Метод объекта не обнаружен»
03
Обращение по имени реквизита вместо имени элемента формы — фокус ставится не туда или падает ошибка
04
Установка фокуса на элемент неактивной страницы — пользователь не видит, куда переведён курсор
05
Установка фокуса в ПриСозданииНаСервере — элементы ещё не готовы, действие игнорируется

Проверка результата и отладка

Чтобы убедиться, что фокус установлен правильно, после открытия формы посмотрите, где мигает курсор, и попробуйте ввод с клавиатуры — символы должны попадать в целевое поле. Если фокус уходит не туда, прочитайте Элементы.ТекущийЭлемент в отладчике: свойство покажет, какой элемент реально получил фокус, и это сузит поиск.

Полезный приём — временно вывести имя текущего элемента сообщением после установки фокуса. Если сообщение показывает правильное имя, а визуально фокус в другом месте, значит, после вашего кода срабатывает другой обработчик, который его перебивает. Ищите ПриОткрытии, подписки на события и расширения формы.

Контрольные точки

Как проверить результат

Курсор после открытия формы
Норма

Курсор в нужном поле, ввод с клавиатуры идёт в него

Тревожный признак

Фокус на первом элементе формы или на кнопке

Значение Элементы.ТекущийЭлемент в отладчике
Норма

Совпадает с целевым элементом

Тревожный признак

Другой элемент или Неопределено

Поведение при ошибке заполнения
Норма

Форма переключает страницу и подсвечивает проблемное поле

Тревожный признак

Сообщение об ошибке есть, а фокус не переместился

Итог

Что важно запомнить

В управляемых формах фокус устанавливается через Элементы.ТекущийЭлемент и только на клиенте; в обычных — методом Активизировать(). Для таблиц сначала задавайте текущую строку, для полей на других страницах — сначала переключайте страницу. Если фокус «слетает», ищите обработчик, который перебивает вашу установку.

Частые вопросы

Как активизировать элемент формы при её открытии?

В управляемой форме добавьте в обработчик ПриОткрытии строку Элементы.ТекущийЭлемент = Элементы.ИмяПоля. Если платформа после открытия перебивает фокус стандартной логикой, установите его через ПодключитьОбработчикОжидания с интервалом 0,1–0,5 секунды и однократным срабатыванием.

Можно ли активизировать элемент формы из серверной процедуры?

Нет, управление фокусом доступно только на клиенте. Шаблон решения: серверная процедура возвращает имя нужного элемента, а клиентская процедура, которая её вызвала, устанавливает Элементы.ТекущийЭлемент по этому имени.

Как установить фокус на конкретную ячейку табличной части?

Сначала установите Элементы.Таблица.ТекущаяСтрока, передав идентификатор нужной строки, затем присвойте Элементы.ТекущийЭлемент ссылку на элемент колонки, например Элементы.ТоварыЦена. При необходимости вызовите Элементы.Таблица.ИзменитьСтроку() для перехода в режим редактирования.

Почему возникает ошибка «Метод объекта не обнаружен: Активизировать»?

Метод Активизировать() существует только в обычных формах. В управляемой форме элементы его не поддерживают — замените вызов на присваивание Элементы.ТекущийЭлемент. Такая ошибка типична при переносе кода из конфигураций на обычном приложении.

Как активизировать поле, которое находится на другой странице формы?

Сначала переключите страницу: Элементы.ГруппаСтраницы.ТекущаяСтраница = Элементы.ИмяСтраницы, и только после этого устанавливайте ТекущийЭлемент. Если страница не активна, фокус либо не установится, либо пользователь не увидит, куда он переведён.

Как узнать, какой элемент формы сейчас активен?

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