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