Запрос на отбор количества товара из регистра

1. Nikita Kuri (user853074) 14.11.17 15:48 Сейчас в теме
Добрый день, есть документ "Реализация товара", и есть регистр в котором есть Товар и Степень брака. Нужно сделать так что бы при проведений документа происходила проверка на остатки. Сделал запрос, который отбирает "товары", как мне сюда сделать ещё отбор по 1 измерению (Степени брака), что бы учитывалось какая степень брака? Можно ли вообще так сделать?

Запрос.Текст = "ВЫБРАТЬ
	               |	ОстаткиТовараОстатки.Товар КАК Товар,
	               |	ОстаткиТовараОстатки.КоличествоОстаток КАК Нехватка,
	               |	Док.НомерСтроки КАК НомерСтроки,
	               |	ОстаткиТовараОстатки.СтепениБрака КАК СтепениБрака
	               |ИЗ
	               |	РегистрНакопления.ОстаткиТовара.Остатки(
	               |			&Момент,
	               |			Товар В
	               |				(ВЫБРАТЬ РАЗЛИЧНЫЕ
	               |					РеализацияТоваровТорговля.Товар КАК Товар
	               |				ИЗ
	               |					Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
	               |				ГДЕ
	               |					РеализацияТоваровТорговля.Ссылка = &Ссылка)) КАК ОстаткиТовараОстатки
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	               |			РеализацияТоваровТорговля.Товар КАК Товар,
	               |			МАКСИМУМ(РеализацияТоваровТорговля.НомерСтроки) КАК НомерСтроки
	               |		ИЗ
	               |			Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля
	               |		ГДЕ
	               |			РеализацияТоваровТорговля.Ссылка = &Ссылка
	               |		
	               |		СГРУППИРОВАТЬ ПО
	               |			РеализацияТоваровТорговля.Товар) КАК Док
	               |		ПО ОстаткиТовараОстатки.Товар = Док.Товар
	               |ГДЕ
	               |	ОстаткиТовараОстатки.КоличествоОстаток < 0";
	
	Запрос.УстановитьПараметр("Ссылка",Ссылка);
	Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
	Запрос.УстановитьПараметр("Момент", Граница);
Показать
Ответы
2. Mихаил K (mifka186) 1 14.11.17 15:53 Сейчас в теме
Добавить еще одну таблицу в запрос (товар с отбором по браку) и присоединить её к основному набору данных
3. Nikita Kuri (user853074) 14.11.17 16:04 Сейчас в теме
(2)

Добавить еще одну таблицу в запрос (товар с отбором по браку) и присоединить её к основному набору д


Правильно я вас понял?

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


Я не совсем понимаю, какой параметр нужно передать в "Степень Брака", если он может у нас быть разные. Для товара я просто передаю Ссылку на данный документ.
4. Plague Fox (A1ice1990) 58 14.11.17 16:40 Сейчас в теме
Что не так то?
РегистрНакопления.ОстаткиТовара.Остатки( &Дата, Срез1 = &Параметр1 И Срез2 = &Параметр2)


Вы конструктором запрос собираете?
А то прям голова с его оформления разболелась.

КоличествоОстаток - тоже лучше не в "ГДЕ", а непосредственно при получении остатков отсеивать.

Попробуйте как то так:
ВЫБРАТЬ
    Остатки.Товар,
    Остатки.КоличествоОстаток	Нехватка,
    Док.НомерСтроки				НомерСтроки,
    Остатки.СтепениБрака		СтепениБрака
ИЗ
    РегистрНакопления.ОстаткиТовара.Остатки(
            &Момент,
            Товар В
                (ВЫБРАТЬ РАЗЛИЧНЫЕ Товар
                ИЗ Документ.РеализацияТоваров.Торговля
                ГДЕ Ссылка = &Ссылка)	КАК Остатки
			И СтепениБрака = &СтепеньБрака
			И КоличествоОстаток < 0)
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
			Товар, 
			МАКСИМУМ(НомерСтроки) НомерСтроки
		ИЗ Документ.РеализацияТоваров.Торговля
		ГДЕ Ссылка = &Ссылка
		СГРУППИРОВАТЬ ПО Товар)	КАК Док
			ПО Остатки.Товар = Док.Товар
Показать
user853074; +1 Ответить
6. Nikita Kuri (user853074) 14.11.17 17:27 Сейчас в теме
(4)
Вы конструктором запрос собираете?


Да с помощью конструктора, я менее месяца изучаю 1С, как было показано в уроке так и собирал) Спасибо сейчас потестирую второй вариант.
8. Plague Fox (A1ice1990) 58 14.11.17 17:31 Сейчас в теме
(6) Тогда не страшно. Через годик, как синтаксис перестанет пугать - уже не будете конструктор использовать)
Успехов)
5. Plague Fox (A1ice1990) 58 14.11.17 17:08 Сейчас в теме
(1) (4)
Также обратите внимание, вы 2 (а со степенями брака, мб и 3) раза отбираете табличную часть документа.

