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