1. user853074 14.11.17 15:48 Сейчас в теме

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

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

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

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


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

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


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


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

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

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


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

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

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

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

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

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


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


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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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


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

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

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


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




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


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


Ответ: да, обязательно.
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

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

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

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

Системный аналитик
Новосибирск
зарплата от 80 000 руб. до 100 000 руб.
Полный день

Программист 1С
Салехард
зарплата от 80 000 руб. до 200 000 руб.
Полный день