Возможно более изящным способом будет следующий способ (только проверьте, писал на коленке):
ВЫБРАТЬ Максимум(НомерСтроки) НомерСтроки, Товар
ПОМЕСТИТЬ ВТ
ИЗ Документ.РеализацияТоваров.Торговля
ГДЕ Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО Товар
;
ВЫБРАТЬ
	Док.*, 
	Остатки.КоличествоОстаток	Нехватка,
	Остатки.СтепениБрака		СтепениБрака
ИЗ
	ВТ Док
	ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТовара.Остатки(
	&Момент, СтепениБрака = &СтепеньБрака И КоличествоОстаток < 0) Остатки
		ПО Док.Товар = Остатки.Товар
Показать
7. Nikita Kuri (user853074) 14.11.17 17:31 Сейчас в теме
Я не пойму, у нас в запросе степень брака может быть разной, какой параметр мы должны туда передать? Или мы можем передать ссылку на справочник где хранятся все показатели брака и оно распределит?
9. Plague Fox (A1ice1990) 58 14.11.17 17:33 Сейчас в теме
(7) Если вам надо все степени брака - то и отбирать ничего не надо, зачем?
Если надо такието и такието, то параметром можете передать СписокЗначений содержащий ссылки на необходимые.

Скачайте обработку "КонсольЗапросов" если еще не скачали, она поможет вам в этом деле :3

Также для обучения рекомендую видео уроки Павла Чистова, у него вроде ютуб канал есть.

если он может у нас быть разные.

Я правильно понял вашу проблему, что в этом реквизите у вас несколько разных справочников может быть, а вам надо получить только с одним из этих справочников?
10. Nikita Kuri (user853074) 14.11.17 17:42 Сейчас в теме
(9)
ли вам надо все степени брака - то и отбирать ничего не надо, зачем?


Ну у меня есть "&СтепеньБрака", я так понимаю то наш параметр, который мы обязательно должны задать. Как нам задать что мы берем все?
11. Plague Fox (A1ice1990) 58 14.11.17 17:45 Сейчас в теме
(10) Так вам он вообще тогда не нужен.
Я этот параметр туда добавил потому, что:
как мне сюда сделать ещё отбор по 1 измерению (Степени брака)


Если всеже не нужен - то сотрите конечно)))
12. Максим Зудин (kasper076) 18 14.11.17 17:47 Сейчас в теме
ВЫБРАТЬ
	РеализацияТоваровТорговля.Товар КАК Товар,
	РеализацияТоваровТорговля.Количество КАК Количество
ПОМЕСТИТЬ Торговля
ИЗ
	Документ.РеализацияТоваров.Торговля КАК РеализацияТоваровТорговля

ИНДЕКСИРОВАТЬ ПО
	Товар
;

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

ИНДЕКСИРОВАТЬ ПО
	Товар
;

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

УПОРЯДОЧИТЬ ПО
	Товар,
	Остатки.СтепеньБрака.Степень
ИТОГИ
	МАКСИМУМ(Количество),
	СУММА(КоличествоОстаток),
	СУММА(СтоимостьОстаток)
ПО
	Товар,
	СтепеньБрака
Показать
bad_wag; user853074; +2 Ответить
13. Plague Fox (A1ice1990) 58 14.11.17 17:57 Сейчас в теме
(12) За что вы так оперативную память ненавидите?)
14. Максим Зудин (kasper076) 18 14.11.17 21:36 Сейчас в теме
15. Максим Зудин (kasper076) 18 15.11.17 10:39 Сейчас в теме
(13) в первом пакете конечно же нужен отбор по ссылке.
|ГДЕ
|РеализацияТоваровТорговля.Ссылка = &Ссылка
16. Plague Fox (A1ice1990) 58 15.11.17 11:09 Сейчас в теме
(15) И вполне можно было обойтись без помещения остатков во временную таблицу)
Это не только дольше выполняться будет, но и будет занимать память до конца жизни процедуры (хотя вроде Выборка = Неопределено может вызвать деструктор и почистить за собой, но в этом на 100% Я не уверен). Жаль, что 1с не догадалась добавить сорт sizeof() - это заметно улучшило бы качество кода.

Также лучше не использовать подзапросы вовсе, ограничиваясь временными таблицами.

Естественно это только придирки и в современных реалиях компухтерной техники ничего страшного не произойдет, не подумайте, что Я большой сторонник байтоебства :3

ЗЫ: постоянно забываю индексировать временные таблицы, за это вот напоминание - большое спасибо.

В целом читателю на заметку: https://its.1c.ru/db/metod8dev#content:5842:hdoc
17. Максим Зудин (kasper076) 18 15.11.17 15:32 Сейчас в теме
(16) оч положительно отношусь к критике. Собственно этой заметкой и руководствовался:
Cоединения с виртуальными таблицами

