Помогите с запросом

1. Flipp 11.07.19 09:25 Сейчас в теме
УНФ 1,6. Необходимо удалить из заказ все позиции по которым нет остатков на складе

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

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

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

Выводит даже строки, по которым остатки больше нуля. Подскажите, где ошибка в запросе!?
По теме из базы знаний
Найденные решения
6. mark_oilbass 11.07.19 09:41 Сейчас в теме
Вот так попробуй. Не проверял, но думаю должно работать.

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

УПОРЯДОЧИТЬ ПО
	НомерСтроки УБЫВ
Показать
20. catena 110 11.07.19 10:10 Сейчас в теме
(15)Никто не говорил, что левое не правильно. Вы его просто не умеете готовить.

Правильный запрос в (6), только соединение ЛЕВОЕ.
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. catena 110 11.07.19 09:28 Сейчас в теме
(1)
ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) <= 0
Тут не может быть NULL
mark_oilbass; +1 Ответить
4. mark_oilbass 11.07.19 09:29 Сейчас в теме
(1)Тут можно обойтись и без временной таблицы.
5. spacecraft 11.07.19 09:36 Сейчас в теме
(1) используйте ВНУТРЕННЕЕ СОЕДИНЕНИЕ
7. Flipp 11.07.19 09:44 Сейчас в теме
(5)Так в запросе вообще пусто.
11. spacecraft 11.07.19 09:51 Сейчас в теме
(7) правильно, если на остатках количество 0, тогда в виртуальной таблице Остатки номенклатуры вообще нет. Это намек на алгоритм поиска.
17. spacecraft 11.07.19 10:07 Сейчас в теме
(7) вот что-то в этом роде:
ВЫБРАТЬ 
ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура, 
ЗаказПокупателяЗапасы.Характеристика КАК Характеристика, 
Остатки.КоличествоОстаток КАК КоличествоОстаток, 
ЗаказПокупателяЗапасы.НомерСтроки КАК НомерСтроки 
ИЗ 
Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы 
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗапасыНаСкладах.Остатки(&Дата, СтруктурнаяЕдиница = &Склад) КАК ЗапасыНаСкладахОстатки КАК Остатки 
ПО ЗаказПокупателяЗапасы.Ссылка.Организация = Остатки.Организация 
И ЗаказПокупателяЗапасы.Номенклатура = Остатки.Номенклатура 
И ЗаказПокупателяЗапасы.Характеристика = Остатки.Характеристика

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

УПОРЯДОЧИТЬ ПО 
НомерСтроки УБЫВ 
Показать
24. spacecraft 11.07.19 10:31 Сейчас в теме
(1) в дополнении к (17): так как не рекомендуется делать соединение реальной таблицы с виртуальной, то вот еще вариант:
ВЫБРАТЬ
	ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
	ЗаказКлиентаТовары.Характеристика КАК Характеристика
ПОМЕСТИТЬ вт_номенклатура
ИЗ
	Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
ГДЕ
	ЗаказКлиентаТовары.Ссылка = &Ссылка
;

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

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

Свои таблицы и поля подставите сами.
30. mark_oilbass 11.07.19 11:03 Сейчас в теме
(24)вложенные запросы в условии вроде как не рекомендуют использовать.
35. spacecraft 11.07.19 11:20 Сейчас в теме
(30) этот вариант один из самых правильных. Условие отбора накладываются на виртуальную таблицу с выборкой из временной. Можно еще добавить индексацию для временной таблицы.
Иначе виртуальная таблица будет выбирать все остатки.

И не надо игнорировать вложенные запросы совсем. Просто нужно понимать их особенность. При сложном вложенном запросе оптимизатор запроса не всегда может определить получаемое количество выборки и соответственно может построить неоптимальный план запроса. Ну, и индексации во вложенном запросе не будет. В данном случае все будет прозрачно для оптимизатора.
2. catena 110 11.07.19 09:27 Сейчас в теме
Левое соединение - оно такое. Выводит все, что есть в правой таблице.
mark_oilbass; +1 Ответить
6. mark_oilbass 11.07.19 09:41 Сейчас в теме
Вот так попробуй. Не проверял, но думаю должно работать.

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

УПОРЯДОЧИТЬ ПО
	НомерСтроки УБЫВ
Показать
9. Flipp 11.07.19 09:44 Сейчас в теме
В запросе тогда пусто в консоли. Нет ни одной строки вообще.
10. VictorRGB2 13 11.07.19 09:50 Сейчас в теме
(9) в (3) ответили же в чем проблема
ГДЕ 
ЕСТЬNULL(ЗапасыНаСкладахОстатки.КоличествоОстаток, 0) <= 0 

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

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

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


Все равно строк 5, ничего вообще не изменилось
19. YannikAlx 43 11.07.19 10:09 Сейчас в теме
(10) В этом не может быть принципиальной ошибки и тем более проблемы!

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


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

