Как работает виртуальная таблица «Остатки и обороты» и попадут ли в нее данные при нулевых остатках?

Программист Управленческий учет Торговля и дистрибуция
← На главную

При работе с регистрами накопления в системе 1С:Предприятие одной из самых востребованных, но в то же время вызывающих вопросы, является виртуальная таблица ОстаткиИОбороты. Часто возникает дилемма: что именно вернет запрос, если остатка на складе нет, но движения по товару были? Или наоборот — если движения отсутствовали, но товар «завис» на остатке? В этой статье мы подробно разберем механику работы этой таблицы, визуализируем данные и научимся правильно обрабатывать результаты в запросах.

Принцип формирования данных в виртуальной таблице

Разберем ситуацию, которая часто ставит в тупик начинающих разработчиков. Виртуальная таблица ОстаткиИОбороты — это не просто сумма двух других таблиц. Это интеллектуальный механизм, который объединяет данные из физических таблиц остатков и таблиц движений (оборотов) регистра. Проанализируем условия, при которых запись о товаре (или другом измерении) попадет в результат запроса за выбранный период:

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

Рассмотрим пример: Вы продали весь товар «Молоко» в течение дня. Утром было 0, пришло 10 штук, продали 10 штук, вечером стало 0. Если мы обратимся к виртуальной таблице ТоварыНаСкладах.ОстаткиИОбороты за этот день, товар «Молоко» обязательно попадет в запрос, так как система увидит обороты (Приход = 10, Расход = 10).

Визуальное представление данных

Для лучшего понимания представим результат запроса в виде плоской таблицы. Система автоматически рассчитывает основные показатели. Посмотрим на типичный набор полей:

Таблица: Товары на складах (Остатки и обороты)

Номенклатура | НачОстаток | Приход | Расход | КонОстаток

Проанализируем различные ситуации для товара:

Использование Левого соединения (LEFT JOIN)

Выясним причину, по которой данные могут «пропадать» или отображаться некорректно при соединении таблиц. Часто мы хотим получить список всех товаров из справочника Номенклатура и сопоставить их с данными регистра. В этом случае мы используем ЛЕВОЕ СОЕДИНЕНИЕ.

Рассмотрим структуру запроса:


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

Важный нюанс: Если по товару в выбранном периоде не было ни остатков, ни оборотов, то виртуальная таблица вообще не вернет строку для этого товара. При левом соединении в полях остатков и оборотов возникнет значение NULL. Чтобы в отчете вместо пустоты пользователь видел красивые нули, мы обязательно используем функцию ЕСТЬNULL(Поле, 0). Это стандарт «хорошего тона» в разработке на 1С.

Параметры виртуальной таблицы: Фильтрация и Периодичность

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

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

Проанализируем ошибку: Многие новички пишут условия фильтрации (например, по Складу) в секции ГДЕ основного запроса. Это заставляет систему сначала выгрузить в память абсолютно все остатки и обороты по всем складам, а потом отсекать лишнее. Правильный подход — передавать фильтр в параметры самой виртуальной таблицы.

Пример правильной фильтрации:


// Правильно: фильтр внутри параметров
РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&ДатаНач, &ДатаКон, , , Склад = &НужныйСклад)

Метод дополнения периодов

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

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

← На главную