Как в 1С вывести номенклатуру с нулевыми остатками на складе?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Многие пользователи при переходе с платформы 7.7 на 8.x, настраивая складской учет на предприятии, сталкиваются с тем, что стандартные отчеты по остаткам товаров показывают только ту номенклатуру, по которой были движения или которая в данный момент числится на складе. Если товара на остатках нет (и никогда не было, или остаток обнулился), отчет его просто «не видит». Давайте разберемся, почему так происходит и как с помощью механизмов 1С получить полный список товаров, используя мини-склад или другие инструменты — для этой задачи есть обработка поиска и удаления номенклатуры с нулевыми остатками.

Почему стандартные отчеты не показывают нулевые остатки

Проблема кроется в способе обращения к данным. Виртуальные таблицы регистров накопления, обеспечивающие учет ТМЦ, такие как ТоварыНаСкладах.Остатки, устроены таким образом, что возвращают только те записи, которые реально существуют в базе на указанный момент времени. Если записи о товаре в регистре нет, виртуальная таблица возвращает пустой набор данных. Соответственно, если ваш отчет построен только на виртуальной таблице остатков, позиции с нулевым количеством исключаются из выборки автоматически.

Решение проблемы через левое соединение

Чтобы увидеть всю номенклатуру, необходимо изменить структуру запроса. Основным «источником» данных должен выступать не регистр, а справочник Номенклатура. Мы будем «приклеивать» к нему данные об остатках с помощью ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN). В этом случае, если для товара нет записи в остатках, 1С выведет саму номенклатуру, а в полях количества укажет NULL, который мы программно заменим на 0 — есть готовое расширение для анализа остатков в справочнике номенклатуры.

Рассмотрим пример создания такого запроса:


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

Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Результат = Запрос.Выполнить();

Важные нюансы при работе с запросами

При использовании левого соединения важно учитывать следующие моменты:

  1. Функция ЕСТЬNULL: Всегда используйте эту функцию для полей количества. Без нее вместо «0» в отчете будут отображаться пустые значения, что неудобно для восприятия и последующей обработки данных.
  2. Отборы в секции ГДЕ: Будьте очень осторожны. Если вы поставите условие ГДЕ ТоварыНаСкладахОстатки.Склад = &Склад, левое соединение превратится во внутреннее, и вы снова потеряете товары с нулевыми остатками. Правильно переносить такие отборы непосредственно в условие ПО: ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура И ТоварыНаСкладахОстатки.Склад = &Склад.
  3. Характеристики и серии: Если в вашей конфигурации ведется учет по характеристикам или сериям, запрос усложняется — задачу решает контроль остатков и цен с учетом характеристик. В этом случае остатки хранятся в разрезе комбинации Номенклатура + Характеристика. Для корректного отображения вам потребуется соединять справочник номенклатуры с таблицей характеристик, а уже затем с регистром остатков.

Альтернативный вариант: расширение запроса с ценами

Часто вместе с остатками пользователям нужно видеть актуальную цену товара — для этого подойдёт расширенный подбор номенклатуры с остатками и резервами. Мы можем расширить наш запрос, добавив СрезПоследних регистра сведений ЦеныНоменклатуры:


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

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

← На главную