А то что ЗапасыНаСкладахОстатки.КоличествоОстаток никогда не будет NULL (и это так ) в этом месте совершенно никак не повлияет на результат.....
8. Flipp 11.07.19 09:44 Сейчас в теме
Без условия <=0 проверяю в консоли. 1поз остатки 15 штук, еще 3 позиции понулям, 1 в минус. Левое соед. Выводятся все пять, в строке количество остаток в 1поз 15 в остальных пусто. Ставлю условие, выводятся опять все ПЯТЬ колонок, но везде в количествоОстаток пусто. Как сделать, чтоб выводилось 4 колонки, только там где нет остатков!?
13. Flipp 11.07.19 09:56 Сейчас в теме
Все равно строк 5, а надо чтоб было 4ре, только те, по которым нет остатков. Чтоб потом их собственно удалить, как то так
Запрос.УстановитьПараметр("Ссылка", Объект.Ссылка);
	Запрос.УстановитьПараметр("Склад", Объект.СтруктурнаяЕдиницаРезерв);

	
	Выборка = Запрос.Выполнить().Выбрать();
	
	
	Пока Выборка.Следующий() Цикл
		Объект.Запасы.Удалить(Выборка.НомерСтроки-1); 
	КонецЦикла;
	//Объект.Записать();
Показать
14. VictorRGB2 13 11.07.19 10:00 Сейчас в теме
(13) так вы же полное соединение с табл. частью заказа сделали, что вы хотите то?
вам нужно левое и еще доп условие по номенклатуре временной таблицы
15. Flipp 11.07.19 10:01 Сейчас в теме
(14)Левое было изначально,сказали не правильно. Какое доп условие?
16. VictorRGB2 13 11.07.19 10:04 Сейчас в теме
(15) а вообще я бы сделал не так совсем
у вас по условию требуется что - вытащить из заказа строки с остатками <=0
значит или таблица остатков главная должна быть или выборку по заказу тоже во временную таблицу помещать и уже для результата запрос по двум временным таблицам, но опять же по остаткам главная
18. Flipp 11.07.19 10:08 Сейчас в теме
(16)Странный совет. Получился полный бред.что и предполагалось, при "главной", таблице остатков

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Заказ.Номенклатура КАК Номенклатура,
	Заказ.Характеристика КАК Характеристика,
	Заказ.НомерСтроки КАК НомерСтроки,
	Остатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
	Остатки КАК Остатки
		ЛЕВОЕ СОЕДИНЕНИЕ Заказ КАК Заказ
		ПО Остатки.Номенклатура = Заказ.Номенклатура
			И Остатки.Характеристика = Заказ.Характеристика
			И Остатки.Организация = Заказ.Организация
Показать
20. catena 110 11.07.19 10:10 Сейчас в теме
(15)Никто не говорил, что левое не правильно. Вы его просто не умеете готовить.

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

работайте с консолью, так вы быстрее поймете суть запросов....
И вернитесь к своему Первому варианту - он правильный!
22. catena 110 11.07.19 10:19 Сейчас в теме
(21)Первый вариант не правильный, потому что виртуальная таблица в принципе не вернет положительных остатков и потом как не соединяй, для товаров с положительным остатком и для товаров с нулевым остатком всегда будет один результат - NULL.
23. YannikAlx 43 11.07.19 10:25 Сейчас в теме
(22) Во первых первый вариант не содержит ни одной принципиальной ошибки!

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

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

И в четвертых, да можно обойтись без временной таблицы , но она не является принципиальной ошибкой.
Если скажем я захочу увидеть как промежуточный результат все неположительные остатки на складе....
25. catena 110 11.07.19 10:34 Сейчас в теме
(23)
Во вторых изучите основы 1С
Смешно :)

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

Автору нужно
Необходимо удалить из заказ все позиции по которым нет остатков на складе

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

А вы что ищете? Положительные остатки?
27. catena 110 11.07.19 10:47 Сейчас в теме
(26)Картинка.
Прикрепленные файлы:
28. YannikAlx 43 11.07.19 10:54 Сейчас в теме
Вы меня не услышали ...
И почему у вас в нижней таблице вместо NULL Пустота???

Вот и нужно из нижней таблицы удалить Груши и Яблоки.
То есть удалить там где -35 и там где NULL
29. catena 110 11.07.19 10:59 Сейчас в теме
(28)Тыква-то должна остаться. А на ней тоже NULL. Потому что отбор был по условию <=0 и она со своим положительным остатком не попала.

(28)
И почему у вас в нижней таблице вместо NULL Пустота?
Консоль такая. Так будет виднее:
Прикрепленные файлы:
31. YannikAlx 43 11.07.19 11:04 Сейчас в теме
(29) Тыква должна остаться по условию задачи не в запросе, а в Заказе после программного удаления тех что в запросе имеют Минус или NULL
32. catena 110 11.07.19 11:06 Сейчас в теме
(31)Ну вы же видите на картинке, что у тыквы и яблока одинаковые значения? Совсем одинаковые. NULL.
Потому что ни тыквы, ни груши нет в таблице остатки.
YannikAlx; +1 Ответить
33. YannikAlx 43 11.07.19 11:16 Сейчас в теме
(32) Спасибо огромное за вашу настойчивость!
И простите мне мою глупость....
Вы правы!
До меня доходило как до жирафа очень долго... )))))

Конечно же условие на <= 0 Ставить во 2 части запроса и тогда все бы работало...
34. catena 110 11.07.19 11:18 Сейчас в теме
(33)Да, местоположение условия решает :)
36. Wandler 18 11.07.19 17:50 Сейчас в теме
По-моему такой вариант более простой и правильный

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

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

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

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

УПОРЯДОЧИТЬ ПО
    НомерСтроки УБЫВ
Показать
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

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

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

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

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