Заказ покупателя и Реализация товаров и услуг в одном запросе

1. NovichoKooX 3 29.11.17 18:41 Сейчас в теме
Всем привет. Что-то я туплю под вечер, может, кто подскажет решение. Имеется УТ 10.3. Необходимо вывести в отчет следующие данные: номенклатура, заказано, зарезервировано, где "заказано" - это количество из тч документа "Заказ покупателя", а "зарезервировано" - количество из документа "Реализация товаров и услуг". При этом должны выполняться следующие условия:
а) в тч РТиУ должен быть указан заказ покупателя (который уйдет в заказано)
б) Дата РТиУ должна быть не позже, чем через 4 дня после заказа покупателя (иначе количество считается равным нулю).

Накорябала такой запрос:

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

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТЗаказы.Месяц КАК Месяц,
	ВТРезервы.Номенклатура КАК Номенклатура,
	ВТЗаказы.КоличествоОборот КАК Заказано,
	ВЫБОР
		КОГДА РАЗНОСТЬДАТ(ВТРезервы.Ссылка.Дата, ВТЗаказы.Регистратор.Дата, ДЕНЬ) > 4
			ТОГДА 0
		ИНАЧЕ ВТРезервы.Количество
	КОНЕЦ КАК Зарезервировано,
	ВТЗаказы.Регистратор
ИЗ
	ВТЗаказы КАК ВТЗаказы
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТРезервы КАК ВТРезервы
		ПО ВТЗаказы.Регистратор = ВТРезервы.ЗаказПокупателя
			И ВТЗаказы.Номенклатура = ВТРезервы.Номенклатура

УПОРЯДОЧИТЬ ПО
	Месяц
ИТОГИ
	СУММА(Заказано),
	СУММА(Зарезервировано)
ПО
	ОБЩИЕ,
	Месяц
АВТОУПОРЯДОЧИВАНИЕ
Показать


(Просьба не обращать внимания на лишние поля типа регистратора или месяца, а также на названия полей)

И все бы ничего, но отрабатывает лишнее суммирование по заказам. Поясню на примере:

Есть заказ покупателя, заказано 4 штуки какой-то номенклатуры.
Есть две реализации. Один раз реализовали 3 штуки, второй раз 1 штуку.

И по результатам выполнения запроса заказ покупателя показывается дважды, соответственно, вместо 4 нужных штук один раз (заказано и зарезервировано) в отчет выходит 2 строки, где по 4 штуки в заказано и 3/1 штуки в зарезервировано.

Прошу вашей помощи, что я делаю не так?
+
По теме из базы знаний
Найденные решения
9. Абушев 135 30.11.17 12:18 Сейчас в теме
(5)Лучше взять не т.ч. документа, а сразу к регистру обратится продажам
В силу понимания задачи думаю вот так

ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, МЕСЯЦ) КАК Месяц,
	ЗаказыПокупателейОбороты.Номенклатура,
	СУММА(ЗаказыПокупателейОбороты.КоличествоОборот) КАК Количество,
	ЗаказыПокупателейОбороты.Регистратор,
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, ДЕНЬ) КАК Период
ПОМЕСТИТЬ ВТЗаказы
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, Регистратор, Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ЗаказыПокупателейОбороты
ГДЕ
	ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.ЗаказПокупателя

СГРУППИРОВАТЬ ПО
	ЗаказыПокупателейОбороты.Номенклатура,
	ЗаказыПокупателейОбороты.Регистратор,
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, ДЕНЬ),
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, МЕСЯЦ)
;

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

СГРУППИРОВАТЬ ПО
	ПродажиОбороты.ЗаказПокупателя,
	ПродажиОбороты.Номенклатура,
	НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ),
	НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, МЕСЯЦ)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТЗаказы.Месяц,
	ВТЗаказы.Период КАК ПериодЗаказа,
	ВТРезервы.Период КАК ПериодРезерва,
	ВТЗаказы.Номенклатура,
	ВТЗаказы.Количество КАК Заказано,
	ЕСТЬNULL(ВТРезервы.Количество, 0) КАК Зарезервировано
ИЗ
	ВТЗаказы КАК ВТЗаказы
		ЛЕВОЕ СОЕДИНЕНИЕ ВТРезервы КАК ВТРезервы
		ПО ВТЗаказы.Номенклатура = ВТРезервы.Номенклатура
			И ВТЗаказы.Регистратор = ВТРезервы.ЗаказПокупателя
			И (РАЗНОСТЬДАТ(ВТЗаказы.Период, ВТРезервы.Период, ДЕНЬ) <= 4)
АВТОУПОРЯДОЧИВАНИЕ
Показать
+
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Абушев 135 29.11.17 19:05 Сейчас в теме
(1) Сгруппируй две таблицы и потом объединяй
ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Регистратор.Дата, МЕСЯЦ) КАК Месяц,
	ЗаказыПокупателейОбороты.Номенклатура,
	СУММА(ЗаказыПокупателейОбороты.КоличествоОборот) КАК КоличествоОборот,
	ЗаказыПокупателейОбороты.Регистратор
