УНФ 1,6. Необходимо удалить из заказ все позиции по которым нет остатков на складе

```1c
    ВЫБРАТЬ
    ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
    ЗапасыНаСкладахОстатки.Организация КАК Организация,
    ЗапасыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ЗапасыНаСкладахОстатки.Характеристика КАК Характеристика
    ПОМЕСТИТЬ Остатки
    ИЗ
    РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки
    ГДЕ
    ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) <= 0
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
    Остатки.КоличествоОстаток КАК КоличествоОстаток,
    ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
    ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
    ЛЕВОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
    ПО ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация
    И ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура
    И ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика
    ГДЕ
    ЗаказПокупателяЗапасы.Ссылка = &Ссылка

    УПОРЯДОЧИТЬ ПО
    НомерСтроки УБЫВ
```

Выводит даже строки, по которым остатки больше нуля. Подскажите, где ошибка в запросе!?
---
Вот так попробуй. Не проверял, но думаю должно работать.

```1c
    ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
    Остатки.КоличествоОстаток КАК КоличествоОстаток,
    ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
    ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК Остатки
    ПО (ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация)
    И (ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура)
    И (ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика)
    ГДЕ
    ЗаказПокупателяЗапасы.Ссылка = &Ссылка
    И ЕСТЬNULL(Остатки.КоличествоОстаток, 0) <= 0

    УПОРЯДОЧИТЬ ПО
    НомерСтроки УБЫВ
```
---
Никто не говорил, что левое не правильно. Вы его просто не умеете готовить.

Правильный запрос в (6), только соединение ЛЕВОЕ.
---
ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) <= 0 Тут не может быть NULL
---
Тут можно обойтись и без временной таблицы.
---
используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ
---
Так в запросе вообще пусто.
---
правильно, если на остатках количество 0, тогда в виртуальной таблице Остатки номенклатуры вообще нет. Это намек на алгоритм поиска.
---
вот что-то в этом роде:

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

    ГДЕ
    ЗаказПокупателяЗапасы.Ссылка = &Ссылка И Остатки.Номенклатура ЕСТЬ NULL

    УПОРЯДОЧИТЬ ПО
    НомерСтроки УБЫВ
```
---
в дополнении к (17): так как не рекомендуется делать соединение реальной таблицы с виртуальной, то вот еще вариант:

```1c
    ВЫБРАТЬ
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ЗаказКлиентаТовары.Характеристика КАК Характеристика
    ПОМЕСТИТЬ вт_номенклатура
    ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
    ГДЕ
    ЗаказКлиентаТовары.Ссылка = &Ссылка
    ;

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

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ЗаказКлиентаТовары.Количество КАК Количество
    ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
    ЛЕВОЕ СОЕДИНЕНИЕ вт_товарыВНаличии КАК вт_товарыВНаличии
    ПО ЗаказКлиентаТовары.Номенклатура = вт_товарыВНаличии.Номенклатура
    И ЗаказКлиентаТовары.Характеристика = вт_товарыВНаличии.Характеристика
    ГДЕ
    ЗаказКлиентаТовары.Ссылка = &Ссылка
    И вт_товарыВНаличии.Номенклатура ЕСТЬ NULL
```

Свои таблицы и поля подставите сами.
---
вложенные запросы в условии вроде как не рекомендуют использовать.
---
этот вариант один из самых правильных. Условие отбора накладываются на виртуальную таблицу с выборкой из временной. Можно еще добавить индексацию для временной таблицы.
Иначе виртуальная таблица будет выбирать все остатки.

И не надо игнорировать вложенные запросы совсем. Просто нужно понимать их особенность. При сложном вложенном запросе оптимизатор запроса не всегда может определить получаемое количество выборки и соответственно может построить неоптимальный план запроса. Ну, и индексации во вложенном запросе не будет. В данном случае все будет прозрачно для оптимизатора.
---
Левое соединение - оно такое. Выводит все, что есть в правой таблице.
---
Вот так попробуй. Не проверял, но думаю должно работать.

```1c
    ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
    Остатки.КоличествоОстаток КАК КоличествоОстаток,
    ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
    ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК Остатки
    ПО (ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация)
    И (ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура)
    И (ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика)
    ГДЕ
    ЗаказПокупателяЗапасы.Ссылка = &Ссылка
    И ЕСТЬNULL(Остатки.КоличествоОстаток, 0) <= 0

    УПОРЯДОЧИТЬ ПО
    НомерСтроки УБЫВ
```
---
В запросе тогда пусто в консоли. Нет ни одной строки вообще.
---
в (3) ответили же в чем проблема

```1c
    ГДЕ
    ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) <= 0
