Доброго времени суток!
Сегодня убил весь день, чтобы понять, как сделать, но совершенно ничего не понял..
Нужно получить нулевые остатки с регистра - СвободныеОстатки.
Если нет записи в регистре, то написать:
а) Недостающий склад
б) Остаток равен 0.

Мой запрос, который просто показывает склады и количество остатков на нём.

```1c
    ВЫБРАТЬ
    | СвободныеОстаткиОстатки.Номенклатура.Код КАК НоменклатураКод,
    | СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличии,
    | СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    | СвободныеОстаткиОстатки.Склад.Наименование КАК СкладНаименование
    |ИЗ
    | РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
    |ГДЕ
    | СвободныеОстаткиОстатки.Номенклатура = &Номенклатура
```

И пожалуйста, прямо для чайников.. Понимаю, что нужно сделать левое соединение, даже нашёл несколько примеров, но разобраться ума не хватает..
---
```1c
    ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    СвободныеОстаткиОстатки.Склад.Представление КАК Склад,
    СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличии
    ПОМЕСТИТЬ ВТ_Остатки
    ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура В (&Номенклатура)) КАК СвободныеОстаткиОстатки

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Товары.Ссылка КАК Номенклатура,
    ЕСТЬNULL(ВТ_Остатки.Склад, "Недостающий склад") КАК Склад,
    ЕСТЬNULL(ВТ_Остатки.ВНаличии, 0) КАК ВНаличие
    ИЗ
    Справочник.Номенклатура КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
    ПО (ВТ_Остатки.Номенклатура = Товары.Ссылка)

    ГДЕ
    Товары.Ссылка В (&Номенклатура)
```
---
Лучше вот так

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

Если надо убрать группы, то сразу в запросе и пишите "Склады.ЭтоГруппа = Ложь". Если нужны склады в определенной папке, то лучше написать "Склады.Ссылка В ИЕРАРХИИ (&ГруппаСкладов)"
---
```1c
    ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    СвободныеОстаткиОстатки.Склад.Представление КАК Склад,
    СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличии
    ПОМЕСТИТЬ ВТ_Остатки
    ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура В (&Номенклатура)) КАК СвободныеОстаткиОстатки

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Товары.Ссылка КАК Номенклатура,
    ЕСТЬNULL(ВТ_Остатки.Склад, "Недостающий склад") КАК Склад,
    ЕСТЬNULL(ВТ_Остатки.ВНаличии, 0) КАК ВНаличие
    ИЗ
    Справочник.Номенклатура КАК Товары
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
    ПО (ВТ_Остатки.Номенклатура = Товары.Ссылка)

    ГДЕ
    Товары.Ссылка В (&Номенклатура)
```
---
Большое вам спасибо, однако, если указывать Номенклатуру, то всё так же и остаётся, как было в моём запросе..
---
так не видны параметры, какая номенклатура выбрана. Если выбрана только одна и по ней есть остатки, то так и покажет.
Если добавить номенклатуру, которой нет на остатках, тогда ее тоже покажет со складом "Недостающий склад" и количеством 0.
---
ваш код не менял, просто задал параметр Номенклатура.
---
так, и в чем проблема?
---
Выбрал номенклатуру, он показывает только те склады и остатки, где есть эта номенклатура.
А мне нужно, чтобы при выборе номенклатуры показывались все имеющиеся склады, и если есть остаток - выводиться, если нет, то 0
---
ну, в постановке задачи это было не явно.
А если такой номенклатуры вообще на остатках нет, тоже ее показывать со всеми складами?
---
да
---
вот вариант для любого количества номенклатуры:

```1c
    ВЫБРАТЬ
    СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
    СвободныеОстаткиОстатки.Склад КАК Склад,
    СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличии
    ПОМЕСТИТЬ ВТ_Остатки
    ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура В (&Номенклатура)) КАК СвободныеОстаткиОстатки

    ИНДЕКСИРОВАТЬ ПО
    Склад,
    Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Склады.Ссылка КАК Склады,
    Номенклатура.Ссылка КАК Номенклатура
    ПОМЕСТИТЬ ВТ_НоменклатураСклады
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
    ПО (ИСТИНА)
    ГДЕ
    Номенклатура.Ссылка В(&Номенклатура)

    ИНДЕКСИРОВАТЬ ПО
    Склады,
    Номенклатура
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ВТ_НоменклатураСклады.Номенклатура КАК Номенклатура,
    ВТ_НоменклатураСклады.Склады КАК Склады,
    ЕСТЬNULL(ВТ_Остатки.ВНаличии, 0) КАК ВНаличии
    ИЗ
    ВТ_НоменклатураСклады КАК ВТ_НоменклатураСклады
    ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
    ПО (ВТ_НоменклатураСклады.Склады = ВТ_Остатки.Склад)
    И (ВТ_НоменклатураСклады.Номенклатура = ВТ_Остатки.Номенклатура)

    УПОРЯДОЧИТЬ ПО
    Номенклатура,
    Склады
```
---
Отсутствие остатка это информация и очень важная. В задаче явно сказано, что информация должна подаваться для вех складов. В чем проблема показать таблицу нулей? Вы бережете мониторы от выгорания матрицы?
---
Нет склада. Как следует из задачи, должно быть "Склад 1 : 0"
И пакет здесь совсем чужой, все одним запросом делается.
---
Нет склада. Как следует из задачи, должно быть "Склад 1 : 0"
это вы откуда взяли такую постановку задачи?
---
откуда в вашем запросе вообще возьмется пустой склад? Из попы на месте головы? Вы думаете в результате левого соединения по номенклатуре вам дадут еще и склады несуществующие в выборке? Нет, не дадут, это не так работает. В данном случае очень проблематично получить Null, почти невозможно.

