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