```

условие неверное
используйте просто

```1c
    ГДЕ
    ЗапасыНаСкладахОстатки.КоличествоОстаток <= 0
```
---
```1c
    ВЫБРАТЬ
    ЗапасыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ЗапасыНаСкладахОстатки.Организация КАК Организация,
    ЗапасыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ЗапасыНаСкладахОстатки.Характеристика КАК Характеристика
    ПОМЕСТИТЬ Остатки
    ИЗ
    РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки
    ГДЕ
    ЗапасыНаСкладахОстатки.КоличествоОстаток <= 0
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
    Остатки.КоличествоОстаток КАК КоличествоОстаток,
    ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки
    ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
    ПОЛНОЕ СОЕДИНЕНИЕ Остатки КАК Остатки
    ПО ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация
    И ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура
    И ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика
    ГДЕ
    ЗаказПокупателяЗапасы.Ссылка = &Ссылка

    УПОРЯДОЧИТЬ ПО
    НомерСтроки УБЫВ
```

Все равно строк 5, ничего вообще не изменилось
---
В этом не может быть принципиальной ошибки и тем более проблемы!

Или вы не представляете что такое

```1c
    ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0)
```

Оно всегда будет работать...
Это же просто проверка , если ЗапасыНаСкладахОстатки.КоличествоОстаток NULL то выдаст 0 , а если НЕ NULL то выдаст ЗапасыНаСкладахОстатки.КоличествоОстаток
(первый класс вторая четверть)

А то что ЗапасыНаСкладахОстатки.КоличествоОстаток никогда не будет NULL (и это так ) в этом месте совершенно никак не повлияет на результат.....
---
Без условия <=0 проверяю в консоли. 1поз остатки 15 штук, еще 3 позиции понулям, 1 в минус. Левое соед. Выводятся все пять, в строке количество остаток в 1поз 15 в остальных пусто. Ставлю условие, выводятся опять все ПЯТЬ колонок, но везде в количествоОстаток пусто. Как сделать, чтоб выводилось 4 колонки, только там где нет остатков!?
---
Все равно строк 5, а надо чтоб было 4ре, только те, по которым нет остатков. Чтоб потом их собственно удалить, как то так

```1c
    Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
    Запрос.УстановитьПараметр("Склад", Объект.СтруктурнаяЕдиницаРезерв);

    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
    Объект.Запасы.Удалить(Выборка.НомерСтроки-1);
    КонецЦикла;
    //Объект.Записать();
```
---
так вы же полное соединение с табл. частью заказа сделали, что вы хотите то?
вам нужно левое и еще доп условие по номенклатуре временной таблицы
---
Левое было изначально,сказали не правильно. Какое доп условие?
---
а вообще я бы сделал не так совсем
у вас по условию требуется что - вытащить из заказа строки с остатками <=0
значит или таблица остатков главная должна быть или выборку по заказу тоже во временную таблицу помещать и уже для результата запрос по двум временным таблицам, но опять же по остаткам главная
---
Странный совет. Получился полный бред.что и предполагалось, при "главной", таблице остатков

```1c
    ВЫБРАТЬ
    ЗапасыНаСкладахОстатки.КоличествоОстаток КАК КоличествоОстаток,
    ЗапасыНаСкладахОстатки.Организация КАК Организация,
    ЗапасыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    ЗапасыНаСкладахОстатки.Характеристика КАК Характеристика
    ПОМЕСТИТЬ Остатки
    ИЗ
    РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки
    ГДЕ
    ЗапасыНаСкладахОстатки.КоличествоОстаток <= 0
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
    ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки,
    ЗаказПокупателяЗапасы.Ссылка.Организация КАК Организация
    ПОМЕСТИТЬ Заказ
    ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
    ГДЕ
    ЗаказПокупателяЗапасы.Ссылка = &Ссылка
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Заказ.Номенклатура КАК Номенклатура,
    Заказ.Характеристика КАК Характеристика,
    Заказ.НомерСтроки КАК НомерСтроки,
    Остатки.КоличествоОстаток КАК КоличествоОстаток
    ИЗ
    Остатки КАК Остатки
    ЛЕВОЕ СОЕДИНЕНИЕ Заказ КАК Заказ
    ПО Остатки.Номенклатура = Заказ.Номенклатура
    И Остатки.Характеристика = Заказ.Характеристика
    И Остатки.Организация = Заказ.Организация
