День добрый. Написал запрос на отбор остатков на складе, которых осталось меньше, чем указанное в регистре минимальное значение. Проблема в том, что если остаток на складе равен 0, номенклатура в отбор не попадает. Помогите, пожалуйста, разобраться(

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

СГРУППИРОВАТЬ ПО
 ТоварныеОграничения.Номенклатура.Родитель,
 ТоварныеОграничения.МинимальноеКоличествоЗапаса,
 ТоварныеОграничения.Склад,
 ТоварныеОграничения.Номенклатура,
 ТоварныеОграничения.МаксимальноеКоличествоЗапаса,
 СвободныеОстаткиОстатки.ВНаличииОстаток

УПОРЯДОЧИТЬ ПО
 НоменклатураРодитель
---
по-хорошему надо почитать что-нибудь осмысленное про базы данных и язык SQL. Причем всем участникам обсуждения, сдается мне.

```1c
    ИЗ
    РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
    ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
    ГДЕ
    СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
```

в таком варианте в результат попадет только то, что есть в остатках. Во-первых, потому, что соединение внутреннее. Во-вторых, потому, что стоит условие на содержимое второй таблицы.
Для того, чтобы выбрать все из ТоварныеОграничения, надо убрать жесткую привязку к остаткам. А для этого нужно как минимум два исправления запроса.

```1c
    ИЗ
    РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
    ВНУТРЕННЕЕ ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
    ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
    ГДЕ
    СвободныеОстаткиОстатки.ВНаличииОстаток ЕстьNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
```
---
когда остаток 0, то выборки вообще никакой не будет.
Т.е. вы не получите записи номенклатура такая то остаток 0.
В выборку попадают только отличающиеся от нуля значения.

Если нужна такая запись в выборке, то нужно сделать виртуальную таблицу с исходным перечнем номенклатуры,
и уже к ней левым соединением подсоединять остатки из регистра.
А где ЕСТЬNULL - то ставим 0.
---
Делай ЛЕВОЕ соединение
---
ничего не изменилось(
---
потому что вот это

```1c
    ГДЕ
    СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
```

надо убрать и перенести в условие связей таблиц
---
Надо - ПОЛНОЕ СОЕДИНЕНИЕ
---
по-хорошему надо почитать что-нибудь осмысленное про базы данных и язык SQL. Причем всем участникам обсуждения, сдается мне.

```1c
    ИЗ
    РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
    ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
    ГДЕ
    СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
```

в таком варианте в результат попадет только то, что есть в остатках. Во-первых, потому, что соединение внутреннее. Во-вторых, потому, что стоит условие на содержимое второй таблицы.
Для того, чтобы выбрать все из ТоварныеОграничения, надо убрать жесткую привязку к остаткам. А для этого нужно как минимум два исправления запроса.

```1c
    ИЗ
    РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
    ВНУТРЕННЕЕ ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
    ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
    ГДЕ
    СвободныеОстаткиОстатки.ВНаличииОстаток ЕстьNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
```
---
Спасибо большое. работает!
---
ВЫБРАТЬ ... ИЗ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура