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

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

В процессе разработки интерфейсов на обычных формах в «1С:Предприятие 8» часто возникает задача динамического выделения строк цветом. Например, когда пользователь вводит поисковый запрос в отдельное поле, система должна мгновенно подсветить желтым цветом все строки табличной части или таблицы значений, в которых найдено совпадение. В этой статье мы подробно разберем, как правильно реализовать такой функционал, разберем типичные ошибки начинающих разработчиков и оптимизируем работу с табличным полем для исключения зависаний интерфейса.

Почему не работает простое сравнение и «зависает» отладчик?

Давайте проанализируем первоначальный код, который попытался использовать автор темы:


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

В данном фрагменте кроются сразу три критические ошибки, из-за которых код либо вообще не работает, либо приводит к аварийному поведению интерфейса:

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

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

Шаг 1. Правильное наполнение таблицы значений

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

Рассмотрим правильный вариант заполнения таблицы на примере коллекции тзДанные:


Процедура КоманднаяПанельЗаполнить(Кнопка)
    // Очищаем коллекцию-источник, а не визуальное поле формы
    тзДанные.Очистить();
    
    // Наполняем таблицу значений программно
    Для Счетчик = 1 по 4 Цикл
        НоваяСтрока = тзДанные.Добавить();
        НоваяСтрока.Номер = Счетчик;
        
        // Заполняем строковыми тестовыми значениями
        Если Счетчик = 1 Тогда
            НоваяСтрока.Значение = "tyu";
        ИначеЕсли Счетчик = 2 Тогда
            НоваяСтрока.Значение = "rty";
        ИначеЕсли Счетчик = 3 Тогда
            НоваяСтрока.Значение = "rte";
        Иначе
            НоваяСтрока.Значение = "abc";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

Шаг 2. Реализация поиска в событии ПриПолученииДанных

Теперь напишем надежный обработчик события отрисовки строк. Нам необходимо учесть несколько важных нюансов:

Реализуем эти правила в коде:


Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)
    // Очищаем поисковый запрос от лишних пробелов по краям
    СтрокаПоиска = СокрЛП(Подсветить_строки);
    ПоискАктивен = ЗначениеЗаполнено(СтрокаПоиска);
    
    Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
        
        // Проверяем строку на наличие данных, чтобы избежать ошибок на пустых строках
        Если ДанныеСтроки = Неопределено Тогда
            Продолжить;
        КонецЕсли;
        
        // Приводим значение ячейки "Значение" к строковому типу
        ЗначениеЯчейки = Строка(ДанныеСтроки.Значение);
        
        // Выполняем сравнение без учета регистра символов
        Если ПоискАктивен И (СтрНайти(НРег(ЗначениеЯчейки), НРег(СтрокаПоиска)) > 0) Тогда
            // Подсвечиваем совпадение желтым цветом
            ОформлениеСтроки.ЦветФона = WebЦвета.Желтый;
        Иначе
            // Возвращаем стандартный цвет оформления (сбрасываем подсветку)
            ОформлениеСтроки.ЦветФона = Новый Цвет;
        КонецЕсли;        
    КонецЦикла;
КонецПроцедуры

Шаг 3. Мгновенный отклик интерфейса при вводе

Для того чтобы подсветка срабатывала сразу, как только пользователь изменил текст в поле поиска (а не после того, как он вручную прокрутит таблицу), нам нужно явно сообщить платформе о необходимости перерисовки табличного поля.

Добавим обработчик события ПриИзменении для нашего поля ввода на форме:


Процедура Подсветить_строкиПриИзменении(Элемент)
    // Заставляем табличное поле обновить видимую область строк
    ЭлементыФормы.ТабличноеПоле.ОбновитьСтроки();
КонецПроцедуры

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

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

← На главную