Как рассчитать и вывести сквозные итоги по нескольким таблицам в отчете СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке сложных отчетов в системе компоновки данных (СКД) нередко возникает задача вывести несколько независимых таблиц, а затем в самом конце отчета показать общую итоговую строку со сквозным расчетом (например: ИтогТаблицы1 - ИтогТаблицы2 + ИтогТаблицы3 = Результат). Разберем, с какими ограничениями платформы можно столкнуться при использовании вложенных схем и как правильно реализовать подобный расчет штатно или программно.

Ограничения вложенных схем компоновки данных

Использование вложенных схем для вывода отдельных таблиц выглядит привлекательным благодаря изолированности их настроек, однако такой подход создает жесткое ограничение:

  1. Каждая вложенная схема компоновки выполняется в собственном изолированном контексте.
  2. Родительская схема не имеет прямого доступа к вычисленным итогам, ресурсам и полям вложенных схем.
  3. В СКД невозможно сослаться из одной таблицы на рассчитанный ресурс другой таблицы, если они находятся в разных схемах.

Следовательно, получить общую формулу над итогами разных вложенных схем стандартными средствами настроек схемы нельзя. Рассмотрим правильные варианты решения этой задачи.

Способ 1. Объединение данных в единый запрос и расчет ресурсов по условию

Это наиболее правильный и производительный метод решения задачи штатным механизмом СКД. Вместо нескольких независимых или вложенных схем объединим выборки данных в один набор данных с помощью конструкции ОБЪЕДИНИТЬ ВСЕ.

Разберем по шагам реализацию этого способа:

  1. В запросе набора данных для каждой смысловой части добавляем строковое или числовое поле-разделитель (например, ИмяРаздела со значениями "Таблица1", "Таблица2", "Таблица3").

Посмотрим на пример структуры запроса:


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

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

ВЫБРАТЬ
    "Таблица2",
    ЗакупкиОбороты.Номенклатура,
    ЗакупкиОбороты.СуммаОборот
ИЗ
    РегистрНакопления.Закупки.Обороты(&НачалоПериода, &КонецПериода,,) КАК ЗакупкиОбороты

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

ВЫБРАТЬ
    "Таблица3",
    Расходы.СтатьяРасходов,
    Расходы.Сумма
ИЗ
    РегистрНакопления.ПрочиеРасходы КАК Расходы
  1. На вкладке Настройки в структуре отчета создаем три последовательные группировки или таблицы. Для каждой из них на вкладке Отбор задаем фильтр по соответствующему значению поля ИмяРаздела.
  2. На вкладке Ресурсы для поля Сумма задаем расчет общего итога с использованием условного оператора ВЫБОР КОГДА.

Проанализируем формулу для общего ресурса:


Сумма(ВЫБОР КОГДА ИмяРаздела = "Таблица1" ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ)
- Сумма(ВЫБОР КОГДА ИмяРаздела = "Таблица2" ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ)
+ Сумма(ВЫБОР КОГДА ИмяРаздела = "Таблица3" ТОГДА Сумма ИНАЧЕ 0 КОНЕЦ)

Если для строк внутри каждой отдельной таблицы требуется стандартное суммирование, а сложная формула нужна только для общего подвала, на вкладке Ресурсы в колонке Рассчитывать по... указываем ОбщийИтог для сквозной формулы, а для остальных группировок добавляем отдельную строку с выражением Сумма(Сумма).

Способ 2. Оформление итоговой строки через собственный макет СКД

Если требуется вывести в конце отчета строку с произвольным текстом (например, «Итог: Раздел1 - Раздел2 + Раздел3 = 100 000»), воспользуемся пользовательским макетом СКД:

  1. В структуре отчета в самом низу добавляем пустую группировку без указания полей.
  2. Переходим на вкладку Макеты и нажимаем Добавить макет группировки, выбрав созданную пустую группировку.
  3. В ячейках макета оформляем требуемый текст, а для числового результата задаем тип заполнения Параметр или Шаблон.
  4. В таблице параметров макета прописываем расчетное выражение или привязываем ресурс, рассчитанный по условиям из Способа 1.

Способ 3. Программный вывод через процессор компоновки данных

Если структура данных настолько разнородна, что объединить их в один запрос затруднительно, рассчитаем итоги программно при выводе отчета в процедуре ПриКомпоновкеРезультата модуля объекта:

  1. Устанавливаем СтандартнаяОбработка = Ложь.
  2. Последовательно выполняем компоновку каждой схемы или набора данных с помощью объектов КомпоновщикМакетаКомпоновкиДанных, ПроцессорКомпоновкиДанных и ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент в один и тот же ТабличныйДокумент.
  3. При обходе элементов через ПроцессорКомпоновкиДанных.Следующий() накапливаем итоговые значения по нужным ресурсам в переменных модуля.
  4. После вывода всех таблиц программно формируем область с итоговой строкой и выводим ее в конец результирующего табличного документа.

Способ 4. Использование внешних наборов данных

Еще один универсальный вариант — перенести всю логику сбора разнородных таблиц и расчета математических итогов в код модуля объекта отчета:

  1. Формируем несколько объектов ТаблицаЗначений программным выполнением запросов.
  2. Рассчитываем отдельную строку или таблицу итогов средствами встроенного языка 1С.
  3. Передаем полученные таблицы в СКД через структуру ВнешниеНаборыДанных, где схема компоновки отвечает исключительно за визуальное отображение колонок и оформление.
← На главную