При разработке интерфейсов на платформе 1С:Предприятие 8.3 часто возникает задача автоматизации действий пользователя. Одной из таких задач является автоматическая активация (установка курсора) на конкретную строку таблицы после выполнения программных действий — например, после добавления нового товара в корзину или при поиске дублей. В этой статье мы подробно разберем, как управлять фокусом в управляемых формах, какие свойства за это отвечают и как применять несколько приемов построения эффективных интерфейсов для удобства работы пользователей.
Рассмотрим ситуацию: у нас есть управляемая форма, на которой размещена таблица (связанная с ТабличнойЧастью объекта или ТаблицейЗначений в реквизитах формы). Нам необходимо программно сделать так, чтобы выделение в таблице переместилось на определенную строку, а сама таблица получила фокус ввода. Для решения этой задачи нам потребуется взаимодействовать с двумя уровнями системы:
Давайте разберем по шагам, как это реализовать в коде.
Прежде чем активизировать строку, её нужно найти или получить её уникальный идентификатор. В управляемых формах свойство ТекущаяСтрока элементов таблицы ожидает не индекс строки и не саму строку, а её внутренний идентификатор. Если мы программно добавляем строку, платформа возвращает нам этот идентификатор.
Проанализируем пример кода при добавлении новой строки в табличную часть:
// Добавляем новую строку в объект или реквизит формы
НоваяСтрока = Объект.Товары.Добавить();
НоваяСтрока.Количество = 1;
// Получаем идентификатор добавленной строки
ИдентификаторСтроки = НоваяСтрока.ПолучитьИдентификатор();
Если нам нужно найти уже существующую строку, мы можем использовать метод НайтиСтроки или перебор, но важно помнить, что для активации нам все равно понадобится ПолучитьИдентификатор() этой строки. Если же задача шире и требует динамического создания полей, можно изучить добавление реквизитов и элементов формы без кодирования для гибкой настройки интерфейса — для этого подойдет конструктор адаптивных рабочих столов и интерфейсов.
Теперь, когда у нас есть идентификатор, нам нужно сообщить элементу управления "Таблица", что именно эта строка должна стать активной. Для этого мы обращаемся к коллекции Элементы.
Рассмотрим код активации:
// Устанавливаем текущую строку в элементе формы "Товары"
Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
Важный нюанс: Установка свойства ТекущаяСтрока лишь выделяет строку визуально внутри таблицы, но не передает фокус самой таблице. Если до этого фокус был в поле ввода другого реквизита, он там и останется. Чтобы "прыгнуть" курсором в таблицу, нужен следующий шаг.
Для того чтобы пользователь мог сразу начать работать с активированной строкой (например, изменять количество клавишами), необходимо переключить ТекущийЭлемент всей формы на нашу таблицу. Выясним причину, почему это важно: без этого действия пользователь может не заметить, что строка изменилась, так как фокус останется на кнопке или другом поле.
Добавим финальный штрих в наш алгоритм:
// Передаем фокус ввода элементу "Товары"
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
Иногда простого выделения строки недостаточно. Например, при добавлении строки логично сразу поставить курсор в колонку "Количество" или "Номенклатура", чтобы пользователь мог мгновенно начать ввод. Для этого у элемента формы "Таблица" существует свойство ТекущаяКолонка. В более сложных сценариях может также потребоваться программное перемещение колонки динамического списка для изменения порядка отображения данных.
Разберем полный пример совместной активации строки и колонки:
&НаКлиенте
Процедура ДобавитьИФокусировать(Команда)
// 1. Добавляем строку на сервере или клиенте (зависит от логики)
НоваяСтрока = Объект.Товары.Добавить();
ИдСтроки = НоваяСтрока.ПолучитьИдентификатор();
// 2. Указываем активную строку
Элементы.Товары.ТекущаяСтрока = ИдСтроки;
// 3. Указываем активную колонку (используем имя элемента колонки)
Элементы.Товары.ТекущаяКолонка = Элементы.ТоварыКоличество;
// 4. Устанавливаем фокус на таблицу
ЭтаФорма.ТекущийЭлемент = Элементы.Товары;
КонецПроцедуры
Обратите внимание: в свойство ТекущаяКолонка мы передаем именно объект элемента формы (колонку), а не просто её строковое имя. Мы обращаемся к ней через Элементы.ИмяКолонки.
Если ваша таблица связана не с объектом, а с Динамическим списком (например, в форме списка документов), механизм остается похожим, но идентификатором строки будет выступать значение Основного ключа (обычно это Ссылка документа или элемента справочника). Для реализации дополнительных интерактивных элементов можно использовать флажок в динамическом списке в 1С 8.3.
Посмотрим на пример активации строки в списке по известной ссылке:
&НаКлиенте
Процедура АктивироватьДокумент(НужнаяСсылка)
// В динамическом списке идентификатором является ссылка
Элементы.Список.ТекущаяСтрока = НужнаяСсылка;
// Устанавливаем фокус на список
ЭтаФорма.ТекущийЭлемент = Элементы.Список;
КонецПроцедуры
Проанализируем ситуации, в которых код может не сработать:
ТекущийЭлемент и управление фокусом доступны только на клиенте. Если вы выполняете программное изменение форм и меняете данные на сервере, возвращайте идентификатор строки на клиент.ТекущаяСтрока, а только потом ТекущийЭлемент. В некоторых случаях платформа может сбросить фокус, если данные еще не "прогрузились" в интерфейсе.Видимость или Доступность установлено в значение Ложь. Проверить или изменить эти параметры в реальном времени поможет редактор форм в режиме предприятия — также поможет конструктор произвольных документов и реквизитов без программирования.ОбновитьОтображениеДанных(), чтобы таблица корректно восприняла установку текущей строки.Используя эти методы, мы можем создавать интуитивно понятные интерфейсы, которые экономят время пользователя, избавляя его от лишних кликов мышью. Помните, что грамотное управление фокусом — это важная часть культуры разработки на 1С.