При построении отчетов на базе Системы компоновки данных (СКД) с использованием виртуальной таблицы ОстаткиИОбороты разработчики часто сталкиваются с появлением лишней пустой строки в группировке по полю Регистратор. При детальном анализе оказывается, что значение регистратора в такой строке равно НЕОПРЕДЕЛЕНО или NULL, а в числовых колонках выводятся суммы начального или конечного остатка. Разберем механизм возникновения этой строки и выясним практические способы её корректного устранения.
Проанализируем механику работы платформы 1С. В виртуальной таблице ОстаткиИОбороты по умолчанию применяется метод дополнения периодов ДвиженияИГраницыПериода. Платформа принудительно рассчитывает срезы остатков на границах выбранного интервала времени. Так как входящий остаток формируется совокупностью всех предшествующих документов, он не привязан к какому-либо конкретному первичному документу в рамках отчета. В результате СКД формирует служебную запись границы периода, где поле Регистратор не заполнено.
Если в настройках структуры отчета выводится группировка по регистратору, эта служебная запись отображается отдельной строкой. Рассмотрим различные варианты решения этой задачи в зависимости от требований к отчету.
Этот способ является наиболее универсальным, так как он позволяет скрыть пустую строку в детальных записях, не теряя при этом начальные остатки по объектам учета (например, по номенклатуре или контрагентам), по которым за выбранный период не было движений.
Разберем по шагам настройку схемы компоновки данных:
Регистратор (или детальные записи).Регистратор, вид сравнения — Заполнено.При таком подходе родительская группировка отобразит общий начальный и конечный остаток, а внутри нее раскроются только реальные документы движения без пустых промежуточных строк.
Рассмотрим вариант переключения метода дополнения непосредственно в тексте запроса. В параметрах виртуальной таблицы регистра можно явно указать вид дополнения:
ВЫБРАТЬ
Таблица.Номенклатура КАК Номенклатура,
Таблица.ПериодСекунда КАК ПериодСекунда,
Таблица.Регистратор КАК Регистратор,
Таблица.КоличествоНачальныйОстаток КАК КоличествоНачальныйОстаток,
Таблица.КоличествоПриход КАК КоличествоПриход,
Таблица.КоличествоРасход КАК КоличествоРасход,
Таблица.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(
&НачалоПериода,
&КонецПериода,
Авто,
Движения,
) КАК Таблица
Важное ограничение: параметр Движения исключает принудительное создание границ периодов. Пустые строки исчезнут, однако если по конкретной номенклатуре был входящий остаток, но за указанный период не произошло ни одной операции прихода или расхода, данная номенклатура вообще не попадет в выборку отчета. Применяйте этот метод только в тех случаях, когда требуется анализировать исключительно активные позиции с оборотами.
Если пустая строка формирует нежелательную ветку иерархии в СКД, можно обработать значение регистратора на уровне набора данных:
NULL:
ВЫБОР
КОГДА Таблица.Регистратор = НЕОПРЕДЕЛЕНО ТОГДА NULL
ИНАЧЕ Таблица.Регистратор
КОНЕЦ КАК Регистратор
Регистратор и в колонке «Роль» установим флаг Игнорировать NULL.Это исключит создание фиктивных группировок для пустых значений при обходе дерева результатов.
В сложных отчетах, где требуется безупречная точность структуры, разделим получение данных на два источника:
Остатки (без поля Регистратор).Обороты (с указанием периодичности Регистратор).Поскольку в таблице Обороты регистратор присутствует всегда, платформа в принципе не создает фиктивных записей с пустыми ссылками.
Чтобы система компоновки данных правильно рассчитывала итоги и остатки по регистраторам, проверим соблюдение обязательных правил:
Регистратор, обязательно включите в выборку поле ПериодСекунда (оно может быть скрыто из отображения, но должно присутствовать в наборе данных).Регистратор — Период 1, ПериодСекунда — Период 2, ПериодДень — Период 3).НачальныйОстаток и КонечныйОстаток).