Как убрать пустую строку при получении остатков и оборотов в СКД?

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

При построении отчетов на базе Системы компоновки данных (СКД) с использованием виртуальной таблицы ОстаткиИОбороты разработчики часто сталкиваются с появлением лишней пустой строки в группировке по полю Регистратор. При детальном анализе оказывается, что значение регистратора в такой строке равно НЕОПРЕДЕЛЕНО или NULL, а в числовых колонках выводятся суммы начального или конечного остатка. Разберем механизм возникновения этой строки и выясним практические способы её корректного устранения.

Почему в отчете появляется пустая строка регистратора

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

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

Способ 1. Установка отбора на уровне подчиненной группировки (рекомендуемый)

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

Разберем по шагам настройку схемы компоновки данных:

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

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

Способ 2. Изменение метода дополнения в параметрах виртуальной таблицы

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


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

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

Способ 3. Преобразование значения в запросе и флаг «Игнорировать NULL»

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

  1. В тексте запроса заменим неопределенные значения на NULL:

ВЫБОР
    КОГДА Таблица.Регистратор = НЕОПРЕДЕЛЕНО ТОГДА NULL
    ИНАЧЕ Таблица.Регистратор
КОНЕЦ КАК Регистратор
  1. Перейдем на вкладку «Наборы данных», найдем поле Регистратор и в колонке «Роль» установим флаг Игнорировать NULL.

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

Способ 4. Разделение выборки на Остатки и Обороты

В сложных отчетах, где требуется безупречная точность структуры, разделим получение данных на два источника:

  1. Первый запрос получает данные из виртуальной таблицы Остатки (без поля Регистратор).
  2. Второй запрос обращается к таблице Обороты (с указанием периодичности Регистратор).
  3. В СКД настраивается объединение запросов или создаются два набора данных с последующей связью по измерениям.

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

Правила корректной настройки полей-периодов в СКД

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

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