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