При разработке отчетов в 1С программисты часто сталкиваются с необходимостью визуального выделения данных, например, раскрашивания ячеек в зависимости от определенных условий (положительные или отрицательные изменения). В старых конфигурациях на обычных формах часто использовался Конструктор выходной формы (Построитель отчетов), однако современным стандартом является Система компоновки данных (СКД). Рассмотрим подробно, как перейти от простых конструкторов к мощному функционалу СКД, реализовать цветовое оформление и решить сопутствующие проблемы с параметрами.
Разберем ситуацию, когда отчет создан через старый конструктор. Построитель отчетов — это инструмент прошлого поколения. Как отмечают опытные разработчики, он практически не поддерживается в управляемых приложениях и обладает ограниченными возможностями кастомизации. Использование СКД позволяет не только легко «красить» ячейки, но и дает пользователю возможность самостоятельно менять настройки отчета без изменения кода. Рассмотрим, как реализовать задачу визуализации именно в системе компоновки.
Для того чтобы раскрасить ячейку (например, колонку «Изменение») в зависимости от значения, нам не потребуется писать код. Выполним следующие шаги в схеме компоновки данных:
Цвет фона и укажем нужный цвет (например, WebЦвета.Зеленый для положительных значений).Изменение Больше 0.Аналогичным образом создадим второе правило для отрицательных значений, выбрав красный цвет и условие Изменение Меньше 0. Проанализируем преимущество такого подхода: система автоматически применит оформление ко всем строкам, включая итоги, если это не ограничено настройками.
Часто при переходе на СКД возникает вопрос: как передать в запрос параметры, которые хранятся в сеансе пользователя (например, ТекущийМагазин)? В обычном коде это делалось простым присваиванием, но в СКД есть более изящный способ. Разберем его по шагам:
Магазин.ПараметрыСеанса.ТекущийМагазин.Теперь система при формировании отчета самостоятельно обратится к глобальному контексту и подставит значение. Это избавляет нас от необходимости писать лишний программный код в модуле объекта отчета.
Если логика требует программного вмешательства (например, в зависимости от прав доступа), мы можем установить параметр в модуле объекта отчета перед его формированием. Посмотрим на пример кода, который выполняет эту задачу:
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отключаем стандартный вывод, чтобы управлять процессом
// Получаем настройки пользователя
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Ищем нужный параметр
ПараметрМагазин = Настройки.ПараметрыДанных.Элементы.Найти("Магазин");
Если ПараметрМагазин <> Неопределено Тогда
ПараметрМагазин.Значение = ПараметрыСеанса.ТекущийМагазин;
ПараметрМагазин.Использование = Истина;
КонецЕсли;
// Продолжаем компоновку с новыми настройками
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Существует еще один профессиональный прием: если условия раскрашивания слишком сложные (например, зависят от остатков на нескольких складах и категории товара), логику определения «цветового статуса» можно вынести прямо в запрос. Выясним, как это работает.
В тексте запроса мы создаем дополнительное поле, используя конструкцию ВЫБОР:
ВЫБРАТЬ
Продажи.Сумма КАК Сумма,
ВЫБОР
КОГДА Продажи.Сумма > 1000 ТОГДА 1
КОГДА Продажи.Сумма < 0 ТОГДА 2
ИНАЧЕ 0
КОНЕЦ КАК СтатусЦвета
ИЗ
РегистрНакопления.Продажи КАК Продажи
После этого в Условном оформлении СКД мы привязываем цвет фона к значению поля СтатусЦвета. Поле СтатусЦвета можно даже не выводить в сам отчет, оставив его в списке доступных полей для оформления. Это позволяет централизовать логику в одном месте — в запросе.
Если проект жестко ограничен рамками старого кода и переход на СКД пока невозможен, рассмотрим способ раскрашивания ячеек при использовании ПостроительОтчета. В этом случае нам придется работать с событием вывода строки.
Если вывод идет через табличное поле на форме, используйте событие ПриВыводеСтроки:
Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.Изменение < 0 Тогда
ОформлениеСтроки.Ячейки.Изменение.ЦветФона = WebЦвета.СветлоРозовый;
ИначеЕсли ДанныеСтроки.Изменение > 0 Тогда
ОформлениеСтроки.Ячейки.Изменение.ЦветФона = WebЦвета.БледноЗеленый;
КонецЕсли;
КонецПроцедуры
Если же отчет выводится в Табличный документ через цикл или через метод Вывести() построителя, необходимо обращаться к области ячеек. Проанализируем пример прямого управления цветом:
// Пример управления цветом в Табличном документе
Область = Макет.ПолучитьОбласть("Строка");
// Заполнение параметров области...
Если ЗначениеИзменения < 0 Тогда
Область.Область("Изменение").ЦветФона = WebЦвета.Красный;
КонецЕсли;
ТабДок.Вывести(Область);
Важно: Прямое управление цветом через код делает отчет менее гибким. Помните, что жесткое использование системных цветов RGB может привести к плохой читаемости на разных мониторах. Всегда старайтесь использовать палитру WebЦвета или стили оформления 1С.
Подводя итог, можно сказать, что для современных конфигураций (даже работающих на обычных формах) СКД является приоритетным инструментом. Она позволяет решать задачи раскрашивания ячеек и управления параметрами сеанса максимально быстро и без «костылей» в коде. Переход с конструкторов на СКД — это важный этап профессионального роста разработчика 1С, который значительно упрощает поддержку и развитие системы в будущем.