Как настроить корректное отображение итогов по группам в отчете на Системе Компоновки Данных (СКД) в 1С 8.3?

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

При работе с отчетами на Системе Компоновки Данных (СКД) в платформе 1С 8.3 мы часто сталкиваемся с необходимостью гибко настраивать отображение итогов. Одна из распространенных задач — это корректное выведение итогов по группам, особенно когда требуется показывать агрегированные данные по одному измерению, но не по другому. Например, нам нужно увидеть общие продажи по менеджерам, но не по контрагентам внутри каждого менеджера, или, наоборот, показать итоги только по верхнему уровню группировки. Давайте подробно рассмотрим, как мы можем решить эту проблему с помощью различных настроек СКД и программных методов, чтобы добиться желаемого вида отчета.

Мы будем разбирать несколько подходов, каждый из которых имеет свои преимущества и может быть применен в зависимости от конкретных требований к отчету. Наша цель — не просто найти решение, а понять принципы работы СКД с итогами, чтобы в будущем мы могли самостоятельно адаптировать отчеты под любые нужды.

1. Анализируем исходную проблему: некорректное отображение итогов

Прежде всего, давайте выясним, в чем заключается основная проблема. Автор темы столкнулся с ситуацией, когда в отчете на СКД итоги по группам выводятся не так, как ожидалось. Представим, что у нас есть отчет с группировками по "Менеджеру" и "Номенклатуре", и мы хотим видеть итоги продаж по "Менеджеру", но не по "Номенклатуре" внутри менеджера. По умолчанию СКД может выводить итоги на каждом уровне группировки, что приводит к избыточности или некорректному агрегированию.

Типичный пример: у нас есть данные о продажах, где строки отчета представляют собой отдельные позиции номенклатуры. Мы группируем их по "Менеджеру", а затем по "Номенклатуре". Мы хотим, чтобы в конце каждой группы "Менеджер" отображалась сумма продаж только по этому менеджеру, без промежуточных итогов по номенклатуре. Однако СКД по умолчанию может выводить итоги и по номенклатуре, что путает общую картину.

2. Настройка ресурсов СКД для управления итогами

Первый и наиболее очевидный способ управлять отображением итогов — это настройка ресурсов непосредственно в макете СКД. Мы должны четко определить, какие поля являются ресурсами и на каких уровнях группировки они должны агрегироваться.

Перейдем в режим конфигуратора и откроем схему компоновки данных нашего отчета. Найдем вкладку "Ресурсы". Здесь мы увидим список всех полей, которые могут быть агрегированы (например, "СуммаПродаж", "Количество"). Для каждого ресурса мы можем указать функцию агрегации (СУММА, МАКСИМУМ, МИНИМУМ, СРЕДНЕЕ и т.д.) и, что критично для нашей задачи, список "Ролей полей", по которым этот ресурс будет рассчитываться.

  1. Выбираем ресурс: В списке ресурсов выделите тот ресурс, по которому вы хотите настроить итоги, например, "СуммаПродаж".
  2. Настраиваем "Роли полей": Справа от поля "Выражение" мы увидим раздел "Роли полей". Здесь необходимо указать, по каким группировкам этот ресурс должен рассчитываться. Если мы хотим, чтобы итог по "СуммаПродаж" отображался только по "Менеджеру", но не по "Номенклатуре", мы должны добавить "Менеджер" в список ролей, а "Номенклатуру" — нет.
  3. Удаление ненужных полей из ролей: Если у вас есть группировка, по которой итоги не нужны, убедитесь, что она отсутствует в списке "Роли полей" для соответствующего ресурса. Например, если у нас есть ресурс Сумма(СуммаПродаж) и группировки "Менеджер" и "Номенклатура", то для показа итога только по менеджеру, мы оставляем в ролях только "Менеджер".

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

3. Использование пользовательских полей для гибкого управления итогами

В некоторых случаях стандартные настройки ресурсов могут быть недостаточными или менее гибкими. Здесь на помощь приходят пользовательские поля. Они позволяют нам создавать собственные выражения для расчета данных, включая итоги, и затем управлять их отображением.

Рассмотрим пример, когда нам нужно показать сумму продаж по менеджерам, но при этом для номенклатуры мы хотим видеть только детальные строки, без сумм. Мы можем создать пользовательское поле, которое будет рассчитывать сумму только для верхнего уровня группировки.

