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