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

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

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

Проанализируем причины такого поведения платформы 1С и разберем по шагам правильные способы расчета и фильтрации данных.

Почему вычисляемые поля не подходят для расчета по группировкам

Разберем механику работы платформы. В СКД существует четкое разделение этапов расчета:

  1. Вычисляемые поля: рассчитываются построчно для каждой детальной записи исходной выборки (до группировки и суммирования). Если в детальных строках значения показателей разнесены по разным документам (например, по регистраторам), то формула Сумма1 + Сумма2 сначала рассчитается для каждого регистратора отдельно, а затем полученные результаты просто просуммируются платформой на уровне вышестоящей группировки.
  2. Отборы по обычным полям: применяются как условие WHERE к исходным строкам до момента их свертки в группы. Если наложить отбор на уровне детальных строк, платформа исключит их из выборки до подсчета общих итогов, что полностью исказит финальный результат.
  3. Ресурсы: рассчитываются уже на этапе агрегации (после группировки записей). Формулы, заданные на вкладке «Ресурсы», вычисляются непосредственно для сформированной строки группировки.

Способ 1. Использование агрегатных выражений на вкладке «Ресурсы»

Рассмотрим основной и самый надежный способ получения итоговой суммы двух полей на уровне группировки:

  1. Перейдем на вкладку Ресурсы в схеме компоновки данных.
  2. Добавим поле Сумма3.
  3. В колонке Выражение укажем сумму агрегатных функций исходных полей:

Сумма(Сумма1) + Сумма(Сумма2)

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

Чтобы скрыть строки, где итоговая сумма равна нулю, выполним настройку отбора:

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

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

Способ 2. Использование контекстных функций компоновки данных

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

  1. Функция Вычислить() позволяет рассчитать агрегатное выражение в контексте заданной группировки:

Вычислить("Сумма(Сумма1) + Сумма(Сумма2)", "Заказ")

  1. Функция ВычислитьГруппировкойМассив() полезна при необходимости собрать массив значений подчиненных строк для последующей обработки агрегатными функциями платформы.

Способ 3. Программный вывод через процессор компоновки

Если логика фильтрации слишком сложна для стандартных настроек компоновки, вывод данных можно перехватить программно в модуле объекта отчета:


ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);

ПроцессорВывода.НачатьВывод();

Пока Истина Цикл
    ЭлементРезультата = ПроцессорКомпоновки.Следующий();
    Если ЭлементРезультата = Неопределено Тогда
        Прервать;
    КонецЕсли;
    
    // Проверяем тип элемента и значение параметров группировки
    // При необходимости пропускаем вызов ПроцессорВывода.ВывестиЭлемент()
    ПроцессорВывода.ВывестиЭлемент(ЭлементРезультата);
КонецЦикла;

ПроцессорВывода.ЗакончитьВывод();

Важнейший нюанс: сохраненные пользовательские настройки

Часто возникает ситуация: разработчик добавляет ресурс Сумма(Сумма1) + Сумма(Сумма2) и настраивает отбор в конфигураторе, но в режиме «1С:Предприятие» отчет продолжает работать по-старому. Выясним причину этой проблемы.

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

Для того чтобы новые формулы и отборы применились, в пользовательском режиме необходимо сбросить параметры отчета к исходным: нажать Еще → Стандартные настройки (или перевыбрать стандартный вариант отчета).

← На главную