ПОМЕСТИТЬ ВТЗаказы
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, Регистратор, ) КАК ЗаказыПокупателейОбороты
ГДЕ
	ЗаказыПокупателейОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
	И ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.ЗаказПокупателя

СГРУППИРОВАТЬ ПО
	ЗаказыПокупателейОбороты.Номенклатура,
	ЗаказыПокупателейОбороты.Регистратор,
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Регистратор.Дата, МЕСЯЦ)
;

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

СГРУППИРОВАТЬ ПО
	РеализацияТоваровУслугТовары.Номенклатура,
	РеализацияТоваровУслугТовары.ЗаказПокупателя,
	РеализацияТоваровУслугТовары.Ссылка
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТЗаказы.Месяц КАК Месяц,
	ВТРезервы.Номенклатура КАК Номенклатура,
	ВТЗаказы.КоличествоОборот КАК Заказано,
	ВЫБОР
		КОГДА РАЗНОСТЬДАТ(ВТРезервы.Ссылка.Дата, ВТЗаказы.Регистратор.Дата, ДЕНЬ) > 4
			ТОГДА 0
		ИНАЧЕ ВТРезервы.Количество
	КОНЕЦ КАК Зарезервировано,
	ВТЗаказы.Регистратор
ИЗ
	ВТЗаказы КАК ВТЗаказы
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТРезервы КАК ВТРезервы
		ПО ВТЗаказы.Регистратор = ВТРезервы.ЗаказПокупателя
			И ВТЗаказы.Номенклатура = ВТРезервы.Номенклатура

УПОРЯДОЧИТЬ ПО
	Месяц
ИТОГИ
	СУММА(Заказано),
	СУММА(Зарезервировано)
ПО
	ОБЩИЕ,
	Месяц
АВТОУПОРЯДОЧИВАНИЕ
Показать
+
4. Mi11er 96 29.11.17 20:02 Сейчас в теме
(2)
ВТЗаказы.КоличествоОборот КАК Заказано, ВЫБОР КОГДА РАЗНОСТЬДАТ(ВТРезервы.Ссылка.Дата, ВТЗаказы.Регистратор.Дата, ДЕНЬ) > 4 ТОГДА 0 ИНАЧЕ ВТРезервы.Количество КОНЕЦ КАК Зарезервировано, ВТЗаказы.Регистратор ИЗ ВТЗаказы КАК ВТЗаказы ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТРезервы КАК ВТРезервы ПО ВТЗаказы.Регистратор = ВТРезервы.ЗаказПокупателя И ВТЗаказы.Номенклатура = ВТРезервы.Номенклатура УПОРЯДОЧИТЬ ПО


А вот в запросе, то что все реализации выбираются (проведенные), разве это нормально ?

Если мы в первой таблице, явно указали ссылку на регистратор, то не проще и во второй ее использовать ?
+
6. NovichoKooX 3 29.11.17 20:12 Сейчас в теме
5. NovichoKooX 3 29.11.17 20:11 Сейчас в теме
(2)
что-то сгруппировалось (общий итог меньше, чем до группировки), но проблемные позиции не схлопнулись.
Прикрепленные файлы:
+
7. гаврюша 2 29.11.17 23:46 Сейчас в теме
(5) Сверни по общим полям и просуммируй нужное поле. Команда "Свернуть" Свернуть(<КолонкиГруппировок>, <КолонкиСуммирования>)
+
8. NovichoKooX 3 30.11.17 07:28 Сейчас в теме
(7) не помогло. Вот получившийся код:
		Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ
	               |	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Регистратор.Дата, МЕСЯЦ) КАК Месяц,
	               |	ЗаказыПокупателейОбороты.Номенклатура,
	               |	ЗаказыПокупателейОбороты.КоличествоОборот КАК КоличествоОборот,
	               |	ЗаказыПокупателейОбороты.Регистратор
	               |ПОМЕСТИТЬ ВТЗаказы
	               |ИЗ
	               |	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, Регистратор, ) КАК ЗаказыПокупателейОбороты
	               |ГДЕ
	               |	ЗаказыПокупателейОбороты.Номенклатура В ИЕРАРХИИ(&Номенклатура)
	               |	И ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.ЗаказПокупателя
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ
	               |	НАЧАЛОПЕРИОДА(РеализацияТоваровУслугТовары.Ссылка.Дата, МЕСЯЦ) КАК Месяц,
	               |	РеализацияТоваровУслугТовары.Номенклатура,
	               |	РеализацияТоваровУслугТовары.Количество КАК Количество,
	               |	РеализацияТоваровУслугТовары.Ссылка,
	               |	РеализацияТоваровУслугТовары.ЗаказПокупателя
	               |ПОМЕСТИТЬ ВТРезервы
	               |ИЗ
	               |	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
	               |ГДЕ
	               |	РеализацияТоваровУслугТовары.Ссылка.Проведен = &Проведен
	               |;
	               |
	               |////////////////////////////////////////////////////////////­////////////////////
	               |ВЫБРАТЬ
	               |	ВТЗаказы.Месяц КАК Месяц,
	               |	ВТРезервы.Номенклатура КАК Номенклатура,
	               |	ВТЗаказы.КоличествоОборот КАК Заказано,
	               |	ВЫБОР
	               |		КОГДА РАЗНОСТЬДАТ(ВТРезервы.Ссылка.Дата, ВТЗаказы.Регистратор.Дата, ДЕНЬ) > 4
	               |			ТОГДА 0
	               |		ИНАЧЕ ВТРезервы.Количество
	               |	КОНЕЦ КАК Зарезервировано
	               |ИЗ
	               |	ВТЗаказы КАК ВТЗаказы
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТРезервы КАК ВТРезервы
	               |		ПО ВТЗаказы.Регистратор = ВТРезервы.ЗаказПокупателя
	               |			И ВТЗаказы.Номенклатура = ВТРезервы.Номенклатура
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Месяц
	               |ИТОГИ
	               |	СУММА(Заказано),
	               |	СУММА(Зарезервировано)
	               |ПО
	               |	ОБЩИЕ,
	               |	Месяц
	               |АВТОУПОРЯДОЧИВАНИЕ";

	
	
	Запрос.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
	Запрос.УстановитьПараметр("НачПериода", НачПериода);
	Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
	Запрос.УстановитьПараметр("Проведен", Истина);
	Результат = Запрос.Выполнить().Выгрузить();
	ТЗ = Результат.Скопировать(,"Месяц,Заказано,Зарезервировано");
	
	ТЗ.Свернуть("Месяц","Заказано,Зарезервировано");
	
	Для Каждого СтрокаТЗ из ТЗ Цикл
		
		Сообщить(СтрокаТЗ.Месяц+" "+СтрокаТЗ.Заказано);
	КонецЦикла;
