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

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

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

Ограничения платформы и причины проблемы

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

Рассмотрим несколько проверенных способов решения, от настроек структуры до написания выражений.

Способ 1: Разделение полей через параллельные колонки в элементе «Таблица»

Если используется один набор данных, мы можем решить задачу прямо в настройках структуры отчета. Посмотрим на пример создания параллельных группировок.

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

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

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

Способ 2: Использование нескольких наборов данных

Рассмотрим вариант на уровне схемы данных. Вместо одного общего запроса создадим два отдельных набора:

  1. Первый набор данных — используется для получения остатков. В нем мы намеренно не выбираем поле Период.
  2. Второй набор данных — используется для получения оборотов. В нем обязательно присутствует поле Период.

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

Способ 3: Использование функции ВычислитьВыражение()

Эту задачу можно решить математически на уровне языка выражений СКД. Перейдем на вкладку «Ресурсы». Для остатков мы можем переопределить выражение расчета итога с использованием функции ВычислитьВыражение.

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

Способ 4: Ручная отрисовка через «Макеты»

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

Способ 5: Жесткое разворачивание периодов в запросе

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


ВЫБОР 
    КОГДА МЕСЯЦ(Период) = 1 ТОГДА СуммаОборот 
    ИНАЧЕ 0 
КОНЕЦ КАК ОборотЯнварь

Важное ограничение метода: отчет теряет гибкость. Пользователь не сможет произвольно менять периодичность (например, переключиться с месяцев на недели) без вмешательства программиста в код запроса. Этот метод стоит использовать только для строго регламентированных печатных форм, где структура колонок никогда не меняется.

← На главную