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