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