Как реализовать выделение ячеек цветом по регистратору в СКД

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

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

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

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

Рассмотрим алгоритм реализации в тексте запроса:

  1. Сначала выберем все уникальные регистраторы во временную таблицу.
  2. Используем механизм автонумерации или связей, чтобы сопоставить каждому документу число от 1 до N.
  3. Добавим это числовое поле (назовем его ИндексЦвета) в основной набор данных.

Пример логики запроса может выглядеть так:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    Продажи.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_Документы
ИЗ
    РегистрНакопления.Продажи КАК Продажи;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Продажи.Регистратор,
    Продажи.Номенклатура,
    Продажи.Количество,
    (ВЫРАЗИТЬ(ВТ_Документы.Регистратор КАК Строка)) КАК ПолеДляГруппировки
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Документы КАК ВТ_Документы
    ПО Продажи.Регистратор = ВТ_Документы.Регистратор

После получения данных в СКД, на закладке "Условное оформление", мы можем добавить правила: "Если ИндексЦвета равен 1, то цвет фона — красный", "Если 2 — зеленый" и так далее. Этот метод отлично работает, если количество документов в выборке невелико и ограничено заранее известным набором цветов.

Метод 2: Использование вычисляемых полей и хеширования

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

Для этого в СКД на закладке "Вычисляемые поля" добавим поле ЦветовойИндекс. В выражении можно использовать функции работы со строками. Например, возьмем последний символ из строкового представления уникального идентификатора ссылки и преобразуем его в число.

Рассмотрим подробнее пример выражения:

ВычислитьВыражение("Подстрока(Строка(Регистратор.УникальныйИдентификатор()), 36, 1)")

Такой подход позволит распределить документы по 16 различным цветовым категориям (от 0 до 9 и от A до F). В условном оформлении останется прописать всего 16 правил для каждого возможного символа.

Метод 3: Программное формирование оформления в модуле отчета

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

В модуле объекта отчета необходимо переопределить процедуру ПриКомпоновкеРезультата. Выполним следующие действия:

  1. Получим данные из запроса во временную таблицу или таблицу значений.
  2. Выделим список уникальных регистраторов.
  3. Для каждого регистратора программно создадим элемент условного оформления.

Посмотрим на пример программного кода:


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

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

Метод 4: Вызов функций общих модулей в СКД

Если логика определения цвета сложная, ее лучше вынести в общий модуль. В выражении вычисляемого поля СКД или в параметре условного оформления можно напрямую вызвать функцию 1С. Убедитесь, что у общего модуля установлены флаги "Вызов сервера" и "Клиент".

Например, создадим функцию ПолучитьКодЦвета(Регистратор), которая возвращает числовой индекс на основе внутренней логики (например, остаток от деления номера документа на 10). В СКД выражение будет выглядеть так: ИмяОбщегоМодуля.ПолучитьКодЦвета(Регистратор).

Рекомендации по визуализации

При реализации раскраски по регистратору рекомендуем придерживаться следующих правил:

Таким образом, мы выяснили, что СКД предоставляет богатый инструментарий для решения задачи цветового выделения. Выбор конкретного метода зависит от ваших навыков программирования и требований к гибкости отчета.

← На главную