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