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

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

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

Проанализируем ситуацию: эта "лишняя" строка не является ошибкой. Это абсолютно законная запись, которая представляет собой начальный остаток на начало периода отчета. По своей логике, начальный остаток не привязан ни к какому документу-регистратору — он просто показывает состояние на определенный момент времени. Поэтому, когда мы группируем данные по полю Регистратор, СКД честно выводит эту запись в отдельную строку, где значение регистратора пустое.

Теперь, когда мы выяснили причину, рассмотрим несколько способов, как можно настроить отчет, чтобы он выглядел так, как нам нужно.

Решение 1: Отбор в настройках группировки (самый простой и частый способ)

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

Разберем по шагам:

  1. Перейдите в настройки отчета СКД на вкладку "Структура".
  2. Найдите в структуре вашу группировку по полю Регистратор.
  3. Выделите эту группировку и перейдите на вкладку "Отбор" (именно для этой группировки, а не для всего отчета).
  4. Добавьте новый элемент отбора.
  5. В качестве поля для отбора выберите Регистратор.
  6. В качестве вида сравнения установите "Заполнено". Альтернативный вариант — использовать вид сравнения "Не равно" и оставить значение пустым.

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

Решение 2: Использование NULL в запросе и роли поля

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

Посмотрим на пример:

  1. Откройте схему компоновки данных и перейдите в набор данных (запрос).
  2. Измените поле Регистратор в списке выбора полей запроса, используя конструкцию ВЫБОР.
    
    ВЫБОР
        КОГДА ОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
            ТОГДА NULL
        ИНАЧЕ ОставткиИОбороты.Регистратор
    КОНЕЦ КАК Регистратор
    
  3. После изменения запроса перейдите на вкладку "Роли" в настройках этого же набора данных.
  4. Найдите поле Регистратор в списке полей.
  5. Установите для этого поля флажок в колонке "Игнорировать NULL".

Теперь СКД не будет включать в группировку записи, где Регистратор равен NULL, что в нашем случае соответствует строке начального остатка. Итоги также будут рассчитаны корректно.

Решение 3: Настройка параметров виртуальной таблицы

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

Рассмотрим подробнее:

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

Посмотрим на пример:


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

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

Таким образом, ощущение "кривизны" при появлении пустой строки — это лишь следствие недостаточного понимания механики работы виртуальных таблиц. Используя простые и стандартные инструменты настройки СКД, такие как отбор в группировке, можно легко добиться нужного вида отчета, сохранив при этом корректность всех данных.

← К списку