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