В процессе разработки интерфейсов на управляемых формах часто возникает задача визуального разделения данных. Одной из самых интересных и в то же время непростых задач является раскраска строк с одинаковыми значениями в динамическом списке, когда сами эти значения заранее неизвестны. Например, у нас есть список заказов, и мы хотим, чтобы строки с одинаковым номером артикула или контрагентом подсвечивались одним цветом, создавая визуальные группы.
Рассмотрим подробнее, почему стандартное условное оформление в лоб здесь не сработает. Обычно мы задаем условие типа Номер = "123", и тогда строка становится красной. Но если мы не знаем, какие номера будут в списке, нам нужен механизм, который будет определять "повторяемость" на лету. Разберем по шагам несколько эффективных методов решения этой задачи.
Проанализируем ситуацию: чтобы платформа поняла, каким цветом красить строку, ей нужно передать какой-то признак. Самый стабильный способ — добавить в запрос динамического списка вычисляемое поле, которое будет возвращать "индекс цвета".
Выясним причину, почему это удобно: динамический список работает через систему компоновки данных (СКД). Если мы в запросе свяжем основную таблицу с таблицей уникальных значений, мы сможем присвоить каждой группе свой порядковый номер.
Рассмотрим пример построения такого запроса:
ВЫБРАТЬ
ОсновнаяТаблица.Ссылка КАК Ссылка,
ОсновнаяТаблица.Номер КАК Номер,
// Вычисляем порядковый номер группы значений
(ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т1.Номер)
ИЗ
Документ.ЗаказПокупателя КАК Т1
ГДЕ
Т1.Номер < ОсновнаяТаблица.Номер) % 5 КАК ИндексЦвета
ИЗ
Документ.ЗаказПокупателя КАК ОсновнаяТаблица
В данном примере мы используем коррелированный подзапрос для подсчета количества уникальных номеров, которые "меньше" текущего. Операция % 5 (остаток от деления) позволяет нам распределить все строки по 5 цветовым категориям (0, 1, 2, 3, 4). Это гарантирует, что строки с одинаковым номером всегда получат один и тот же ИндексЦвета.
Важный момент: использование коррелированных подзапросов в динамических списках может замедлить работу при очень больших объемах данных. Если производительность критична, рассмотрим альтернативные варианты.
Если вы не хотите усложнять запрос или количество групп заранее ограничено, можно воспользоваться программным созданием правил в объекте УсловноеОформление. Это делается в процедуре ПриСозданииНаСервере модуля формы.
Проанализируем алгоритм действий: нам нужно создать элементы оформления для каждого возможного значения индекса, который мы вычислили в запросе. Посмотрим на пример кода:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Настраиваем цвета для индексов от 0 до 4
Цвета = Новый Массив;
Цвета.Добавить(WebЦвета.СветлоЗеленый);
Цвета.Добавить(WebЦвета.СветлоЖелтый);
Цвета.Добавить(WebЦвета.СветлоГолубой);
Цвета.Добавить(WebЦвета.Розовый);
Цвета.Добавить(WebЦвета.Бежевый);
Для Инд = 0 По 4 Цикл
ЭлементОформления = Список.УсловноеОформление.Элементы.Добавить();
// Устанавливаем цвет фона
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Цвета[Инд]);
// Условие: ИндексЦвета равен текущему числу цикла
ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИндексЦвета");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Инд;
// Указываем, что оформляется вся строка
ЭлементОформления.Использование = Истина;
КонецЦикла;
КонецПроцедуры
В этом коде мы обращаемся к свойству Список.УсловноеОформление. Обратите внимание, что мы работаем именно с оформлением конкретного динамического списка (через КомпоновщикНастроек), что позволяет правилам применяться динамически при прокрутке списка пользователем.
Иногда невозможно или слишком дорого выполнять подзапросы для нумерации групп. В таких случаях можно использовать "псевдо-хеширование". Суть метода заключается в том, чтобы взять какой-то уникальный строковый признак (например, ГУИД ссылки или сам Номер) и преобразовать его в числовое значение прямо в запросе.
Разберем, как это можно реализовать с помощью функций языка запросов 1С. Мы можем использовать функцию ПОДСТРОКА, чтобы взять определенные символы из строкового представления уникального идентификатора или номера, и по ним определить цвет.
ВЫБРАТЬ
ОсновнаяТаблица.Ссылка КАК Ссылка,
ВЫБОР
КОГДА ПОДСТРОКА(ОсновнаяТаблица.Номер, 1, 1) = "А" ТОГДА 1
КОГДА ПОДСТРОКА(ОсновнаяТаблица.Номер, 1, 1) = "Б" ТОГДА 2
ИНАЧЕ 0
КОНЕЦ КАК КодГруппы
ИЗ
Документ.ЗаказПокупателя КАК ОсновнаяТаблица
Хотя этот метод менее точен (разные группы могут получить один цвет), он работает значительно быстрее, так как не требует вложенных циклов сканирования таблицы в базе данных.
При реализации раскраски строк стоит учитывать несколько важных факторов, чтобы не ухудшить пользовательский опыт:
WebЦвета.СветлоЖелтый). Слишком яркие или темные цвета сделают текст нечитаемым.УсловномОформлении через параметр ЦветТекста.Подведем итог: наиболее гибким и правильным решением является комбинация вычисляемого индекса в запросе и настройки правил условного оформления. Это позволяет системе автоматически группировать визуально похожие данные, даже если состав этих данных постоянно меняется. Рассмотренные методы позволяют добиться профессионального вида интерфейса, облегчая работу конечного пользователя с большими массивами информации.