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