```
---
Никто не говорил, что левое не правильно. Вы его просто не умеете готовить.

Правильный запрос в (6), только соединение ЛЕВОЕ.
---
(12) Выполните в консоли , которая может показать вам записи временной таблицы, что там?
И вы бы картинку результата с текстом в консоли выложили для лучшего понимания проблемы...
Каких строк у вас 5?

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

 Во вторых изучите основы 1С и не путайте виртуальные таблицы с временными!

Во третьих по условию и не нужны положительные остатки!

И в четвертых, да можно обойтись без временной таблицы , но она не является принципиальной ошибкой.
Если скажем я захочу увидеть как промежуточный результат все неположительные остатки на складе....
---
Во вторых изучите основы 1ССмешно :)

Вариант в (1) не вернет того, что нужно автору.
Если на складе есть яблоко - 5шт и нет груш, то в первой таблице не будет ни яблока(потому что условие на остаток<=0), ни груши(потому что в вирутальной :D таблице остатков ее нет).
При соединении с тч документа и по яблоку и по груше получим NULL.
---
По поводу смешного - простите , погорячился...
Воспринял , что вы якобы назвали "ПОМЕСТИТЬ Остатки " - виртуальной таблицей...

Автору нужно
Необходимо удалить из заказ все позиции по которым нет остатков на складе
То есть нужны именно эти записи с NULL во 2 части , чтобы их удалить из заказа !

А вы что ищете? Положительные остатки?
---
Картинка.
---
Вы меня не услышали ...
 И почему у вас в нижней таблице вместо NULL Пустота???

Вот и нужно из нижней таблицы удалить Груши и Яблоки.
То есть удалить там где -35 и там где NULL
---
Тыква-то должна остаться. А на ней тоже NULL. Потому что отбор был по условию <=0 и она со своим положительным остатком не попала.

(28) И почему у вас в нижней таблице вместо NULL Пустота?Консоль такая. Так будет виднее:
---
Тыква должна остаться по условию задачи не в запросе, а в Заказе после программного удаления тех что в запросе имеют Минус или NULL
---
Ну вы же видите на картинке, что у тыквы и яблока одинаковые значения? Совсем одинаковые. NULL.
Потому что ни тыквы, ни груши нет в таблице остатки.
---
Спасибо огромное за вашу настойчивость!
И простите мне мою глупость....
Вы правы!
До меня доходило как до жирафа очень долго... )))))

Конечно же условие на <= 0 Ставить во 2 части запроса и тогда все бы работало...
---
Да, местоположение условия решает :)
---
По-моему такой вариант более простой и правильный

```1c
    ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Характеристика КАК Характеристика,
    ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки,
    ЗаказПокупателяЗапасы.Ссылка.Организация = Организация
    ПОМЕСТИТЬ ТабЧасть
    ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
    ГДЕ
    ЗаказПокупателяЗапасы.Ссылка = &Ссылка

    ИНДЕКСИРОВАТЬ ПО
    Организация,
    Номенклатура,
    Характеристика
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    ТабЧасть.Номенклатура КАК Номенклатура,
    ТабЧасть.Характеристика КАК Характеристика,
    ТабЧасть.НомерСтроки КАК НомерСтроки,
    ЕСТЬNULL(ЗапасыНаСкладах.КоличествоОстаток, 0) КАК КоличествоОстаток
    ПОМЕСТИТЬ Итоговая
    ИЗ
    ТабЧасть КАК ТабЧасть
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(
    &Дата,
    СтруктурнаяЕдиница = &Склад
    И (Организация, Номенклатура, Характеристика) В
    (ВЫБРАТЬ РАЗЛИЧНЫЕ
    ТабЧасть.Организация КАК Организация,
    ТабЧасть.Номенклатура КАК Номенклатура,
    ТабЧасть.Характеристика КАК Характеристика
    ИЗ
    ТабЧасть КАК ТабЧасть)) КАК ЗапасыНаСкладах
    ПО ТабЧасть.Номенклатура = ЗапасыНаСкладах.Номенклатура
    И ТабЧасть.Характеристика = ЗапасыНаСкладах.Характеристика
    И ТабЧасть.Организация = ЗапасыНаСкладах.Организация
    ;

    ////////////////////////////////////////////////////////////­////////////////////
    ВЫБРАТЬ
    Итоговая.Номенклатура КАК Номенклатура,
    Итоговая.Характеристика КАК Характеристика,
    Итоговая.НомерСтроки КАК НомерСтроки,
    Итоговая.КоличествоОстаток КАК КоличествоОстаток
    ИЗ
    Итоговая КАК Итоговая
    ГДЕ
    Итоговая.КоличествоОстаток <= 0

    УПОРЯДОЧИТЬ ПО
    НомерСтроки УБЫВ
```