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

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Разбор проблемы и выбор подхода

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

Для реализации динамической подсветки мы будем использовать связку из двух инструментов: запоминание текущей строки и принудительное обновление табличного поля.

Шаг 1: Запоминание активной строки

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

Допустим, мы определили в модуле переменные или реквизиты формы. В процедуре активизации мы фиксируем выбранный элемент:


Процедура ТаблицаПриАктивизацииСтроки(Элемент)
    // Фиксируем текущую строку для последующего использования в оформлении
    ТекущаяСтрокаФормы = ЭлементыФормы.тпТаблица.ТекущаяСтрока;
    
    // Принудительно вызываем обновление отображения, чтобы изменения вступили в силу немедленно
    ЭлементыФормы.тпТаблица.ОбновитьСтроки();
КонецПроцедуры

Шаг 2: Реализация оформления в событии «ПриВыводеСтроки»

Теперь, когда мы знаем, какая строка является «активной» (текущей), мы можем управлять ее визуальным стилем в процедуре ПриВыводеСтроки. Это событие вызывается для каждой отрисовываемой строки таблицы, что позволяет нам гибко менять шрифт, цвет фона или текста.

Разберем пример реализации логики подсвечивания:


Процедура тпТаблицаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Проверяем, совпадает ли выводимая строка с той, которую мы активировали
    Если ОформлениеСтроки.ДанныеСтроки = ЭлементыФормы.тпТаблица.ТекущаяСтрока Тогда
        // Применяем специфическое оформление для активной строки
        ОформлениеСтроки.Шрифт = Новый Шрифт(,, Истина); // Устанавливаем полужирный шрифт
        // При необходимости можно изменить цвет фона:
        // ОформлениеСтроки.ЦветФона = WebЦвета.СветлоЖелтый;
    КонецЕсли;
КонецПроцедуры

Почему это работает

Использование метода ОбновитьСтроки() является ключевым моментом. Без него табличное поле дожидается следующего естественного события перерисовки, что создает эффект «запаздывания». Вызывая ОбновитьСтроки() в обработчике ПриАктивизацииСтроки, мы заставляем форму немедленно пересчитать оформление для всех видимых строк, проходя через процедуру ПриВыводеСтроки.

Рекомендации по оптимизации

При работе с табличными полями важно учитывать следующие аспекты производительности:

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

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

← На главную