В процессе разработки интерфейсов на обычных формах в «1С:Предприятие 8» часто возникает задача динамического выделения строк цветом. Например, когда пользователь вводит поисковый запрос в отдельное поле, система должна мгновенно подсветить желтым цветом все строки табличной части или таблицы значений, в которых найдено совпадение. В этой статье мы подробно разберем, как правильно реализовать такой функционал, разберем типичные ошибки начинающих разработчиков и оптимизируем работу с табличным полем для исключения зависаний интерфейса.
Давайте проанализируем первоначальный код, который попытался использовать автор темы:
Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Если ОформлениеСтроки.ДанныеСтроки = Подсветить_строки Тогда
ОформлениеСтроки.ЦветФона = WebЦвета.Желтый;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В данном фрагменте кроются сразу три критические ошибки, из-за которых код либо вообще не работает, либо приводит к аварийному поведению интерфейса:
ОформлениеСтроки.ДанныеСтроки возвращает прикладной объект строки (например, СтрокаТаблицыЗначений или ТекущиеДанныеСтроки), в то время как в переменной Подсветить_строки хранится обычная строка текста, введенная пользователем. Сравнение объекта со строкой напрямую через оператор равенства = всегда будет возвращать значение Ложь.ЭлементыФормы.TablichnoePole.ДобавитьСтроку(). Этот метод эмулирует интерактивное нажатие клавиши пользователем. Из-за этого платформа вынуждена перерисовывать интерфейс на каждом шаге цикла заполнения, что многократно вызывает событие ПриПолученииДанных еще до завершения формирования таблицы.Иначе для возврата цвета фона к стандартному значению.Выяснив причины некорректного поведения системы, перейдем к пошаговому решению проблемы.
Для того чтобы избежать лишних вызовов отрисовки интерфейса во время добавления строк, нам нужно работать напрямую с источником данных (коллекцией), а не с визуальным элементом формы. Выясним, какая именно таблица значений или табличная часть привязана к свойству «Данные» нашего табличного поля.
Рассмотрим правильный вариант заполнения таблицы на примере коллекции тзДанные:
Процедура КоманднаяПанельЗаполнить(Кнопка)
// Очищаем коллекцию-источник, а не визуальное поле формы
тзДанные.Очистить();
// Наполняем таблицу значений программно
Для Счетчик = 1 по 4 Цикл
НоваяСтрока = тзДанные.Добавить();
НоваяСтрока.Номер = Счетчик;
// Заполняем строковыми тестовыми значениями
Если Счетчик = 1 Тогда
НоваяСтрока.Значение = "tyu";
ИначеЕсли Счетчик = 2 Тогда
НоваяСтрока.Значение = "rty";
ИначеЕсли Счетчик = 3 Тогда
НоваяСтрока.Значение = "rte";
Иначе
НоваяСтрока.Значение = "abc";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
При таком подходе событие ПриПолученииДанных сработает всего один раз — когда платформа закончит выполнение процедуры заполнения и подготовит данные к выводу на экран. Это существенно повысит производительность формы.
Теперь напишем надежный обработчик события отрисовки строк. Нам необходимо учесть несколько важных нюансов:
СтрНайти вернет позицию 1, из-за чего вся таблица окрасится в желтый цвет. Нам нужно красить строки только тогда, когда пользователь действительно что-то ввел.Строка().НРег().Реализуем эти правила в коде:
Процедура ТабличноеПолеПриПолученииДанных(Элемент, ОформленияСтрок)
// Очищаем поисковый запрос от лишних пробелов по краям
СтрокаПоиска = СокрЛП(Подсветить_строки);
ПоискАктивен = ЗначениеЗаполнено(СтрокаПоиска);
Для каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
// Проверяем строку на наличие данных, чтобы избежать ошибок на пустых строках
Если ДанныеСтроки = Неопределено Тогда
Продолжить;
КонецЕсли;
// Приводим значение ячейки "Значение" к строковому типу
ЗначениеЯчейки = Строка(ДанныеСтроки.Значение);
// Выполняем сравнение без учета регистра символов
Если ПоискАктивен И (СтрНайти(НРег(ЗначениеЯчейки), НРег(СтрокаПоиска)) > 0) Тогда
// Подсвечиваем совпадение желтым цветом
ОформлениеСтроки.ЦветФона = WebЦвета.Желтый;
Иначе
// Возвращаем стандартный цвет оформления (сбрасываем подсветку)
ОформлениеСтроки.ЦветФона = Новый Цвет;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для того чтобы подсветка срабатывала сразу, как только пользователь изменил текст в поле поиска (а не после того, как он вручную прокрутит таблицу), нам нужно явно сообщить платформе о необходимости перерисовки табличного поля.
Добавим обработчик события ПриИзменении для нашего поля ввода на форме:
Процедура Подсветить_строкиПриИзменении(Элемент)
// Заставляем табличное поле обновить видимую область строк
ЭлементыФормы.ТабличноеПоле.ОбновитьСтроки();
КонецПроцедуры
Метод ОбновитьСтроки() принудительно вызывает процедуру ТабличноеПолеПриПолученииДанных только для тех строк таблицы, которые видны на экране в данный момент. Это позволяет форме реагировать на действия пользователя плавно и без задержек.
Применив описанный комплексный подход, мы получили стабильный, быстрый и визуально понятный инструмент для работы с табличными данными в обычных формах 1С.