Как правильно реализовать отчет План-Факт в СКД: использование объединения данных

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

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

Почему сложные формулы в ресурсах — это путь к ошибкам

Часто возникает желание решить задачу агрегации с помощью выражений вроде Сумма(ВычислитьВыражениеСГруппировкойМассив(...)). Однако такой подход в СКД имеет серьезные недостатки:

  1. Сложность поддержки: Код становится трудночитаемым, и при добавлении новых группировок или разрезов отчет может перестать работать.
  2. Производительность: Вычисление сложных агрегатов на этапе формирования отчета (пост-обработка) значительно замедляет работу системы.
  3. Риск неверных итогов: Логика «максимум по дням» для плана и «сумма по документам» для факта конфликтуют друг с другом, если они не приведены к единой структуре данных.

Решение через объединение наборов данных

Наиболее надежный способ — это объединение данных на уровне запроса. Мы должны привести данные регистра накопления ПланыПродаж и данные фактических продаж (например, ВыручкаИСебестоимостьПродаж) к единому виду. Рассмотрим, как это сделать:

Мы используем оператор ОБЪЕДИНЕТЬ ВСЕ, чтобы превратить разрозненные данные в плоскую таблицу. В этой таблице для каждой строки будет заполнено либо поле плана, либо поле факта, а второе поле будет содержать ноль.


ВЫБРАТЬ
    ВыручкаИСебестоимостьПродажОбороты.Подразделение КАК Подразделение,
    ВыручкаИСебестоимостьПродажОбороты.ПериодДень КАК ПериодДень,
    ВыручкаИСебестоимостьПродажОбороты.Регистратор КАК Регистратор,
    0 КАК СуммаПлан,
    ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаФакт
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(, , Авто, ) КАК ВыручкаИСебестоимостьПродажОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ПланыПродажОбороты.Подразделение,
    ПланыПродажОбороты.ПериодДень,
    ПланыПродажОбороты.Регистратор,
    ПланыПродажОбороты.СуммаОборот,
    0
ИЗ
    РегистрНакопления.ПланыПродаж.Обороты(, , Авто, ) КАК ПланыПродажОбороты

Преимущества подхода

После такого объединения в СКД у нас появляется единый набор полей: Подразделение, ПериодДень, СуммаПлан и СуммаФакт. Теперь нам не нужно писать сложные выражения для ресурсов:

Система компоновки сама корректно рассчитает итоги по группировкам (по подразделениям, по дням, общие итоги), так как данные уже приведены к правильному формату.

Как быть, если все же нужно управлять формулами в ресурсах

Если задача требует специфической логики расчетов, которая не покрывается обычными агрегатами, используйте настройки на закладке «Ресурсы»:

  1. Разделение формул: Вместо одной длинной строки с функцией Выбор Когда, добавьте две строки ресурса.
  2. Рассчитывать по: В первой строке укажите группировку, для которой нужно считать особым образом. Во второй строке оставьте поле «Рассчитывать по» пустым (это будет означать «Общий итог»).
  3. Функция Уровень: Если необходимо, используйте Уровень() в выражении, чтобы определить, на каком этапе иерархии вычислений находится система.

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

← На главную