Получение нулевых остатков из РегистраСвободныеОстаткиОстатки

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

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

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



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

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

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

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

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Товары.Ссылка КАК Номенклатура,
	ЕСТЬNULL(ВТ_Остатки.Склад, "Недостающий склад") КАК Склад,
	ЕСТЬNULL(ВТ_Остатки.ВНаличии, 0) КАК ВНаличие
ИЗ
	Справочник.Номенклатура КАК Товары
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Остатки КАК ВТ_Остатки
		ПО (ВТ_Остатки.Номенклатура = Товары.Ссылка)
		
ГДЕ
	Товары.Ссылка В (&Номенклатура)
Показать
9. Menmo 10 29.10.21 18:41 Сейчас в теме
(6)
ВЫБРАТЬ
СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
СвободныеОстаткиОстатки.Склад.Представление КАК Склад,
СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличии
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура В (&Номенклатура)) КАК СвободныеОстаткиОстатки

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

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

ГДЕ
Товары.Ссылка В (&Номенклатура)
Показать


Большое вам спасибо, однако, если указывать Номенклатуру, то всё так же и остаётся, как было в моём запросе..
Прикрепленные файлы:
10. spacecraft 29.10.21 18:49 Сейчас в теме
(9) так не видны параметры, какая номенклатура выбрана. Если выбрана только одна и по ней есть остатки, то так и покажет.
Если добавить номенклатуру, которой нет на остатках, тогда ее тоже покажет со складом "Недостающий склад" и количеством 0.
13. Menmo 10 29.10.21 18:55 Сейчас в теме
(10) ваш код не менял, просто задал параметр Номенклатура.
14. spacecraft 29.10.21 18:57 Сейчас в теме
(13) так, и в чем проблема?
16. Menmo 10 29.10.21 18:59 Сейчас в теме
(14) Выбрал номенклатуру, он показывает только те склады и остатки, где есть эта номенклатура.
А мне нужно, чтобы при выборе номенклатуры показывались все имеющиеся склады, и если есть остаток - выводиться, если нет, то 0
17. spacecraft 29.10.21 19:03 Сейчас в теме
(16) ну, в постановке задачи это было не явно.
А если такой номенклатуры вообще на остатках нет, тоже ее показывать со всеми складами?
18. Menmo 10 29.10.21 19:07 Сейчас в теме
26. spacecraft 29.10.21 20:22 Сейчас в теме
(18) вот вариант для любого количества номенклатуры:
ВЫБРАТЬ
	СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
	СвободныеОстаткиОстатки.Склад КАК Склад,
	СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличии
ПОМЕСТИТЬ ВТ_Остатки
ИЗ
	РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура В (&Номенклатура)) КАК СвободныеОстаткиОстатки

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

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

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

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

УПОРЯДОЧИТЬ ПО
	Номенклатура,
	Склады
Показать
20. gybson 29.10.21 19:12 Сейчас в теме
(17)Отсутствие остатка это информация и очень важная. В задаче явно сказано, что информация должна подаваться для вех складов. В чем проблема показать таблицу нулей? Вы бережете мониторы от выгорания матрицы?
11. gybson 29.10.21 18:51 Сейчас в теме
(6)Нет склада. Как следует из задачи, должно быть "Склад 1 : 0"
И пакет здесь совсем чужой, все одним запросом делается.
12. spacecraft 29.10.21 18:53 Сейчас в теме
(11)
Нет склада. Как следует из задачи, должно быть "Склад 1 : 0"

это вы откуда взяли такую постановку задачи?
19. gybson 29.10.21 19:09 Сейчас в теме
(12) откуда в вашем запросе вообще возьмется пустой склад? Из попы на месте головы? Вы думаете в результате левого соединения по номенклатуре вам дадут еще и склады несуществующие в выборке? Нет, не дадут, это не так работает. В данном случае очень проблематично получить Null, почти невозможно.

А теперь отвечаю на вопрос. Из русского языка. Недостающий склад не обернут в кавычки, значит это не константа, а именно название склада, на котором нет товара.
21. spacecraft 29.10.21 19:13 Сейчас в теме
(19)
откуда в вашем запросе вообще возьмется пустой склад? Из попы на месте головы? Вы думаете в результате левого соединения по номенклатуре вам дадут еще и склады несуществующие в выборке? Нет, не дадут, это не так работает. В данном случае очень проблематично получить Null, почти невозможно.

