При разработке сложных отчетов на системе компоновки данных (СКД) часто возникает задача визуального разделения строк, относящихся к разным документам-регистраторам. Это особенно актуально, когда в одной группировке выводится множество детальных записей, и пользователю нужно быстро определить границы данных одного документа. В рамках данной статьи мы разберем по шагам несколько эффективных методов реализации этой задачи: от простых настроек в запросе до продвинутого программного управления оформлением.
Проанализируем самый простой и производительный способ, который не требует написания сложного программного кода. Идея заключается в том, чтобы на уровне получения данных присвоить каждому уникальному регистратору некий цифровой индекс, который затем будет использован в условном оформлении.
Рассмотрим алгоритм реализации в тексте запроса:
ИндексЦвета) в основной набор данных.Пример логики запроса может выглядеть так:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Продажи.Регистратор КАК Регистратор
ПОМЕСТИТЬ ВТ_Документы
ИЗ
РегистрНакопления.Продажи КАК Продажи;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Продажи.Регистратор,
Продажи.Номенклатура,
Продажи.Количество,
(ВЫРАЗИТЬ(ВТ_Документы.Регистратор КАК Строка)) КАК ПолеДляГруппировки
ИЗ
РегистрНакопления.Продажи КАК Продажи
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Документы КАК ВТ_Документы
ПО Продажи.Регистратор = ВТ_Документы.Регистратор
После получения данных в СКД, на закладке "Условное оформление", мы можем добавить правила: "Если ИндексЦвета равен 1, то цвет фона — красный", "Если 2 — зеленый" и так далее. Этот метод отлично работает, если количество документов в выборке невелико и ограничено заранее известным набором цветов.
Если количество документов заранее неизвестно, мы можем применить математический подход. Выясним причину, по которой это удобно: нам не нужно создавать сотни правил оформления вручную. Мы можем вычислить индекс цвета на лету, используя уникальный идентификатор (GUID) документа.
Для этого в СКД на закладке "Вычисляемые поля" добавим поле ЦветовойИндекс. В выражении можно использовать функции работы со строками. Например, возьмем последний символ из строкового представления уникального идентификатора ссылки и преобразуем его в число.
Рассмотрим подробнее пример выражения:
ВычислитьВыражение("Подстрока(Строка(Регистратор.УникальныйИдентификатор()), 36, 1)")
Такой подход позволит распределить документы по 16 различным цветовым категориям (от 0 до 9 и от A до F). В условном оформлении останется прописать всего 16 правил для каждого возможного символа.
Для наиболее гибкой настройки, когда цвета должны назначаться динамически для каждого нового документа в отчете, необходимо использовать программный метод. Проанализируем ситуацию: нам нужно перехватить процесс компоновки результата и добавить элементы оформления в настройки компоновщика.
В модуле объекта отчета необходимо переопределить процедуру ПриКомпоновкеРезультата. Выполним следующие действия:
Посмотрим на пример программного кода:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Сформируем схему и настройки
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
// Здесь мы можем проанализировать данные и добавить оформление
// Например, получить список всех документов из результата запроса
// Для каждого документа ДокСсылка из списка:
ЭлементОформления = КомпоновщикНастроек.Настройки.УсловноеОформление.Элементы.Добавить();
ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", Новый Цвет(255, 200, 200)); // Пример цвета
ЭлементУсловия = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементУсловия.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Регистратор");
ЭлементУсловия.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементУсловия.ПравоеЗначение = ДокСсылка;
ЭлементУсловия.Использование = Истина;
// Завершаем вывод отчета
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Важный момент: при использовании программного метода стоит учитывать производительность. Если документов тысячи, создание тысяч элементов условного оформления может замедлить работу системы. Оптимально ограничивать количество цветов или использовать их циклически.
Если логика определения цвета сложная, ее лучше вынести в общий модуль. В выражении вычисляемого поля СКД или в параметре условного оформления можно напрямую вызвать функцию 1С. Убедитесь, что у общего модуля установлены флаги "Вызов сервера" и "Клиент".
Например, создадим функцию ПолучитьКодЦвета(Регистратор), которая возвращает числовой индекс на основе внутренней логики (например, остаток от деления номера документа на 10). В СКД выражение будет выглядеть так: ИмяОбщегоМодуля.ПолучитьКодЦвета(Регистратор).
При реализации раскраски по регистратору рекомендуем придерживаться следующих правил:
Таким образом, мы выяснили, что СКД предоставляет богатый инструментарий для решения задачи цветового выделения. Выбор конкретного метода зависит от ваших навыков программирования и требований к гибкости отчета.