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