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