Как исключить данные конкретных регистраторов из отчета СКД, не нарушив расчет остатков?

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

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

Почему стандартное условие ГДЕ ломает расчеты

Когда мы накладываем условие ГДЕ Регистратор <> &ИсключаемыйДокумент, система 1С на уровне запроса исключает записи из выборки. Для виртуальной таблицы это означает, что этих движений «никогда не существовало». В результате программа пересчитывает итоги, и ваш начальный остаток может оказаться неверным, так как он формируется на основе всех предыдущих записей, которые мы внезапно «удалили» из рассмотрения.

Решение 1: Использование временных таблиц для исключения

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

Сначала мы создаем временную таблицу Таблица, в которую отбираем ссылки на документы, которые должны быть исключены:


ВЫБРАТЬ
    Документ1.Ссылка
ПОМЕСТИТЬ Таблица
ИЗ
    Документ.Документ1 КАК Документ1
ГДЕ
    Документ1.ТабличнаяЧасть1.Поле1 = &НеЗаполнено;

Затем, в основном запросе к виртуальной таблице регистра, мы применяем условие отсечения:


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

Важно: Такой подход работает эффективно, если документов-исключений не слишком много, и они не являются критическими для сальдо на начало периода. Если же после исключения остатки все равно «пропадают», значит, исключенный документ был единственным источником данных за период.

Решение 2: Математический расчет остатков (метод «от противного»)

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

  1. Получаем начальный остаток на дату начала периода через виртуальную таблицу Остатки.
  2. Вычисляем приход и расход за период из физической таблицы движений, применив отбор ГДЕ Регистратор НЕ В (&СписокИсключений).
  3. Рассчитываем итоговое значение по формуле: НачальныйОстаток + Приход - Расход.

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

Практические советы по оптимизации

При реализации сложных отчетов в СКД придерживайтесь следующих правил:

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

← На главную