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

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

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

Постановка задачи и анализ механизмов платформы

Рассмотрим ситуацию: у нас есть управляемая форма, на которой размещена таблица (связанная с ТабличнойЧастью объекта или ТаблицейЗначений в реквизитах формы). Нам необходимо программно сделать так, чтобы выделение в таблице переместилось на определенную строку, а сама таблица получила фокус ввода. Для решения этой задачи нам потребуется взаимодействовать с двумя уровнями системы:

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

Давайте разберем по шагам, как это реализовать в коде.

Шаг 1: Идентификация нужной строки

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

Проанализируем пример кода при добавлении новой строки в табличную часть:


// Добавляем новую строку в объект или реквизит формы
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Количество = 1;

// Получаем идентификатор добавленной строки
ИдентификаторСтроки = НоваяСтрока.ПолучитьИдентификатор();

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

Шаг 2: Программная установка текущей строки

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

Рассмотрим код активации:


// Устанавливаем текущую строку в элементе формы "Товары"
Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;

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

Шаг 3: Передача фокуса на таблицу (ТекущийЭлемент)

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

Добавим финальный штрих в наш алгоритм:


// Передаем фокус ввода элементу "Товары"
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;

Шаг 4: Активизация конкретной колонки (ячейки)

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

Разберем полный пример совместной активации строки и колонки:


&НаКлиенте
Процедура ДобавитьИФокусировать(Команда)
    
    // 1. Добавляем строку на сервере или клиенте (зависит от логики)
    НоваяСтрока = Объект.Товары.Добавить();
    ИдСтроки = НоваяСтрока.ПолучитьИдентификатор();
    
    // 2. Указываем активную строку
    Элементы.Товары.ТекущаяСтрока = ИдСтроки;
    
    // 3. Указываем активную колонку (используем имя элемента колонки)
    Элементы.Товары.ТекущаяКолонка = Элементы.ТоварыКоличество;
    
    // 4. Устанавливаем фокус на таблицу
    ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
    
КонецПроцедуры

Обратите внимание: в свойство ТекущаяКолонка мы передаем именно объект элемента формы (колонку), а не просто её строковое имя. Мы обращаемся к ней через Элементы.ИмяКолонки.

Особенности работы с Динамическими списками

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

Посмотрим на пример активации строки в списке по известной ссылке:


&НаКлиенте
Процедура АктивироватьДокумент(НужнаяСсылка)
    
    // В динамическом списке идентификатором является ссылка
    Элементы.Список.ТекущаяСтрока = НужнаяСсылка;
    
    // Устанавливаем фокус на список
    ЭтаФорма.ТекущийЭлемент = Элементы.Список;
    
КонецПроцедуры

Распространенные ошибки и советы

Проанализируем ситуации, в которых код может не сработать:

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

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

← На главную