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

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

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

Анализ проблемы: почему все строки окрашиваются в один цвет

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

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

Правильное использование события ПриВыводеСтроки

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


Процедура ТабличноеПоле1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    
    // Проверяем номер текущей отрисовываемой строки на четность
    // Используем оператор % (остаток от деления), это проще и быстрее
    Если ДанныеСтроки.НомерСтроки % 2 = 1 Тогда
        // Нечетная строка — белый фон
        ОформлениеСтроки.Ячейки.День1.ЦветФона = Новый Цвет(255, 255, 255);
    Иначе
        // Четная строка — светло-желтый фон
        ОформлениеСтроки.Ячейки.День1.ЦветФона = Новый Цвет(255, 255, 153);
    КонецЕсли;
    
КонецПроцедуры

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

Оптимизация через событие ПриПолученииДанных

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

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


Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок)
    
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        
        // Получаем данные конкретной строки из оформления
        ТекДанные = ОформлениеСтроки.ДанныеСтроки;
        
        Если ТекДанные <> Неопределено Тогда
            Если ТекДанные.НомерСтроки % 2 = 0 Тогда
                ОформлениеСтроки.ЦветФона = WebЦвета.Бежевый;
            Иначе
                ОформлениеСтроки.ЦветФона = WebЦвета.Белый;
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Важный совет: Внутри цикла в ПриПолученииДанных старайтесь избегать обращений к базе данных или сложных вычислений. Если вам нужно раскрасить строки на основе данных, которых нет в таблице (например, остатки на складе), лучше заранее подготовить эти данные в запросе.

Особенности реализации в Управляемых формах (8.3)

Если вы работаете в современном интерфейсе «Такси» на управляемых формах, то событий ПриВыводеСтроки или ПриПолученииДанных вы не найдете. Здесь идеология платформы изменилась в сторону декларативного описания.

Проанализируем, как решить задачу в этом случае:

  1. Используйте Условное оформление формы. Это специальный раздел в настройках формы, где можно задать правила оформления без написания кода.
  2. Поскольку в условиях оформления нельзя напрямую вычислить «остаток от деления» для номера строки, программисты часто добавляют в объект (например, в табличную часть) вспомогательный реквизит ИндексСтроки или Четность.
  3. При изменении таблицы (событие ПриИзменении или ПередЗаписью) запускается небольшой цикл, который проставляет в скрытую колонку признак (0 или 1).
  4. В Условном оформлении создается правило: «Если Четность Равно 1, то ЦветФона = Желтый».

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

Выводы и рекомендации

Подводя итоги, выделим основные правила раскраски таблиц в 1С:

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

← На главную