Как раскрасить строки с одинаковыми значениями в динамическом списке 1С

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

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

Рассмотрим подробнее, почему стандартное условное оформление в лоб здесь не сработает. Обычно мы задаем условие типа Номер = "123", и тогда строка становится красной. Но если мы не знаем, какие номера будут в списке, нам нужен механизм, который будет определять "повторяемость" на лету. Разберем по шагам несколько эффективных методов решения этой задачи.

Метод 1: Использование вспомогательного поля в запросе динамического списка

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

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

Рассмотрим пример построения такого запроса:


ВЫБРАТЬ
    ОсновнаяТаблица.Ссылка КАК Ссылка,
    ОсновнаяТаблица.Номер КАК Номер,
    // Вычисляем порядковый номер группы значений
    (ВЫБРАТЬ
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т1.Номер)
    ИЗ
        Документ.ЗаказПокупателя КАК Т1
    ГДЕ
        Т1.Номер < ОсновнаяТаблица.Номер) % 5 КАК ИндексЦвета
ИЗ
    Документ.ЗаказПокупателя КАК ОсновнаяТаблица

В данном примере мы используем коррелированный подзапрос для подсчета количества уникальных номеров, которые "меньше" текущего. Операция % 5 (остаток от деления) позволяет нам распределить все строки по 5 цветовым категориям (0, 1, 2, 3, 4). Это гарантирует, что строки с одинаковым номером всегда получат один и тот же ИндексЦвета.

Важный момент: использование коррелированных подзапросов в динамических списках может замедлить работу при очень больших объемах данных. Если производительность критична, рассмотрим альтернативные варианты.

Метод 2: Программная настройка условного оформления

Если вы не хотите усложнять запрос или количество групп заранее ограничено, можно воспользоваться программным созданием правил в объекте УсловноеОформление. Это делается в процедуре ПриСозданииНаСервере модуля формы.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Настраиваем цвета для индексов от 0 до 4
    Цвета = Новый Массив;
    Цвета.Добавить(WebЦвета.СветлоЗеленый);
    Цвета.Добавить(WebЦвета.СветлоЖелтый);
    Цвета.Добавить(WebЦвета.СветлоГолубой);
    Цвета.Добавить(WebЦвета.Розовый);
    Цвета.Добавить(WebЦвета.Бежевый);
    
    Для Инд = 0 По 4 Цикл
        ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
        
        // Устанавливаем цвет фона
        ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Цвета[Инд]);
        
        // Условие: ИндексЦвета равен текущему числу цикла
        ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
        ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИндексЦвета");
        ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
        ЭлементОтбора.ПравоеЗначение = Инд;
        
        // Указываем, что оформляется вся строка
        ЭлементОформления.Использование = Истина;
    КонецЦикла;
    
КонецПроцедуры

В этом коде мы обращаемся к свойству Список.УсловноеОформление. Обратите внимание, что мы работаем именно с оформлением конкретного динамического списка (через КомпоновщикНастроек), что позволяет правилам применяться динамически при прокрутке списка пользователем.

Метод 3: Хеширование значений для раскраски

Иногда невозможно или слишком дорого выполнять подзапросы для нумерации групп. В таких случаях можно использовать "псевдо-хеширование". Суть метода заключается в том, чтобы взять какой-то уникальный строковый признак (например, ГУИД ссылки или сам Номер) и преобразовать его в числовое значение прямо в запросе.

Разберем, как это можно реализовать с помощью функций языка запросов 1С. Мы можем использовать функцию ПОДСТРОКА, чтобы взять определенные символы из строкового представления уникального идентификатора или номера, и по ним определить цвет.


ВЫБРАТЬ
    ОсновнаяТаблица.Ссылка КАК Ссылка,
    ВЫБОР
        КОГДА ПОДСТРОКА(ОсновнаяТаблица.Номер, 1, 1) = "А" ТОГДА 1
        КОГДА ПОДСТРОКА(ОсновнаяТаблица.Номер, 1, 1) = "Б" ТОГДА 2
        ИНАЧЕ 0
    КОНЕЦ КАК КодГруппы
ИЗ
    Документ.ЗаказПокупателя КАК ОсновнаяТаблица

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

Практические советы по оформлению

При реализации раскраски строк стоит учитывать несколько важных факторов, чтобы не ухудшить пользовательский опыт:

  1. Читаемость текста: Выбирайте пастельные, светлые тона для фона (например, WebЦвета.СветлоЖелтый). Слишком яркие или темные цвета сделают текст нечитаемым.
  2. Контрастность: Если вы красите фон в темный цвет, программно меняйте и цвет текста на белый. Это также настраивается в УсловномОформлении через параметр ЦветТекста.
  3. Альтернатива раскраске: Вместо закрашивания всей строки рассмотрите вариант добавления колонки с картинкой или цветным маркером (иконкой). Это выглядит более современно и меньше "рябит" в глазах при большом количестве данных.
  4. Производительность: Старайтесь выносить сложные вычисления в индексированные поля таблиц БД, если это возможно, чтобы динамический список открывался мгновенно.

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

← На главную