Рекомендации

Если в запросе используется соединение с виртуальной таблицей языка запросов 1С:Предприятия (например, "РегистрНакопления.Товары.Остатки()") и запрос работает с неудовлетворительной производительностью, то рекомендуется вынести обращение к виртуальной таблице в отдельный запрос с сохранением результатов во временной таблице.


Можно конечно удаление ВТ замутить в конце запроса.

Подзапросов же у мну вроде нет. Или есть?
18. Plague Fox (A1ice1990) 58 15.11.17 16:27 Сейчас в теме
(17)
Можно конечно удаление ВТ замутить в конце запроса.

Создать лишнее, чтоб потом удалить лишнее?)))
Но вообще Я вроде погнал горячку и после выполнения запроса подобные временные таблицы существуют в очень урезаном состоянии, за это прошу прощения)

Подзапросов же у мну вроде нет.

С ходу не соображу, можно ли было отказаться от этого.
И уж темболее не подскажу как на подобное отзывается транслятор в человеческий запрос :3
                Товар В
                (ВЫБРАТЬ
                    Торговля.Товар КАК Товар
                ИЗ
                    Торговля КАК Торговля)) КАК ОстаткиТовараОстатки


Я бы ограничился таким, но думаю, гуру 1с могут меня в чем то поправить:

ВЫБРАТЬ Максимум(НомерСтроки) НомерСтроки, Товар
ПОМЕСТИТЬ ВТ
ИЗ Документ.РеализацияТоваров.Торговля
ГДЕ Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО Товар
ИНДЕКСИРОВАТЬ ПО Товар
;
ВЫБРАТЬ
    Док.*, 
    Остатки.КоличествоОстаток    Нехватка,
    Остатки.СтепениБрака        СтепениБрака
ИЗ
    ВТ Док
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТовара.Остатки(
    &Момент, СтепениБрака = &СтепеньБрака И КоличествоОстаток < 0) Остатки
        ПО Док.Товар = Остатки.Товар
Показать
19. qwert asdfg (bad_wag) 15.11.17 18:31 Сейчас в теме
(18) Я конечно не гуру, но зачем группировка в первом запросе, не проще ли просто ВЫБРАТЬ РАЗЛИЧНЫЕ, а номер строки дальше вроде как не используется
21. Plague Fox (A1ice1990) 58 15.11.17 21:08 Сейчас в теме
(19) Используется у автора, потому так и сделал, по сути его запрос перелопатив.
20. Максим Зудин (kasper076) 18 15.11.17 20:45 Сейчас в теме
(18) почему поместил виртуальную таблицу остатков во временную я объяснил.
Разве временные таблицы создаются не в TempDB?
Если в параметрах виртуальной таблицы установить отбор по значению ресурса, то на выходе будет совсем не то, что ожидается.
Почему ставишь отбор по конкретной степени брака? Ведь нужно списывать в порядке её возрастания (убывания). Один товар может быть с разной степенью брака на остатке.
(19) Из Расходной накладной необходимо количество получить. Так что ВЫБРАТЬ РАЗЛИЧНЫЕ не прокатит.
22. Plague Fox (A1ice1990) 58 15.11.17 21:11 Сейчас в теме
(20)
Ведь нужно списывать в порядке её возрастания (убывания). Один товар может быть с разной степенью брака на остатке.

Этой строчкой ответил на вопрос автора, а как ему надо там отбирать - Я не знаю :3
как мне сюда сделать ещё отбор по 1 измерению (Степени брака)?


Алсо, если Максимум(НомерСтроки) как то в дальнейшем завязан в отборе, то лучше подобные вещи делать через "ИМЕЮЩИЕ". Про него частенько напрасно забывают :3
23. Максим Зудин (kasper076) 18 16.11.17 10:07 Сейчас в теме
(18)
С ходу не соображу, можно ли было отказаться от этого.
И уж темболее не подскажу как на подобное отзывается транслятор в человеческий запрос :3
Товар В
(ВЫБРАТЬ
Торговля.Товар КАК Товар
ИЗ
Торговля КАК Торговля)) КАК ОстаткиТовараОстатки




Вот что говорит на этот счет 1С:
https://its.1c.ru/db/metod8dev/content/5457/hdoc
24. Plague Fox (A1ice1990) 58 16.11.17 10:58 Сейчас в теме
(23) Я про то, что на вскидку не мог припомнить, обязательно ли писать целиком:
Товар В 
(ВЫБРАТЬ 
Торговля.Товар КАК Товар 
ИЗ 
Торговля КАК Торговля)


Или можно былоб ограничиться:
Товар В ВТ // Как из списка значений


Ответ: да, обязательно.
Оставьте свое сообщение