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