Как в отчете СКД скрыть строки без движений (прихода и расхода), сохранив начальные и конечные остатки

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

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

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

Почему в отчете появляются строки без движений?

Разберем природу проблемы. Виртуальная таблица РегистрНакопления.ПродукцияНаСкладе.ОстаткиИОбороты предназначена для получения временного ряда. Если мы просим данные в разрезе дней, СКД стремится обеспечить непрерывность этого ряда. Даже если 14-го числа не было прихода или расхода, но на складе лежало 10 единиц товара, система покажет начальный остаток 10 и конечный остаток 10. Для складского учета это логично, но для анализа активности — избыточно.

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

Решение 1. Настройка отбора на уровне группировки

Это самый простой и рекомендуемый способ, который не требует изменения структуры запроса. Вместо того чтобы пытаться ограничить выборку в ГДЕ, мы позволим системе рассчитать все остатки, но скроем лишние строки при выводе.

  1. Перейдем на вкладку Настройки в схеме компоновки данных.
  2. Выберем конкретную группировку (например, по полю Детальные записи или Период).
  3. На вкладке Отбор добавим группу условий ИЛИ.
  4. Внутри этой группы добавим два условия:
    • КоличествоПриход Не равно 0
    • КоличествоРасход Не равно 0
  5. Чтобы пользователь не видел технический отбор в шапке отчета, в Других настройках установим параметр Выводить отбор в значение Не выводить.

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

Решение 2. Изменение ролей полей периода

Иногда система «упрямится» и продолжает дополнять периоды из-за специфических настроек ролей. Рассмотрим вариант с изменением метаданных полей в наборе данных.

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

Важный нюанс: при таком подходе нужно быть осторожным, если в отчете используются расчеты остатков по сложным формулам или группировкам. Проверьте, что НачальныйОстаток и КонечныйОстаток по-прежнему выводятся верно для тех строк, что остались.

Решение 3. Использование вложенного запроса с фильтрацией оборотов

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

Разберем пример кода для такого запроса:


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

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

В данном случае мы используем таблицу Обороты как фильтр. Поскольку в ней физически нет записей для дней без движений, результирующая выборка будет содержать только «активные» дни. Использование ЕСТЬNULL обязательно, чтобы избежать пустых значений в ресурсах.

Решение 4. Отключение дополнения периодов в настройках

Часто причиной появления лишних строк является включенная настройка дополнения дат в самой СКД. Проверим этот момент:

  1. В настройках отчета выберем группировку по полю Период.
  2. Нажмем кнопку Параметры редактирования или заглянем в колонку Тип дополнения.
  3. Если там указано День, система будет принудительно добавлять все даты интервала. Выставим значение в пустое поле (или «Нет»).

Это заставит СКД выводить только те записи, которые реально присутствуют в выборке запроса после применения всех условий ГДЕ.

Рекомендации по проверке данных

После применения любого из методов обязательно выполним проверку итогов. Типичная ошибка при скрытии строк — «пропажа» начального остатка. Например, если прихода не было 1-го числа, а отчет начинается с 1-го числа, скрытая строка может содержать важный входящий остаток, который должен перекочевать в итоги по номенклатуре.

Чтобы этого избежать, убедимся, что:

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

← На главную