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