А теперь отвечаю на вопрос. Из русского языка. Недостающий склад не обернут в кавычки, значит это не константа, а именно название склада, на котором нет товара.
---
откуда в вашем запросе вообще возьмется пустой склад? Из попы на месте головы? Вы думаете в результате левого соединения по номенклатуре вам дадут еще и склады несуществующие в выборке? Нет, не дадут, это не так работает. В данном случае очень проблематично получить Null, почти невозможно.
Ей. Полегче. Если не знаете как работает левое соединение, то не обязательно об этом говорить, да еще в таком тоне.
И мой код основывался на получение складов по несуществующей записи номенклатуры в остатках.
---
Ваш запрос легко проверяется в консоли на любой рабочей УТ. Вы в первом подзапросе получили остатки с отбором по конкретной номенклатуре, во втором запросе выбираете из справочника номенклатуры и по номенклатуре соединяете. Откуда там возьмется неизвестная номенклатура? Вы имели в виду несуществующей записи склада в остатках. Ну так и соединяйте со складами. И не стоит делать такую виртуальную таблицу, если в запросенет группировки данных или выбора данных для условия других запросов, это таблица-паразит.
---
еще раз. Я делал на отсутствие номенклатуры в остатках. Не нужно пытаться свое виденье накладывать на мой код.
Я не склады отслеживал.
То что в итоге нужно другое, это другой вопрос. По постановке задачи это не было понятно.
---
Т.е. Вы реально вот так поняли задачу. Вывести номенклатуру с остатком ноль и надписью "Недостающий склад". Ок. Но тогда надо было проверку на isnull, что нет вхождения в таблицу остатков, и написать 0 как ВНаличии. Зачем усложнили?
---
вот. Теперь по делу.
Соединять виртуальную таблицу остатки с физической не рекомендуется. Не будут работать индексы.
Далее, делать полное соединение это ... ну очень плохо. Особенно для базы на Postgree.
Ну и предполагал, что выборка будет не по одной номенклатуре, а по списку (в коде можно заметить).
---
По логике 1с в виртуальную таблицу остатков попадают только записи с не нулевыми ресурсами.
---
То есть слева хотите получить Все склады И всю номенклатуру ( по этим всем складам)?
---
Да, т.е. по всем складам и по всей номенклатуре получить остаток, если нет этого остатка, то 0
---
тут нужно использовать логику. Есть такая наука...
РегистрНакопления.СвободныеОстатки.Остатки - не может показать того, чего на остатках нет. Логично же?
Значит, информацию надо брать не оттуда. Логично?
А откуда? Если нам нужны все товары и все склады, то надо брать информацию из таблиц товаров и складов. А остатки уже к ним привязывать.
Какой вывод?

```1c
    Выбрать блабла
    Из Справочник.Номенклатура
    Левое соединение РегистрНакопления.СвободныеОстатки.Остатки
    по блабла
```
---
Это я понял и это даже получилось, но когда пытаюсь сделать то же самое для складов - выдаёт ошибку.
---
код в студию
---
```1c
    ВЫБРАТЬ
    Склады.Ссылка КАК Ссылка,
    ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, "Остаток равен 0") КАК ВНаличииОстаток
    ИЗ
    РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура = &Номенклатура) КАК СвободныеОстаткиОстатки
    ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
    ПО (СвободныеОстаткиОстатки.Склад = Склады.Ссылка)
```
---
Ничего не понимаю, если указывать конкретную номенклатуру, то всё работает.
Если указать Родителя, то нулевых остатков нет.

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

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

Если надо убрать группы, то сразу в запросе и пишите "Склады.ЭтоГруппа = Ложь". Если нужны склады в определенной папке, то лучше написать "Склады.Ссылка В ИЕРАРХИИ (&ГруппаСкладов)"
---
(28) Склады.Ссылка В ИЕРАРХИИ (&ГруппаСкладов)
Если сделать так, то он выводит вообще все склады.
Я одного не понимаю, почему если вместо номенклатуры задать родителя нулевые остатки пропадают?
Ах, да, если выполнить этот запрос, то нулевых остатков так и нет..