При разработке отчетов на базе Системы компоновки данных (СКД) в 1С программисты часто сталкиваются с нестандартными требованиями к расчету итоговых показателей. Типичный пример: на уровне детальных записей (в строках отчета) необходимо вывести исходные значения физических показателей «как есть», а в итоговой строке группировки или в общем итоге требуется вывести не просто математическую сумму этих строк, а результат расчета по совершенно другой формуле (например, сумму итогов двух других колонок-ресурсов).
В этой статье мы подробно разберем, как решить эту задачу в СКД. Мы рассмотрим четыре практических способа реализации — от простых настроек в конфигураторе до использования сложных агрегатных функций и пользовательских полей.
Представим, что у нас есть три ресурса: Ресурс1, Ресурс2 и Ресурс3. Нам необходимо спроектировать отчет таким образом, чтобы:
Ресурс1 отображал свои собственные исходные значения (например, 100, 200, 4952).Ресурс1 вместо стандартного суммирования детальных записей выводилась сумма итоговых значений двух других колонок: Итог(Ресурс2) + Итог(Ресурс3) (например, 48 + 5300 = 5348).Давайте пошагово проанализируем различные варианты реализации этой логики в СКД.
Это самый простой, стандартный и производительный способ решения задачи непосредственно в конфигураторе. По умолчанию выражение ресурса (например, Сумма(Ресурс1)) применяется ко всем уровням группировок, включая детальные записи и общий итог. Однако СКД позволяет разделять формулы расчета для разных уровней.
Рассмотрим по шагам процесс настройки:
Ресурс1 в список ресурсов первый раз:
Сумма(Ресурс1).Номенклатура или Склад). Обязательно снимем флажок с общего итога.Ресурс1 в список ресурсов второй раз:
Сумма(Ресурс2) + Сумма(Ресурс3).<Общий итог> (и, если необходимо, вышестоящие группировки, в которых должен применяться этот расчет).При такой настройке СКД автоматически применит первую формулу для вычисления значений в строках, а при расчете общего итога по этой колонке подставит альтернативное выражение.
Иногда задача усложняется: нам требуется произвести «двойное агрегирование» (например, сначала рассчитать максимальные значения по вложенным группам, а затем сложить их в общем итоге). Для выполнения таких нелинейных расчетов в СКД встроена мощная функция ВычислитьВыражениеСГруппировкойМассив.
Выясним синтаксис и принцип ее работы. Нам необходимо передать функции два основных параметра: выражение, которое нужно вычислить, и имя группировки, по которой будет производиться обход.
Пример формулы в поле «Выражение» на вкладке «Ресурсы»:
Сумма(ВычислитьВыражениеСГруппировкойМассив("Сумма(Ресурс2) + Сумма(Ресурс3)", "Номенклатура"))
Проанализируем, как СКД обрабатывает это выражение:
Номенклатура.Сумма(Ресурс2) + Сумма(Ресурс3).Сумма() складывает все элементы этого массива и выводит финальный результат в качестве итога.Этот метод незаменим, когда итоговый показатель невозможно получить простым сложением или когда вычисления зависят от контекста конкретной иерархии справочника.
Что делать, если конфигурация находится на поддержке, а отчет нужно донастроить «на лету» в пользовательском режиме без привлечения программиста? В этом случае нам помогут Пользовательские поля.
Рассмотрим пошаговый алгоритм настройки:
Ресурс1). Это позволит сохранить оригинальные значения в строках.Сумма(Ресурс2) + Сумма(Ресурс3).Ресурс1 на наше созданное пользовательское поле.СКД автоматически разделит контекст вычислений: для обычных строк применит выражение детальных записей, а для всех группировок и общих итогов — агрегатную формулу.
Этот профессиональный прием разработчиков 1С используется, когда необходимо полностью исключить вывод ресурса на детальном уровне, но при этом рассчитать итоговые показатели по формуле.
Реализуем этот подход следующим образом:
ИтоговыйПоказатель. Поле «Выражение» оставим пустым (или укажем в нем значение 0 или Null).ИтоговыйПоказатель в список ресурсов.Сумма(Ресурс2) + Сумма(Ресурс3).<Общий итог>).В результате на детальном уровне колонка ИтоговыйПоказатель останется пустой (или будет содержать нули), а в строках итогов появится корректно рассчитанное значение суммы двух других ресурсов.
Выбор конкретного метода зависит от архитектуры вашего отчета и условий его использования:
ВычислитьВыражениеСГруппировкойМассив).