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