Как настроить промежуточные итоги по верхней группировке колонок в СКД?

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

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

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

Анализ проблемы: почему плоская группировка не работает

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

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

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

Давайте разберем по шагам, как настроить структуру отчета правильно.

Шаг 1. Организация правильной структуры группировок колонок

Главный секрет получения промежуточных итогов по верхнему уровню — использование вложенных (подчиненных) группировок колонок. Нам нужно сделать так, чтобы группировка «Сечение» находилась внутри группировки «Смена».

Выполним следующие действия в конструкторе схемы компоновки данных:

  1. Перейдем на вкладку «Настройки» и выберем наш вариант отчета.
  2. В структуре отчета найдем таблицу. Внутри таблицы перейдем к разделу «Колонки».
  3. Добавим группировку Смена.
  4. Нажмем правой кнопкой мыши по созданной группировке Смена и выберем пункт «Добавить» -> «Новая группировка» (или перетащим существующую группировку «Сечение» внутрь группировки «Смена»).
  5. Укажем поле группировки Сечение.

Теперь структура колонок выглядит как дерево, где «Сечение» является подчиненным элементом «Смены». Это дает СКД четкое понимание иерархии данных: система теперь знает, что показатели «Сечений» должны суммироваться в рамках каждой конкретной «Смены».

Обратите внимание на выбранные поля: в настройках выбранных полей для группировки Смена должно быть указано только само поле Смена. Для группировки Сечение в выбранных полях оставляем только Сечение. Ресурсы (например, «Штуки» и «Объем») выводятся на уровне всей таблицы или автоматически наследуются.

Шаг 2. Настройка расположения промежуточных итогов

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

  1. Выделим в структуре настроек группировку колонок Смена.
  2. В нижней части экрана перейдем на вкладку «Другие настройки».
  3. Найдем параметр «Расположение итогов».
  4. Установим значение этого параметра в «Конец».

Рассмотрим, как влияют различные значения этого параметра на вывод итогов в кросс-таблице:

После установки параметра в значение «Конец» мы получим необходимый результат: под общей шапкой смены сначала пойдут колонки сечений, а завершать блок этой смены будет колонка с итогами по смене в целом.

Шаг 3. Красивое оформление шапки встроенными средствами СКД

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

Выполним настройку визуального объединения полей:

  1. В настройках отчета перейдем на вкладку «Выбранные поля».
  2. Нажмем правой кнопкой мыши в пустом пространстве списка полей и выберем пункт «Новая группа выбранных полей».
  3. В открывшемся окне зададим заголовок группы (например, «Показатели производства»).
  4. В свойстве «Расположение» для созданной группы выберем значение «Горизонтально».
  5. Перетащим внутрь этой группы наши ресурсы: «Штуки» и «Объем».

При выводе отчета СКД автоматически создаст объединенную ячейку верхнего уровня с заголовком «Показатели производства», а под ней расположит две колонки с ресурсами. Это исключает необходимость ручного расчета координат ячеек и их слияния в кодовой секции.

Еще один интересный прием — использование разделителя «точка» в путях к данным. Если переименовать пути к данным ресурсов в наборе данных схемы СКД (например, задать Смена.Количество и Смена.Объем), система компоновки самостоятельно распознает иерархическую подчиненность полей и построит над ними аккуратную объединенную шапку с заголовком «Смена».

Шаг 4. Использование макетов СКД для сложного дизайна

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

Мы можем создать индивидуальный макет для заголовка группировки:

  1. Перейдем на вкладку «Макеты» в конструкторе схемы компоновки данных.
  2. Нажмем кнопку «Добавить макет» и выберем тип «Макет заголовка группировки».
  3. Укажем имя нашей группировки (в нашем случае — «Смена»).
  4. В сетке табличного документа нарисуем желаемый дизайн заголовка: объединим необходимые ячейки, настроим границы, заливку фона и шрифт.
  5. Укажем параметры макета (например, параметр Смена для вывода названия текущей смены).

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

Шаг 5. Тонкая настройка расчета ресурсов (Рассчитывать по...)

Иногда при расчете промежуточных итогов по верхнему уровню («Смена») требуется применить иную формулу расчета, отличную от детальных записей («Сечение»). Например, в детальных записях нам нужно выводить сумму, а в промежуточном итоге по смене — среднее значение или процент выполнения плана.

Для реализации этого сценария в СКД предусмотрена возможность раздельного расчета ресурсов по уровням группировок:

  1. Перейдем на вкладку «Ресурсы» схемы компоновки данных.
  2. Добавим наше поле (например, Объем) в список ресурсов дважды.
  3. Для первой строки укажем выражение Сумма(Объем). В колонке «Рассчитывать по...» выберем группировку Сечение.
  4. Для второй строки пропишем выражение Среднее(Объем). В колонке «Рассчитывать по...» выберем группировку Смена (а также при необходимости «Общий итог»).

Благодаря такой настройке СКД автоматически переключит математическую логику при переходе от детальных колонок сечений к итоговому столбцу смены.

Дополнительный вариант: Программная постобработка в крайних случаях

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

Посмотрим на пример правильного вывода отчета программным способом с возможностью последующего анализа ячеек:


Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Инициализируем схему и настройки
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    // Инициализируем процессор компоновки
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    // Выводим результат в табличный документ
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки);
    
    // Здесь можно выполнить постобработку полученного ДокументРезультат
    // Например, вызвать процедуру объединения шапок, зная точную структуру колонок
    ОбъединитьШапкиСмен(ДокументРезультат);
    
КонецПроцедуры

Метод ОбъединитьШапкиСмен должен анализировать заполненные текстовые значения в строках заголовка и программно объединять одинаковые соседние ячейки по горизонтали. Однако помните, что к этому методу стоит прибегать только тогда, когда все возможности интерактивной настройки макетов и выбранных полей СКД полностью исчерпаны.

Используя предложенные настройки вложенных группировок колонок и управляя параметрами расположения итогов, вы сможете создавать профессиональные, быстродействующие и устойчивые к пользовательским изменениям отчета кросс-таблицы в системе 1С:Предприятие.

← На главную