Как убрать автоматическое выделение первой строки в таблице при открытии формы в 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

Часто при разработке на платформе 1С 8.3 в режиме управляемых форм (интерфейс "Такси") возникает задача: при открытии формы документа, содержащей табличную часть, система автоматически устанавливает курсор на первую строку и подсвечивает ее как текущую. С точки зрения юзабилити это логично, но иногда по требованиям дизайна или логики интерфейса такое выделение нужно убрать, чтобы все строки таблицы выглядели одинаково.

В этой статье мы подробно разберем, почему стандартные методы не работают "в лоб" и какие существуют надежные способы решения этой задачи.

Причина проблемы: порядок событий при открытии формы

Первая мысль, которая приходит в голову, — это просто сбросить текущую строку в событии ПриОткрытии формы. Например, так:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    Элементы.ИмяТабличнойЧасти.ТекущаяСтрока = Неопределено;
КонецПроцедуры

Однако этот код не сработает. Выясним причину. Дело в том, что стандартные механизмы платформы по инициализации формы и установке фокуса на первый доступный элемент выполняются уже после того, как отработал наш код в обработчике ПриОткрытии. Получается, мы сбрасываем выделение, а сразу после этого платформа его снова устанавливает. Это не ошибка, а штатное поведение, направленное на удобство пользователя.

Наша задача — выполнить сброс выделения уже после того, как платформа завершит все свои действия по открытию формы. Для этого существует несколько проверенных подходов.

Решение 1: Программное снятие выделения через обработчик ожидания

Это самый распространенный и надежный способ. Идея заключается в том, чтобы запланировать выполнение нашего кода с небольшой задержкой. За это время платформа успеет отработать свою логику, и уже после этого мы сможем безопасно изменить состояние элементов формы.

Для этого используется механизм обработчиков ожидания. Разберем по шагам, как его настроить.

  1. Создаем процедуру, которая будет сбрасывать выделение. Эта процедура будет вызвана с задержкой. В ней мы присваиваем свойству ТекущаяСтрока значение Неопределено.

    
    &НаКлиенте
    Процедура СброситьВыделениеТаблицы()
        // Указываем имя элемента-таблицы на форме
        Элементы.ОтборочныеДокументы.ТекущаяСтрока = Неопределено;
    КонецПроцедуры
    
  2. Подключаем обработчик ожидания в событии ПриОткрытии. Мы "просим" платформу вызвать нашу процедуру через короткий промежуток времени (например, 0.1 секунды) и сделать это только один раз.

    
    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
        // Подключаем однократный вызов процедуры "СброситьВыделениеТаблицы"
        // с интервалом 0.1 секунды.
        ПодключитьОбработчикОжидания("СброситьВыделениеТаблицы", 0.1, Истина);
    КонецПроцедуры
    

Рассмотрим подробнее параметры функции ПодключитьОбработчикОжидания:

Этот метод решает проблему полностью: форма открывается, платформа устанавливает фокус, а затем наш отложенный код убирает выделение со строки. Пользователь видит таблицу с одинаковыми строками без подсветки.

Решение 2: Использование условного оформления

Если задача состоит исключительно в том, чтобы визуально убрать подсветку, можно обойтись без программирования и использовать условное оформление. При этом строка фактически останется текущей, но для пользователя она не будет отличаться от остальных.

Этот подход полезен, если вы не хотите вмешиваться в логику работы с текущей строкой, а хотите лишь изменить внешний вид.

Как это работает:

Идея в том, чтобы создать правило оформления, которое для выделенной строки будет применять те же цвета фона и текста, что и для обычных, тем самым "маскируя" стандартную подсветку.

Настроить это можно в палитре свойств элемента формы (таблицы) на закладке Условное оформление. Вам нужно создать новый элемент оформления, который будет переопределять стандартный стиль выделения. Например, можно задать для поля ЦветФона стандартный белый цвет, а для ЦветТекста — стандартный черный. Условие применения этого оформления должно быть таким, чтобы оно срабатывало для текущей строки, что не всегда тривиально настроить в конструкторе. Однако, в простых случаях, это может быть хорошей альтернативой коду.

Решение 3: Программный перевод фокуса на другой элемент

Еще один способ — не сбрасывать выделение, а просто переместить фокус ввода на другой элемент формы. Когда табличная часть теряет фокус, выделение текущей строки либо снимается, либо меняет свой вид на менее заметный (зависит от настроек платформы и ОС).

Этот метод также реализуется через обработчик ожидания.

Посмотрим на пример:


&НаКлиенте
Процедура ПеревестиФокус()
    // Устанавливаем фокус на какой-нибудь другой элемент формы.
    // Это может быть поле ввода или даже невидимый для пользователя элемент,
    // например, декорация-надпись.
    ТекущийЭлемент = Элементы.ПолеДляФокуса;
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ПодключитьОбработчикОжидания("ПеревестиФокус", 0.1, Истина);
КонецПроцедуры

Этот способ удобен, если по бизнес-логике пользователь после открытия формы должен сразу начать работать не с таблицей, а, например, с полем для ввода комментария или даты.

Итоги

Проанализировав ситуацию, мы приходим к выводу, что автоматическое выделение строки — это штатный механизм платформы 1С. Для его изменения требуется действовать "в обход", дожидаясь завершения стандартных процедур открытия формы.

Выбор конкретного метода зависит от конечной цели, но теперь вы вооружены знаниями для решения этой задачи в любой ситуации.

← На главную