Как программно установить фокус на определенную строку и колонку в таблице формы 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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

Разбор механизма установки фокуса на строку

Первое, с чем сталкиваются разработчики — это попытка установить текущую строку через индекс массива. Однако свойство ТекущаяСтрока элемента формы "Таблица" ожидает не порядковый номер (0, 1, 2...), а внутренний уникальный идентификатор строки. Рассмотрим, как правильно получить этот идентификатор и передать его таблице.

Проанализируем ситуацию: у нас есть объект Заявки (это данные формы типа ТаблицаЗначений) и элемент формы Элементы.Заявки (визуальное отображение таблицы). Чтобы выделить последнюю строку, нам нужно обратиться к коллекции строк, получить последнюю и вызвать метод ПолучитьИдентификатор().


// Получаем индекс последней строки
ИндексПоследнейСтроки = Заявки.Количество() - 1;

Если ИндексПоследнейСтроки >= 0 Тогда
    // Получаем саму строку из данных формы
    ПоследняяСтрока = Заявки[ИндексПоследнейСтроки];
    
    // Устанавливаем фокус на эту строку в визуальном элементе
    Элементы.Заявки.ТекущаяСтрока = ПоследняяСтрока.ПолучитьИдентификатор();
КонецЕсли;

Обратим внимание на важную деталь: если вы программно добавляете новую строку методом Добавить(), этот метод сразу возвращает объект строки, у которого можно взять идентификатор.

Установка фокуса на конкретную колонку

После того как мы программно выбрали строку, курсор по умолчанию встает на первую колонку таблицы. Чтобы переместить его, например, в колонку "Сумма", необходимо работать со свойством ТекущийЭлемент самой формы. Выясним причину, по которой попытка присвоить данные (значение из таблицы) этому свойству не работает. Свойство ТекущийЭлемент принимает только объект типа ПолеФормы, то есть визуальный элемент, описанный в дереве элементов формы.

Рассмотрим пример правильной установки фокуса на колонку "Сумма" (предположим, что элемент формы, отображающий эту колонку, называется ЗаявкиСумма):


// Устанавливаем фокус на конкретное поле (колонку)
ЭтаФорма.ТекущийЭлемент = Элементы.ЗаявкиСумма;

Важно не путать имя колонки в объекте ТаблицаЗначений с именем элемента в дереве элементов формы. Обычно платформа при создании колонок автоматически присваивает им имена вида ИмяТаблицы + ИмяКолонки.

Комплексное решение задачи

Объединим полученные знания в единый алгоритм. Напишем код, который гарантированно устанавливает фокус на последнюю строку в колонку "Сумма", учитывая возможные проверки на пустую таблицу.


&НаКлиенте
Процедура УстановитьФокусНаПоследнююСумму()
    
    // 1. Проверяем, есть ли в таблице данные, чтобы избежать ошибки обращения к индексу -1
    Если Заявки.Количество() > 0 Тогда
        
        // 2. Определяем идентификатор последней строки
        ИдентификаторСтроки = Заявки[Заявки.Количество() - 1].ПолучитьИдентификатор();
        
        // 3. Активизируем строку в таблице
        Элементы.Заявки.ТекущаяСтрока = ИдентификаторСтроки;
        
        // 4. Переводим фокус формы на нужную колонку
        ЭтаФорма.ТекущийЭлемент = Элементы.ЗаявкиСумма;
        
    КонецЕсли;
    
КонецПроцедуры

Расширенные техники управления интерфейсом

Зачастую простого перемещения "рамки" на ячейку недостаточно. Пользователь ожидает, что ячейка сразу откроется для ввода текста или цифр. Разберем дополнительные методы, которые сделают работу более комфортной.

Метод ИзменитьСтроку(). Если после установки фокуса вы хотите сразу активировать режим редактирования, используйте метод таблицы ИзменитьСтроку(). Это программный аналог нажатия клавиши Enter или двойного клика мышью.


// После установки строки и элемента
Элементы.Заявки.ИзменитьСтроку();

Нюансы работы при открытии формы. Если вы попробуете установить фокус в обработчике ПриСозданииНаСервере, это не даст результата, так как фокус — это клиентское понятие. Посмотрим на правильный порядок действий: установку фокуса следует выполнять в процедуре ПриОткрытии на клиенте. В некоторых сложных интерфейсах платформа может "перехватить" фокус на первый элемент в порядке обхода. В таких случаях мы рекомендуем использовать ПодключитьОбработчикОжидания с минимальной задержкой (например, 0.1 сек), чтобы код выполнился после завершения всех стандартных процедур инициализации формы.

Особенности веб-клиента. Проанализируем ситуацию при работе через браузер. В веб-клиенте фокус может вести себя иначе из-за политик безопасности. Программная установка фокуса должна быть инициирована "действием пользователя" (нажатием кнопки или выбором в меню), иначе браузер может проигнорировать команду ТекущийЭлемент.

Резюме по объектам и методам

Для успешного управления фокусом нам потребовались следующие инструменты 1С:

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

Используя эти методы совместно, мы можем создавать интуитивно понятные интерфейсы, которые предугадывают действия пользователя и экономят его время при массовом вводе документов.

← На главную