Ей. Полегче. Если не знаете как работает левое соединение, то не обязательно об этом говорить, да еще в таком тоне.
И мой код основывался на получение складов по несуществующей записи номенклатуры в остатках.
22. gybson 29.10.21 19:22 Сейчас в теме
(21)Ваш запрос легко проверяется в консоли на любой рабочей УТ. Вы в первом подзапросе получили остатки с отбором по конкретной номенклатуре, во втором запросе выбираете из справочника номенклатуры и по номенклатуре соединяете. Откуда там возьмется неизвестная номенклатура? Вы имели в виду несуществующей записи склада в остатках. Ну так и соединяйте со складами. И не стоит делать такую виртуальную таблицу, если в запросенет группировки данных или выбора данных для условия других запросов, это таблица-паразит.
23. spacecraft 29.10.21 19:27 Сейчас в теме
(22) еще раз. Я делал на отсутствие номенклатуры в остатках. Не нужно пытаться свое виденье накладывать на мой код.
Я не склады отслеживал.
То что в итоге нужно другое, это другой вопрос. По постановке задачи это не было понятно.
24. gybson 29.10.21 19:37 Сейчас в теме
(23)Т.е. Вы реально вот так поняли задачу. Вывести номенклатуру с остатком ноль и надписью "Недостающий склад". Ок. Но тогда надо было проверку на isnull, что нет вхождения в таблицу остатков, и написать 0 как ВНаличии. Зачем усложнили?
25. spacecraft 29.10.21 19:43 Сейчас в теме
(24) вот. Теперь по делу.
Соединять виртуальную таблицу остатки с физической не рекомендуется. Не будут работать индексы.
Далее, делать полное соединение это ... ну очень плохо. Особенно для базы на Postgree.
Ну и предполагал, что выборка будет не по одной номенклатуре, а по списку (в коде можно заметить).
2. zelenii 29.10.21 17:54 Сейчас в теме
По логике 1с в виртуальную таблицу остатков попадают только записи с не нулевыми ресурсами.
Swetlana; +1 Ответить
3. SGordon1 29.10.21 17:55 Сейчас в теме
То есть слева хотите получить Все склады И всю номенклатуру ( по этим всем складам)?
5. Menmo 10 29.10.21 18:20 Сейчас в теме
(3) Да, т.е. по всем складам и по всей номенклатуре получить остаток, если нет этого остатка, то 0
4. starjevschik 29.10.21 17:57 Сейчас в теме
тут нужно использовать логику. Есть такая наука...
РегистрНакопления.СвободныеОстатки.Остатки - не может показать того, чего на остатках нет. Логично же?
Значит, информацию надо брать не оттуда. Логично?
А откуда? Если нам нужны все товары и все склады, то надо брать информацию из таблиц товаров и складов. А остатки уже к ним привязывать.
Какой вывод?
Выбрать блабла
Из Справочник.Номенклатура
Левое соединение РегистрНакопления.СвободныеОстатки.Остатки
по блабла
7. Menmo 10 29.10.21 18:21 Сейчас в теме
(4) Это я понял и это даже получилось, но когда пытаюсь сделать то же самое для складов - выдаёт ошибку.
8. Fox-trot 164 29.10.21 18:24 Сейчас в теме
15. gybson 29.10.21 18:58 Сейчас в теме
ВЫБРАТЬ
	Склады.Ссылка КАК Ссылка,
	ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, "Остаток равен 0") КАК ВНаличииОстаток
ИЗ
	РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура = &Номенклатура) КАК СвободныеОстаткиОстатки
		ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
		ПО (СвободныеОстаткиОстатки.Склад = Склады.Ссылка)
Показать
27. Menmo 10 29.10.21 22:25 Сейчас в теме
(15) Ничего не понимаю, если указывать конкретную номенклатуру, то всё работает.
Если указать Родителя, то нулевых остатков нет.
ВЫБРАТЬ
	  |	Склады.Ссылка КАК Ссылка,
	  |	ЕСТЬNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) КАК ВНаличииОстаток,
	  |	ЕСТЬNULL(СвободныеОстаткиОстатки.Номенклатура, 0) КАК Номенклатура
	  |ИЗ
	  |	РегистрНакопления.СвободныеОстатки.Остатки(, Номенклатура.Родитель = &Номенклатура) КАК СвободныеОстаткиОстатки
	  |		ПОЛНОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
	  |		ПО СвободныеОстаткиОстатки.Склад = Склады.Ссылка
	  |ГДЕ
	  |	НЕ Склады.Ссылка = &Ссылка
	  |	И Склады.ЭтоГруппа = &ЭтоГруппа
	  |	И Склады.Родитель = &Родитель
Показать
28. gybson 30.10.21 09:28 Сейчас в теме
(27)
Лучше вот так

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

Если надо убрать группы, то сразу в запросе и пишите "Склады.ЭтоГруппа = Ложь". Если нужны склады в определенной папке, то лучше написать "Склады.Ссылка В ИЕРАРХИИ (&ГруппаСкладов)"
29. Menmo 10 31.10.21 00:25 Сейчас в теме
(28)
(28)
Склады.Ссылка В ИЕРАРХИИ (&ГруппаСкладов)

Если сделать так, то он выводит вообще все склады.
Я одного не понимаю, почему если вместо номенклатуры задать родителя нулевые остатки пропадают?
Ах, да, если выполнить этот запрос, то нулевых остатков так и нет..
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот