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