Как правильно рассчитать пересечение горизонтальных и вертикальных итогов в СКД

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

При разработке сложных отчетов в системе компоновки данных (СКД) программисты часто сталкиваются с ситуацией, когда стандартные итоги в кросс-таблицах ведут себя непредсказуемо. Особенно остро проблема проявляется на так называемой «точке пересечения» — в ячейке, где сходятся общий горизонтальный и общий вертикальный итоги. Если в отчете используются вычисляемые поля со сложной логикой ВЫБОР КОГДА, обычное суммирование может выдавать некорректные данные.

В этой статье мы разберем, почему возникают ошибки в итогах, как правильно настроить ресурсы и какие функции СКД помогут получить гарантированно верный результат на пересечении группировок.

Разбор проблемы: почему итоги считаются неверно

Рассмотрим ситуацию, когда в вычисляемом поле прописана сложная логика, как в примере из практики:


(Выбор когда (КатегорияППП = "000" или КатегорияППП = "001") 
И (НачислениеУдержание = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("270 Отпуск основной")) 
И (МЕСЯЦ(ПериодДействия) > МЕСЯЦ(Период)) Тогда Сумма Иначе 0 Конец)

Когда мы выносим такое поле в ресурсы и указываем функцию Сумма(ИмяПоля), СКД пытается вычислить итог. Проблема заключается в том, что система может применять условие ВЫБОР либо к каждой детальной записи (что правильно), либо к уже агрегированным данным в группировке (что часто приводит к ошибке). На пересечении горизонтального итога (по колонкам) и вертикального (по строкам) контекст вычислений становится «размытым», и система не понимает, нужно ли суммировать результаты условий или применять условие к сумме.

Решение 1: Тонкая настройка вкладки «Ресурсы»

Первое, на что стоит обратить внимание — это колонка «Рассчитывать по...» на закладке «Ресурсы». По умолчанию СКД рассчитывает ресурс по всем доступным группировкам. Однако для корректного пересечения часто требуется задать разные формулы для разных уровней отчета.

Проанализируем шаги по настройке:

  1. Перейдем на вкладку Ресурсы.
  2. Добавим наше поле (например, БезБ).
  3. В поле «Выражение» оставим базовую сумму: Сумма(БезБ).
  4. В колонке «Рассчитывать по» выберем конкретные группировки (например, НачислениеУдержание и КатегорияППП).
  5. Добавим это же поле второй раз.
  6. В колонке «Рассчитывать по» для второй строки выберем Общий итог.
  7. В выражении для общего итога можно прописать более жесткую формулу агрегации, которая будет принудительно суммировать данные нижних уровней.

Решение 2: Перенос логики из вычисляемых полей в ресурсы

Одной из самых распространенных ошибок является написание условий ВЫБОР КОГДА во вкладке «Вычисляемые поля». Опыт показывает, что для корректного расчета итогов логику лучше переносить непосредственно в выражение ресурса.

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


Сумма(Выбор Когда КатегорияППП В ("000", "001", "002") Тогда Сумма Иначе 0 Конец)

Такой подход позволяет СКД более эффективно управлять контекстом расчета в кросс-таблицах, особенно на пересечении группировок.

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

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

Рассмотрим пример выражения для ресурса в «Общем итоге»:


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

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

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

Важные рекомендации по оптимизации кода

В ходе анализа ситуации мы заметили использование функции НайтиПоНаименованию внутри выражений СКД:

НачислениеУдержание = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("270 Отпуск основной")

Важно: это крайне опасная практика. Во-первых, поиск по наименованию медленный. Во-вторых, если в базе появятся два начисления с похожими именами или имя изменится, отчет перестанет работать.

Посмотрим, как сделать правильно:

  1. Создадим на вкладке Параметры новый параметр (например, СписокОтпусков).
  2. Установим тип Список значений и выберем нужные виды расчетов.
  3. В выражении ресурса или вычисляемого поля используем проверку на вхождение в список:

Выбор Когда НачислениеУдержание В (&СписокОтпусков) Тогда Сумма Иначе 0 Конец

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

Работа с неопределенными значениями (NULL)

В кросс-таблицах часто возникают «дырки» в данных — ячейки, для которых нет записей. В этих случаях значение ресурса может быть NULL. Если ваша формула итога на пересечении включает арифметические операции между несколькими полями, наличие хотя бы одного NULL может привести к тому, что весь итог станет пустым.

Всегда оборачивайте числовые слагаемые в функцию ЕстьNull:

Сумма(ЕстьNull(Поле1, 0)) + Сумма(ЕстьNull(Поле2, 0))

Заключение

Для корректного расчета пересечения горизонтальных и вертикальных итогов в СКД необходимо придерживаться комплексного подхода: отказываться от сложной логики в вычисляемых полях в пользу выражений ресурсов, активно использовать настройку «Рассчитывать по...» и, в самых сложных случаях, применять функцию агрегации массивов. Правильная работа с параметрами вместо поиска по наименованию дополнительно защитит ваш отчет от логических ошибок при расчете итоговых показателей.

← На главную