Как убрать пустые остатки по месяцам в СКД и не нарушить расчет остатков?

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

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

В этой статье мы подробно проанализируем причину такого поведения платформы 1С и рассмотрим несколько рабочих способов скрытия нулевых строк без нарушения временной цепочки расчета остатков.

Выясним причину: почему отбор по конечному остатку «ломает» отчет

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


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

Если наложить простой отбор СуммаКон <> 0 в секции ГДЕ запроса или в настройках отбора СКД, происходит следующее:

  1. Механизм автоматического расчета остатков в СКД строит непрерывную ось времени, связывая конечный остаток предыдущего месяца с начальным остатком следующего.
  2. В месяц, когда задолженность полностью списана, СуммаКонечныйОстаток становится равной 0.
  3. Жесткий отбор по условию КонечныйОстаток <> 0 полностью выбивает эту промежуточную строку из выборки.
  4. Поскольку СКД теряет запись с моментом обнуления долга, алгоритм системы считает, что движения не прекращались, и транслирует последний известный ненулевой остаток на все последующие месяцы отчета.

Кроме того, инверсия знака прямо в запросе (например, -ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток) при автоматически назначенных ролях остатков может мешать СКД корректно сопоставлять парные поля остатков.

Способ 1. Настройка комплексного отбора на уровне группировки

Чтобы сохранить неразрывность временной оси в СКД, нельзя исключать из выборки период, в котором произошло списание остатка. В этот период начальный остаток еще существовал, хотя конечный уже стал равен нулю.

Разберем по шагам правильную настройку отбора:

  1. Перейдем в настройки СКД на вкладку «Настройки».
  2. Выделим группировку (или отчет в целом) и перейдем на вкладку «Отбор».
  3. Сформируем составное условие с группой условий ИЛИ:
    • СуммаНач НЕ РАВНО 0
    • ИЛИ СуммаКон НЕ РАВНО 0
    • ИЛИ Оборот НЕ РАВНО 0 (если поле оборота добавлено в набор данных)

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

Способ 2. Перенос инверсии знака в вычисляемые поля

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

  1. В запросе набора данных оставляем исходные поля виртуальной таблицы без знака минус:
    
    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНач,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКон
    
  2. На вкладке «Ресурсы» или «Вычисляемые поля» производим изменение знака. Например, в выражении ресурса указываем: -Сумма(СуммаКон)
  3. Это позволяет СКД штатно назначить роли НачальныйОстаток и КонечныйОстаток на физические поля таблицы и корректно сформировать итоги по периодам.

Способ 3. Скрытие нулевых строк через условное оформление

Если требуется полностью исключить нулевые записи из визуального отображения, не вмешиваясь в математический алгоритм расчета остатков СКД, воспользуемся условным оформлением.

Рассмотрим последовательность действий:

  1. Перейдем в настройки отчета или конкретной группировки на вкладку «Условное оформление».
  2. Добавим элемент оформления и настроим условие:

    СуммаНач = 0 И СуммаКон = 0

  3. В параметрах оформления выберем свойство «Скрыть строку» и установим значение Истина.
  4. Если в используемой версии платформы данный параметр недоступен, можно задать параметрам «Минимальная высота» и «Максимальная высота» значение 1, либо настроить формат вывода нулевых значений.

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

Способ 4. Расчет остатков во временных таблицах без использования ролей СКД

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

Разберем пример структуры такого запроса:

  1. Формируем временную таблицу периодов (календарь месяцев).
  2. Соединяем таблицу периодов с движениями или остатками регистра.
  3. Самостоятельно рассчитываем начальные и конечные остатки на каждую дату через агрегатные функции и конструкции ВЫБОР КОГДА.
  4. В итоговой выборке на вкладке «Набор данных» СКД очищаем колонки «Роль» у полей остатков.

Снятие ролей остатков превращает эти поля в обычные числовые ресурсы. В этом случае наложение любого отбора (СуммаКон <> 0) работает как стандартная фильтрация строк и не приводит к искажению показателей в других периодах.

← На главную