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

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

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

Суть проблемы: отображение детальных записей и некорректное суммирование

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

Решение 1: Скрытие детальных записей и отображение итогов

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

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

Один из самых простых и наглядных способов скрыть детальные записи — это использовать механизм условного оформления. Этот метод позволяет визуально "очистить" ячейки с детальной информацией, при этом сами значения для расчета итогов остаются в данных.

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

Важный момент: этот метод только скрывает значения визуально. Сами числовые значения продолжают присутствовать в наборе данных и будут участвовать в расчете вышестоящих итогов. Если проблема заключается в некорректном суммировании из-за "размножения" данных, этот метод не решит ее. Он подходит только для визуального скрытия уже корректно посчитанных детальных записей.

Использование выражений ресурсов с "0" для скрытия детальных значений

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

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

Осторожно: Как было отмечено в обсуждении, такой подход может привести к некорректным итогам для вышестоящих группировок, если не продумать логику агрегации. Если мы просто зануляем значения на детальном уровне, то суммирование этих нулей на более высоких уровнях приведет к неверным результатам.

Изменение свойства "Расположение группировок"

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

  1. Перейдите на вкладку "Настройки" отчета СКД.
  2. Выделите группировку "Детальные записи".
  3. Перейдите в "Другие настройки" этой группировки. В правой части окна настроек, в свойствах выбранной группировки, найдите кнопку "Другие настройки" или аналогичную.
  4. Установите свойство "Расположение группировок" в значение "Нет". Это полностью скроет вывод строк детальных записей, оставляя только итоги.

Этот метод хорошо подходит, когда вам принципиально не нужны никакие детальные данные, а только сводная информация.

Решение 2: Корректный расчет сумм при работе с табличными частями (Предотвращение "размножения" сумм)

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

Модификация запроса источника данных

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

  1. Откройте схему компоновки данных. Для работы со схемами и отладки отлично подойдет Управляемая консоль запросов, отчетов 3.9.0 (расширение, внешняя обработка).
  2. Перейдите на вкладку "Наборы данных" и откройте запрос.
  3. Измените выражение для получения суммы документа. Вместо того чтобы просто выбирать Документ.СуммаДокумента, мы модифицируем его с использованием условного оператора ВЫБОР КОГДА ... ТОГДА ... ИНАЧЕ ... КОНЕЦ.

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


ВЫБРАТЬ
    СчетНаОплату.Ссылка КАК СчетНаОплату,
    СчетНаОплатуТовары.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА СчетНаОплатуТовары.НомерСтроки = 1
            ТОГДА СчетНаОплату.СуммаДокумента
        ИНАЧЕ 0
    КОНЕЦ КАК СуммаДокументаДляИтогов,
    СчетНаОплатуТовары.Количество КАК Количество
ИЗ
    Документ.СчетНаОплату КАК СчетНаОплату
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетНаОплату.Товары КАК СчетНаОплатуТовары
        ПО СчетНаОплату.Ссылка = СчетНаОплатуТовары.Ссылка

Объяснение:

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

Решение 3: Использование функции `ВычислитьВыражениеСГруппировкойМассив`

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

Гибкий расчет ресурсов с `ВычислитьВыражениеСГруппировкойМассив`

Давайте рассмотрим, как эта функция работает и когда ее целесообразно использовать. Основная идея функции заключается в том, что она позволяет "пересчитать" выражение в контексте другой группировки или даже для всего отчета.


Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(СуммаДокумента)", "СчетНаОплату"))

Разберем параметры:

Как это работает?

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

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


МАКСИМУМ(ВычислитьВыражениеСГруппировкойМассив("СуммаДокумента", "СчетНаОплату"))

Здесь мы используем МАКСИМУМ (или МИНИМУМ) снаружи, так как внутри ВычислитьВыражениеСГруппировкойМассив нам нужно получить само значение СуммаДокумента, которое для конкретного счета будет одинаковым на всех строках (если оно не обработано запросом). Если же в запросе уже применена логика с НомерСтроки = 1, то достаточно использовать простую Сумма(СуммаДокументаДляИтогов) в ресурсах.

Когда применять?

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

Дополнительные рекомендации и часто встречающиеся проблемы

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

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

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

← На главную