Как реализовать раскраску строк с одинаковыми датами в таблице 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

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

Проблема стандартных механизмов

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

Метод 1: Реализация «Зебры» для групп данных

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

Шаг 1. Подготовка структуры данных

Для начала добавим в нашу таблицу (это может быть ТаблицаЗначений или ДанныеФормыКоллекция) вспомогательную невидимую колонку. Назовем ее ИндексЦвета с типом Число или Булево.

Шаг 2. Алгоритм расчета индексов

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


// Процедура рассчитывает индексы для чередования цветов групп
&НаСервере
Процедура РасчитатьИндексыЦветовНаСервере()
    
    // Предполагаем, что таблица отсортирована по дате
    ПредыдущаяДата = '00010101';
    ТекущийИндекс = 0;
    
    Для Каждого СтрокаТЧ Из Объект.НашаТаблица Цикл
        Если СтрокаТЧ.Дата <> ПредыдущаяДата Тогда
            // Как только дата изменилась, переключаем индекс (0 -> 1 или 1 -> 0)
            ТекущийИндекс = ?(ТекущийИндекс = 0, 1, 0);
            ПредыдущаяДата = СтрокаТЧ.Дата;
        КонецЕсли;
        
        СтрокаТЧ.ИндексЦвета = ТекущийИндекс;
    КонецЦикла;
    
КонецПроцедуры

Шаг 3. Настройка условного оформления

Теперь нам достаточно создать всего одно или два правила в коллекции УсловноеОформление на уровне формы. Разберем, как сделать это программно в процедуре ПриСозданииНаСервере:


// Настройка правила оформления для строк с индексом 1
ЭлементОформления = УсловноеОформление.Элементы.Добавить();

// Указываем, какое поле будем раскрашивать (или всю строку)
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("НашаТаблица");

// Устанавливаем условие: ИндексЦвета Равно 1
ОтборОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ОтборОформления.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.НашаТаблица.ИндексЦвета");
ОтборОформления.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ОтборОформления.ПравоеЗначение = 1;

// Устанавливаем сам цвет фона
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Lavender);

Метод 2: Алгоритмическая генерация цвета (Хеширование)

Если заказчик настаивает на том, что каждая дата должна иметь свой уникальный оттенок, мы можем использовать математический подход. Это избавит нас от необходимости хранить карту соответствий «Дата — Цвет».

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

Пример реализации алгоритма:

  1. Создадим массив из 10–15 приятных для глаз цветов.
  2. Для каждой строки вычислим: Индекс = (День(Дата) + Месяц(Дата)) % КоличествоЦветовВМассиве.
  3. Запишем этот индекс в скрытую колонку и настроим правила УсловноеОформление для каждого возможного индекса.

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

Особенности работы с Динамическими списками

Если ваша таблица — это ДинамическийСписок, то прямое изменение строк в цикле невозможно. В этом случае проанализируем два пути:

  1. Вычисляемое поле в запросе: Можно попытаться вычислить признак изменения даты через оконные функции (если СУБД позволяет) или вложенные запросы. Однако в 1С это часто приводит к падению производительности списка.
  2. Группировка: Самый простой и «типовой» способ. Вместо раскраски предложите клиенту включить стандартную группировку по колонке Дата. Это визуально разделит данные на блоки с заголовками, что гораздо удобнее для восприятия.

Важные замечания по интерактивности

Рассмотрим ситуацию, когда пользователь меняет дату прямо в строке таблицы. В этот момент визуальная целостность «зебры» может нарушиться. Чтобы этого избежать, необходимо:

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

← На главную