Показать

А вот 2 сообщения:

1 136
01.07.2017 0:00:00 2 272

Причем, по результатам универсального отчета по регистру "Заказы покупателей" заказано за июль 978 шт.
+
9. Абушев 135 30.11.17 12:18 Сейчас в теме
(5)Лучше взять не т.ч. документа, а сразу к регистру обратится продажам
В силу понимания задачи думаю вот так

ВЫБРАТЬ
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, МЕСЯЦ) КАК Месяц,
	ЗаказыПокупателейОбороты.Номенклатура,
	СУММА(ЗаказыПокупателейОбороты.КоличествоОборот) КАК Количество,
	ЗаказыПокупателейОбороты.Регистратор,
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, ДЕНЬ) КАК Период
ПОМЕСТИТЬ ВТЗаказы
ИЗ
	РегистрНакопления.ЗаказыПокупателей.Обороты(&НачПериода, &КонПериода, Регистратор, Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ЗаказыПокупателейОбороты
ГДЕ
	ЗаказыПокупателейОбороты.Регистратор ССЫЛКА Документ.ЗаказПокупателя

СГРУППИРОВАТЬ ПО
	ЗаказыПокупателейОбороты.Номенклатура,
	ЗаказыПокупателейОбороты.Регистратор,
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, ДЕНЬ),
	НАЧАЛОПЕРИОДА(ЗаказыПокупателейОбороты.Период, МЕСЯЦ)
;

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

СГРУППИРОВАТЬ ПО
	ПродажиОбороты.ЗаказПокупателя,
	ПродажиОбороты.Номенклатура,
	НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ),
	НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, МЕСЯЦ)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ВТЗаказы.Месяц,
	ВТЗаказы.Период КАК ПериодЗаказа,
	ВТРезервы.Период КАК ПериодРезерва,
	ВТЗаказы.Номенклатура,
	ВТЗаказы.Количество КАК Заказано,
	ЕСТЬNULL(ВТРезервы.Количество, 0) КАК Зарезервировано
ИЗ
	ВТЗаказы КАК ВТЗаказы
		ЛЕВОЕ СОЕДИНЕНИЕ ВТРезервы КАК ВТРезервы
		ПО ВТЗаказы.Номенклатура = ВТРезервы.Номенклатура
			И ВТЗаказы.Регистратор = ВТРезервы.ЗаказПокупателя
			И (РАЗНОСТЬДАТ(ВТЗаказы.Период, ВТРезервы.Период, ДЕНЬ) <= 4)
АВТОУПОРЯДОЧИВАНИЕ
Показать
+
10. NovichoKooX 3 30.11.17 14:45 Сейчас в теме
(9) спасибо, чуть позже попробуем.
+
11. NovichoKooX 3 01.12.17 07:21 Сейчас в теме
(9) огромное спасибо, все получилось!!!
+
3. пользователь 29.11.17 19:29
Сообщение было скрыто модератором.
...
Внимание! Тема сдана в архив

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