При разработке отчетов в Системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда итоговая сумма в отчете рассчитывается некорректно из-за структуры данных. Типичный пример: в наборе данных присутствуют строки-агрегаты (например, строка "1.8", которая уже включает в себя значения строк "1.8.1" и "1.8.2"). Если просто суммировать поле, значение строки "1.8" попадет в итог дважды: один раз как самостоятельная строка и второй раз как сумма своих дочерних элементов. Разберем подробно, как оставить строку видимой в отчете, но исключить ее влияние на Общий итог.
Прежде чем перейти к решениям, проанализируем ситуацию. В 1С СКД расчет итогов по умолчанию происходит как Сумма(Поле) по всем детальным записям, попавшим в результат запроса. Если ваш запрос построен так, что в него попадают и итоговые данные, и детальные, возникает дублирование. Наша задача — объяснить системе, какие именно записи должны участвовать в агрегации для группировок и общих итогов, а какие предназначены только для визуального отображения в строках.
Рассмотрим самый простой и эффективный метод, который не требует изменения структуры запроса. Мы можем модифицировать выражение на вкладке «Ресурсы». СКД позволяет гибко настраивать расчеты, используя логические операторы.
Для реализации этого метода выполним следующие шаги:
План) и обратим внимание на колонку «Выражение».Сумма(План) пропишем условие, которое будет проверять идентификатор строки или показатель:
Сумма(Выбор Когда Показатель <> "1.8" Тогда План Иначе 0 Конец)
В данном случае, когда система будет рассчитывать итог, она встретит строку с показателем "1.8", подставит вместо ее значения 0 и прибавит к общей сумме. При этом в самой строке отчета значение все равно будет отображаться, если в настройках группировки указано использование этого же ресурса. Однако здесь есть нюанс: если мы хотим, чтобы в самой строке "1.8" значение было видно, а в итогах выше — нет, нам нужно разделить настройки расчета по группировкам.
Этот метод более профессиональный, так как он позволяет сохранить видимость значения в проблемной строке, но убрать его из итогов по вышестоящим группам и из общего итога. В СКД одну и ту же колонку можно добавить в список ресурсов несколько раз с разными настройками «Рассчитывать по...».
Проанализируем алгоритм настройки:
План в первый раз. В выражении укажем просто Сумма(План). В колонке «Рассчитывать по...» выберем только ту группировку, где выводится сам показатель (например, группировка Показатель). Это обеспечит вывод числа в строке "1.8".План второй раз. В выражении напишем наше условие с исключением:
Сумма(Выбор Когда Показатель <> "1.8" Тогда План Иначе 0 Конец)
Таким образом, для детальной строки система применит обычное суммирование, а для итоговых строк — формулу с фильтрацией. Для решения смежных задач управления отображением ресурсов подойдёт метод вывода ресурса только в одной колонке без изменения запроса.
Выясним причину, по которой стандартные фильтры могут не подходить. Иногда условие исключения должно быть более сложным или зависеть от контекста. В таких случаях на помощь приходит мощная функция СКД ВычислитьВыражение. Она позволяет вычислять агрегаты с применением произвольного отбора, который действует только на этот расчет.
Рассмотрим пример выражения для общего итога:
ВычислитьВыражение("Сумма(План)", , "ОбщийИтог", "Показатель <> '1.8'")
Разберем параметры этой функции:
Если строка "1.8" является иерархическим родителем в вашей структуре данных и вы используете вывод иерархии, то задвоение — естественный процесс для СКД, так как она суммирует и "родителей", и "детей". Чтобы этого избежать, можно суммировать данные только по самому нижнему уровню (листьям дерева).
Посмотрим на пример выражения в ресурсах:
Сумма(Выбор Когда Уровень() > 1 Тогда План Иначе 0 Конец)
Здесь функция Уровень() позволяет определить вложенность строки. Если мы знаем, что первичные данные всегда находятся на уровне 2 и ниже, а все итоги (включая 1.8) находятся на уровне 1, то такая формула автоматически очистит общий итог от дублирующих агрегатов, созданных на стороне базы данных.
Если логика исключения строк слишком громоздкая для написания прямо в ресурсах, мы можем пойти путем создания вспомогательного поля. Разберем этот пошаговый процесс:
ПланДляИтогов.Выбор Когда Показатель = "1.8" Тогда 0 Иначе План Конец.План указываем расчет по группировке Показатель.ПланДляИтогов с выражением Сумма(ПланДляИтогов) и указываем рассчитывать его только по Общему итогу.ПланДляИтогов в колонке План.При работе с подобными задачами в СКД важно помнить о приоритетах. Если вы отключаете итоги в настройках самой группировки (вкладка «Дополнительные настройки»), это может повлиять на визуализацию, но не на расчет. Всегда старайтесь решать задачу на уровне выражений ресурсов, так как это наиболее гибкий механизм.
Также проанализируем ситуацию с типами данных. Если поле Показатель является ссылочным (например, СправочникСсылка), то в условиях Выбор Когда следует использовать либо сравнение с ЗНАЧЕНИЕ(Справочник.ИмяСправочника.ИмяЭлемента), либо проверку кода/артикула, чтобы избежать ошибок сопоставления типов.
Использование вышеописанных методов позволит вам создавать сложные финансовые и аналитические отчеты, где структура данных не всегда является линейной, обеспечивая при этом идеальную точность итоговых показателей.