Переходим на вкладку "Наборы данных" в СКД, затем выбираем кнопку "Пользовательские поля" (обычно находится рядом с кнопкой "Параметры"). Здесь мы можем добавить новое поле.

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

    Здесь Уровень("Менеджер") и Уровень("Номенклатура") позволяют нам определить текущий уровень группировки. Мы можем сказать СКД, чтобы она выводила NULL (или 0) для определенных уровней группировки, эффективно скрывая или обнуляя итоги там, где они не нужны.

    Более простой вариант, если нужно просто подавить промежуточные итоги, но оставить общие:

    
    ВЫБОР
    КОГДА Уровень(ПолеГруппировкиДляСкрытияИтогов) > 0 ТОГДА NULL
    ИНАЧЕ Сумма(ПолеСуммирования)
    КОНЕЦ
    

    Где ПолеГруппировкиДляСкрытияИтогов - это то поле группировки, по которому не нужны промежуточные итоги (например, "Номенклатура").

  3. Используем новое поле в отчете: После создания пользовательского поля, оно станет доступно как обычное поле для вывода в отчете и для настройки ресурсов. Мы можем добавить его в выбранные поля и настроить его роли полей, как это делали с обычными ресурсами.

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

4. Программная доработка макета СКД: Управление итогами через код

Когда настройки через конструктор СКД становятся слишком сложными или не дают нужного результата, мы можем прибегнуть к программной доработке схемы компоновки данных. Это позволяет нам динамически изменять настройки СКД перед формированием отчета.

Разберем ситуацию, когда нам нужно управлять отображением итогов для конкретных группировок или для сложных случаев, которые тяжело описать в пользовательских полях. Мы будем работать с программным объектом СхемаКомпоновкиДанных.

  1. Получаем объект схемы:
    
    // Получаем объект схемы компоновки данных
    Схема = КомпоновщикМакета.ПолучитьСхемуКомпоновкиДанных();
    

    Здесь КомпоновщикМакета - это объект компоновщика макета, который мы используем для формирования отчета.

  2. Находим нужный ресурс: Мы можем пройтись по коллекции ресурсов схемы и найти нужный нам.
    
    Для Каждого РесурсИзСхемы Из Схема.Ресурсы Цикл
        Если РесурсИзСхемы.Поле = "МойРесурс" Тогда
            // Нашли нужный ресурс, теперь можем его модифицировать
        КонецЕсли;
    КонецЦикла;
    
  3. Модифицируем "Роли полей" программно: Самое важное для нашей задачи — это изменение списка полей, по которым рассчитывается ресурс. Мы можем очистить существующие роли и добавить только те, которые нам нужны.
    
    // Предположим, мы хотим, чтобы "СуммаПродаж" рассчитывалась только по "Менеджеру"
    Для Каждого РесурсИзСхемы Из Схема.Ресурсы Цикл
        Если РесурсИзСхемы.Поле = "СуммаПродаж" Тогда
            // Очищаем текущие роли полей для этого ресурса
            РесурсИзСхемы.РолиПолей.Очистить();
                    
            // Добавляем только те поля, по которым нужны итоги
            НоваяРоль = РесурсИзСхемы.РолиПолей.Добавить();
            НоваяРоль.Поле = "Менеджер"; // Итоги будут только по менеджеру
                    
            Прервать; // Ресурс найден и изменен, выходим из цикла
        КонецЕсли;
    КонецЦикла;
    

    Этот код позволяет нам программно указать, по каким группировкам следует рассчитывать итоги для конкретного ресурса. Мы можем добавить несколько полей в РолиПолей, если итоги нужны по нескольким измерениям.

  4. Применяем изменения: После того как мы модифицировали схему, мы должны передать ее в компоновщик настроек или использовать ее для формирования макета.
    
    // Например, если мы работаем с формой отчета
    КомпоновщикНастроек.ЗагрузитьНастройки(КомпоновщикНастроек.ПолучитьНастройки());
    КомпоновщикНастроек.КомпоновщикМакета.УстановитьСхему(Схема);
    

    Или напрямую:

    
    МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки, Отказ);
    

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

5. Практические советы и дополнительные настройки

Помимо основных методов, есть несколько дополнительных аспектов, которые помогут нам при работе с итогами в СКД:

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

Заключение

Управление отображением итогов по группам в отчетах на СКД — это многогранная задача, которая может быть решена различными способами. Мы рассмотрели три основных подхода: настройку ресурсов, использование пользовательских полей и программную доработку схемы. Каждый из этих методов имеет свою область применения и степень гибкости.

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

Надеемся, что это подробное руководство поможет вам уверенно работать с итогами в ваших отчетах на СКД и создавать информативные и наглядные аналитические инструменты в 1С 8.3.

← На главную