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

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

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

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

Постановка задачи

Допустим, у нас есть управляемая форма. На форме размещена таблица (ТабличнаяЧасть или программно выведенная таблица значений), которая называется Заявки. В таблице есть колонки Номер и Сумма.

Наша цель: Сделать так, чтобы при определенном событии (например, при открытии формы или нажатии кнопки) активной становилась последняя строка таблицы, а курсор устанавливался в колонку Сумма.

Почему не работают простые методы?

В начале обсуждения проблемы часто возникают попытки использовать интуитивные, но неверные для управляемых форм подходы. Разберем, почему следующий код не сработает:


// ОШИБКА 1: Попытка присвоить данные вместо индекса/ID
ЭтаФорма.Элементы.Заявки.ТекущаяСтрока = ЭтаФорма.Элементы.Заявки.ТекущиеДанные;

// ОШИБКА 2: Попытка использовать номер строки (число)
ЭтаФорма.Элементы.Заявки.ТекущаяСтрока = 1;

Проблема заключается в архитектуре управляемого интерфейса:

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

Шаг 1: Получение идентификатора строки

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

Рассмотрим алгоритм действий:

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

Код для получения идентификатора последней строки будет выглядеть так:


// Предположим, что данные таблицы хранятся в реквизите формы "Заявки"
КоллекцияДанных = Заявки; 

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

После выполнения этого кода таблица прокрутится к последней строке, и эта строка будет выделена. Но фокус (курсор ввода) может остаться на первой колонке или вообще в другом месте формы.

Шаг 2: Установка фокуса на колонку

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

Для переключения фокуса используется глобальное свойство формы ЭтаФорма.ТекущийЭлемент. Ему нужно присвоить сам элемент управления (поле ввода), соответствующий нужной колонке.

Важно различать имя реквизита (данные, например, "Сумма") и имя элемента формы (интерфейс, например, "ЗаявкиСумма"). По умолчанию 1С называет элементы как "ИмяТаблицы + ИмяКолонки", но лучше проверить имя элемента в конфигураторе или использовать редактор форм в режиме предприятия для точного определения свойств.

Допустим, элемент колонки называется ЗаявкиСумма.


// Устанавливаем глобальный фокус на конкретный элемент внутри таблицы
ЭтаФорма.ТекущийЭлемент = Элементы.ЗаявкиСумма;

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

Шаг 3: Вход в режим редактирования (Опционально)

Если мы просто выполним шаги 1 и 2, ячейка будет выделена, но курсор внутри неё может не мигать (режим просмотра). Чтобы пользователь мог сразу начать печатать цифры, не нажимая Enter, полезно принудительно перевести строку в режим редактирования.

Для этого используется метод таблицы формы ИзменитьСтроку().

Итоговое решение

Соберем всё вместе в единую процедуру. Этот код должен выполняться НаКлиенте, так как мы работаем с интерфейсными объектами (Элементы). Лучше всего размещать его в обработчике ПриОткрытии или в конце процедуры добавления новой строки.


&НаКлиенте
Процедура УстановитьФокусНаПоследнююСтроку()
    
    // Ссылка на данные таблицы (это может быть Объект.Товары, Объект.Заявки или реквизит формы)
    ДанныеТаблицы = Заявки; 
    
    // 1. Защита от ошибок: проверяем, не пуста ли таблица
    Если ДанныеТаблицы.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;

    // 2. Получаем идентификатор последней строки
    // Индекс = Количество - 1
    ИндексПоследнейСтроки = ДанныеТаблицы.Количество() - 1;
    СтрокаДанных = ДанныеТаблицы[ИндексПоследнейСтроки];
    ИдентификаторСтроки = СтрокаДанных.ПолучитьИдентификатор();

    // 3. Позиционируем таблицу на нужную строку
    // Используем коллекцию "Элементы" для управления визуальной частью
    Элементы.Заявки.ТекущаяСтрока = ИдентификаторСтроки;

    // 4. Устанавливаем фокус на нужную колонку
    // "ЗаявкиСумма" - это ИМЯ ЭЛЕМЕНТА формы (колонки), проверьте его в свойствах!
    ЭтаФорма.ТекущийЭлемент = Элементы.ЗаявкиСумма;
    
    // 5. (Дополнительно) Активируем режим ввода, чтобы сразу печатать
    // Это избавляет пользователя от лишнего клика или нажатия Enter
    Элементы.Заявки.ИзменитьСтроку();

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

Важные нюансы

При реализации этого механизма обратите внимание на следующие моменты:

  1. Видимость и Доступность: Нельзя установить фокус на элемент (колонку), у которого свойство Видимость = Ложь или Доступность = Ложь. Если колонка скрыта или заблокирована для редактирования, платформа попытается перевести фокус на следующий доступный элемент, либо код не сработает ожидаемым образом.
  2. Сортировка: Метод ПолучитьИдентификатор() работает надежно, даже если пользователь отсортировал таблицу кликом по заголовку. Мы берем "последнюю строку данных", и даже если визуально она стала первой из-за сортировки, фокус прыгнет именно на неё. Если же вам нужна визуально последняя строка, логика определения индекса будет сложнее (через итерацию по проверенным строкам).
  3. Контекст вызова: Если вы пытаетесь сделать это в процедуре ПриСозданииНаСервере, код не сработает, так как элементы формы еще полностью не инициализированы для интерактивного взаимодействия. Используйте ПриОткрытии.

Теперь вы умеете точно управлять фокусом ввода в таблицах 1С, делая работу пользователей более быстрой и комфортной.

← На главную