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