При формировании отчетов на Системе Компоновки Данных (СКД) часто возникает задача, когда определенное поле, например текстовый комментарий, нужно отображать в детальных записях, но скрывать в строках итогов по группировкам. В стандартном поведении СКД пытается вывести все поля, включая ресурсы, на всех уровнях отчета, что может приводить к нежелательному отображению информации в сгруппированных строках. Рассмотрим ситуацию: в отчете по продажам для каждой строки документа выводится комментарий, но в итогах по номенклатуре этот комментарий не нужен. Разберем несколько способов решения этой задачи, от самого простого пользовательского до методологически верного с точки зрения разработки.
Этот метод является самым доступным для конечного пользователя, так как выполняется в режиме 1С:Предприятие и не требует внесения изменений в конфигурацию. Идея заключается в том, чтобы не убирать поле из итогов, а просто сделать его невидимым.
Разберем по шагам:
После применения этих настроек текст комментария будет отображаться в детальных строках, но в итоговой строке по номенклатуре ячейка будет пустой.
Важный нюанс для старых конфигураций:
В некоторых старых конфигурациях (например, на платформе 8.2 или ранних версиях 8.3) в настройках условного оформления может отсутствовать вкладка или колонка "Область использования". Без нее точно указать применение оформления только к итогам сложнее. Если вы столкнулись с такой ситуацией и являетесь программистом, можно доработать форму настроек отчета, чтобы эта функциональность появилась. Для этого в процедуре ПриОткрытии() формы настроек СКД нужно программно добавить соответствующую колонку в таблицу условного оформления.
Пример кода для доработки формы:
Процедура ПриОткрытии()
ПереключитьСложностьНастройки(Истина);
ОбновлениеОтображения;
СкрытьНеИспользуемыеУзелИДочерние(КомпоновщикНастроек.Настройки);
// Добавляем колонку "ОбластьИспользования" для новой функциональности платформы
Колонка = ЭлементыФормы.УсловноеОформлениеСтраницаОформление.Колонки.Добавить("ОбластьИспользования", "Область использования");
Колонка.Данные = "ОбластьИспользования";
Колонка.УстановитьЭлементУправления(Тип("ПолеВвода"));
Колонка = ЭлементыФормы.УсловноеОформление.Колонки.Добавить("ОбластьИспользования", "Область использования");
Колонка.Данные = "ОбластьИспользования";
Колонка.УстановитьЭлементУправления(Тип("ПолеВвода"));
КонецПроцедуры
Этот способ более правильный с точки зрения архитектуры СКД. Вместо того чтобы скрывать уже выведенные данные, мы указываем системе не выводить их в принципе для итоговых записей. Этот метод также доступен в пользовательском режиме.
Проанализируем шаги:
Авто. Это означает, что СКД сама решает, какие поля выводить на этом уровне.Авто.В результате СКД при построении итоговой строки по группировке "Номенклатура" выведет только те поля, которые вы явно указали, а поле "Комментарий" будет проигнорировано. Этот метод надежнее, так как он управляет самой структурой вывода, а не просто внешним видом.
Этот метод является наиболее правильным и фундаментальным, но требует доступа к изменению схемы компоновки данных в Конфигураторе. Он идеально подходит, если вы разрабатываете отчет "с нуля" или имеете право вносить изменения в конфигурацию.
Прежде чем перейти к шагам, выясним, почему текстовое поле вообще может выводиться в итогах. СКД требует, чтобы любое поле, выводимое на уровне группировки, было либо полем этой группировки, либо агрегированным значением (ресурсом). Чтобы вывести текстовый комментарий из одной из детальных записей, разработчики часто используют "обманный" прием: оборачивают текстовое поле в агрегатную функцию, например, Максимум(Комментарий) или Минимум(Комментарий). Формально это делает поле ресурсом, и СКД его выводит.
Чтобы управлять расчетом этого ресурса, выполним следующее:
КомментарийРесурс с выражением Максимум(Регистратор.Комментарий)).Сохранив схему, вы дадите СКД прямое указание: "этот ресурс для итогов по номенклатуре не вычисляй". Соответственно, раз он не вычислен, он и не будет выведен в отчете. Это самый чистый и надежный способ управления логикой отчета.
Подведем итог: