Проверка на 0 в запросе

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

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

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

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

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

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

ИЗ
РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ВНУТРЕННЕЕ ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток ЕстьNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
signum2009; +1 Ответить
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
7. Boneman 298 11.01.19 09:39 Сейчас в теме
(1) когда остаток 0, то выборки вообще никакой не будет.
Т.е. вы не получите записи номенклатура такая то остаток 0.
В выборку попадают только отличающиеся от нуля значения.

Если нужна такая запись в выборке, то нужно сделать виртуальную таблицу с исходным перечнем номенклатуры,
и уже к ней левым соединением подсоединять остатки из регистра.
А где ЕСТЬNULL - то ставим 0.
2. ZergKRSK 129 11.01.19 09:13 Сейчас в теме
Делай ЛЕВОЕ соединение
3. user921876 11.01.19 09:21 Сейчас в теме
ничего не изменилось(
5. ZergKRSK 129 11.01.19 09:29 Сейчас в теме
(3) потому что вот это
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса

надо убрать и перенести в условие связей таблиц
4. kumi2012 102 11.01.19 09:27 Сейчас в теме
Надо - ПОЛНОЕ СОЕДИНЕНИЕ
6. starjevschik 11.01.19 09:38 Сейчас в теме
по-хорошему надо почитать что-нибудь осмысленное про базы данных и язык SQL. Причем всем участникам обсуждения, сдается мне.

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

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

ИЗ
РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ВНУТРЕННЕЕ ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток ЕстьNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
signum2009; +1 Ответить
9. user921876 11.01.19 09:45 Сейчас в теме
(6)
Спасибо большое. работает!
8. Vitaly1C8 11.01.19 09:40 Сейчас в теме
ВЫБРАТЬ ... ИЗ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)