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

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

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

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

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

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

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

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


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

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

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

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

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

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

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


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

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

← На главную