Как настроить расчет начальных и конечных остатков по месяцам с дополнением периода в СКД?

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

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача вывести помесячную динамику остатков за год: начальный остаток на 1-е число месяца и конечный остаток на последнее число месяца. Нередко разработчики сталкиваются с ситуацией, когда в запросе к виртуальной таблице ОстаткиИОбороты задается периодичность День, а в настройках структуры СКД включается дополнение периода с типом «Месяц». В результате отчет выводит остатки некорректно: и начальный, и конечный остатки рассчитываются на начало дня (на 1-е число месяца), игнорируя обороты за весь месяц.

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

Причины некорректного расчета остатков

Проанализируем механику работы СКД и виртуальных таблиц регистров:

  1. Назначение механизма дополнения периодов. Механизм дополнения периода в СКД предназначен исключительно для заполнения пропущенных временных интервалов (например, когда в периоде не было движений) и восстановления непрерывной шкалы дат. Он не предназначен для агрегации или укрупнения детальных периодов. Если базовое поле запроса сформировано с гранулярностью дня, СКД просто добавит недостающие точки временной шкалы, но продолжит считать остатки в границах суток.
  2. Определение границ периода. СКД вычисляет начальный и конечный остатки, опираясь на границы периода, переданного в группировку. Если группировка сформирована по полю с гранулярностью День, то начальный остаток берется на 00:00:00 этого дня, а конечный — на 23:59:59 того же самого дня. Если 1-го числа месяца движений не было, то оба этих значения совпадут. Чтобы конечный остаток рассчитывался на конец месяца, СКД должна оперировать полем с гранулярностью Месяц.
  3. Использование явной группировки в тексте запроса. Наличие конструкции СГРУППИРОВАТЬ ПО в запросе к виртуальной таблице остатков и оборотов лишает СКД возможности автоматически назначить полям остатков специальные роли (НачальныйОстаток, КонечныйОстаток) и связать их с полями периодов. Платформа начинает воспринимать эти поля как простые числовые значения, суммируя их по стандартным правилам.

Решение 1. Использование периодичности «Авто» и расширения языка СКД

Рассмотрим основной способ решения задачи. Чтобы отчет мог динамически работать с разной степенью детализации (например, формировать как помесячный отчет за год, так и поденный отчет за месяц), в параметрах виртуальной таблицы регистра бухгалтерии следует указать периодичность Авто.

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


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.ПериодМесяц КАК ПериодМесяц,
    ХозрасчетныйОстаткиИОбороты.ПериодДень КАК ПериодДень,
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт КАК СуммаНачальныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК СуммаКонечныйОстатокДт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК СуммаОборотДт,
    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК СуммаОборотКт
{ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.ПериодМесяц КАК Период,
    ХозрасчетныйОстаткиИОбороты.ПериодДень КАК Период}
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(
        &НачалоПериода,
        &КонецПериода,
        Авто,
        ,
        Счет В ИЕРАРХИИ (&ПараметрЗапросаСчета),
        ,
        Организация = &ПараметрЗапросаОрганизация) КАК ХозрасчетныйОстаткиИОбороты

Разберем по шагам, как настроить отчет при таком подходе:

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

Решение 2. Проверка и настройка ролей полей компоновки

Если в схеме компоновки данных используются нестандартные запросы или вычисляемые поля, необходимо убедиться в правильности заполнения ролей на вкладке Наборы данных:

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

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

Решение 3. Использование вычисляемого поля

Если в запросе требуется оставить явные поля ПериодМесяц и ПериодДень без расширения языка СКД, можно применить вычисляемое поле:

  1. На вкладке Вычисляемые поля добавим новое поле с именем Период.
  2. В выражении поля укажем формулу переключения в зависимости от используемого параметра или варианта отчета (либо определим выражение отдельно для каждого варианта в настройках).
  3. Используем поле Период в группировках строк отчета и в выбранных полях.

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

← На главную