Хитрющий запрос

1. triviumfan 93 17.03.21 17:44 Сейчас в теме
Доброго дня, коллеги.

Имеется УТ11.3, но подсистема планирования продаж не устроила, сказали создать свою.
Основные виды плана: по количеству штук, количеству SKU, количеству партнеров, по выручке, по весу. Но к ним возможны отборы по номенклатуре и партнёрам.
Например: план по продаже 10 различных SKU из группы/сегмента, да ещё и определенным партнерам, или 100 кг чего-либо.

Для этого был создан новый документ "План продаж" С ТЧ "СоставПлана" (поля "ТипПлана", "КлючСвязи" и "Значение"), ТЧ "ОтборНоменклатура" (поля "КлючСвязи" и "Номенклатура"), ТЧ "ОтборПартнер" (поля "КлючСвязи" и "Партнер").
Таким образом для каждого типа плана можно указать отбор по номенклатуре или клиентам.
Движения пишутся в одноименные регистры, я подумал, что лучше бы эти отборы разделить по таблицам (по uid'у поля "КлючСвязи").

Так вот теперь не пойму как бы мне на основании этих данных отчет построить по план-факт показателям...
Группировки отчета: менеджер, партнер, номенклатура, заказ-клиента
Ресурсы: план, факт

Я уже собрал запрос по план/факт показателям динамически, но лишь менеджеру и периоду. Не хотелось бы всю эту жуть перенести в ПриКомпоновкеОтчета() (да ещё в цикле по всем менеджерам, по которым план установлен).

&НаСервере
Процедура Тест()
	
	Запрос = Новый Запрос();
	Запрос.Текст = ПолучитьТекстЗапросаПлановПродаж();
	Запрос.УстановитьПараметр("ПериодПланирования", ПериодПланирования);	
	Запрос.УстановитьПараметр("Менеджер", 			Менеджер);
	МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
	Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	Запрос.Выполнить();
	
	Выборка = МенеджерВременныхТаблиц.Таблицы.Найти("ПланПродажПоМенеджеруДетальная").ПолучитьДанные().Выбрать();
	
	ШаблонТекстаЗапроса = ПолучитьШаблонТекстаЗапроса();
	МассивЗапросов = Новый Массив;
	ПолныйЗапросПланов = Новый Запрос();
	ТребуетсяПоместитьВоВременнуюТаблицу = Истина;
	
	Пока Выборка.Следующий() Цикл
		
		НовыйЗапросПлана = ШаблонТекстаЗапроса;
		ЗаполнитьОтборы(НовыйЗапросПлана, Выборка, ПолныйЗапросПланов);
		
		Если ТребуетсяПоместитьВоВременнуюТаблицу Тогда
			НовыйЗапросПлана = СтрЗаменить(НовыйЗапросПлана, "КАК КоличествоSKU", "КАК КоличествоSKU" + Символы.ПС + "ПОМЕСТИТЬ РезультатыПродаж");
			ТребуетсяПоместитьВоВременнуюТаблицу = Ложь;
		КонецЕсли;
		
		МассивЗапросов.Добавить(НовыйЗапросПлана);
		
	КонецЦикла;
	
	ТекстЗапросаПлановПоМенеджеру = СтрСоединить(МассивЗапросов, Символы.ПС + "ОБЪЕДИНИТЬ ВСЕ" + Символы.ПС);
	ПолныйЗапросПланов.Текст = ТекстЗапросаПлановПоМенеджеру;
	ПолныйЗапросПланов.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	ПолныйЗапросПланов.УстановитьПараметр("Менеджер", 			Менеджер);
	ПолныйЗапросПланов.УстановитьПараметр("НачалоПериода", 		ПериодПланирования);
	ПолныйЗапросПланов.УстановитьПараметр("ОкончаниеПериода", 	КонецМесяца(ПериодПланирования));
	Результат = ПолныйЗапросПланов.Выполнить();
	Если Результат.Пустой() Тогда Возврат; КонецЕсли;
	
	ИтоговыйЗапрос = Новый Запрос;
	ИтоговыйЗапрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
	ИтоговыйЗапрос.УстановитьПараметр("ПериодПланирования", ПериодПланирования);	
	ИтоговыйЗапрос.УстановитьПараметр("Менеджер", 			Менеджер);
	ИтоговыйЗапрос.Текст = "ВЫБРАТЬ
	                       |	*
	                       |ИЗ
	                       |	ПланПродажПоМенеджеруДетальная КАК ПланПродажПоМенеджеру
	                       |		ЛЕВОЕ СОЕДИНЕНИЕ РезультатыПродаж КАК РезультатыПродаж
	                       |		ПО ПланПродажПоМенеджеру.КлючСвязи = РезультатыПродаж.КлючСвязи
						   |УПОРЯДОЧИТЬ ПО
						   |	ПланПродажПоМенеджеру.НомерСтроки";
	Результат = ИтоговыйЗапрос.Выполнить();
	Если Результат.Пустой() Тогда Возврат; КонецЕсли;
	
	Жесть = Результат.Выгрузить();
	
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ЗаполнитьОтборы(ТекстЗапроса, Условия, ИтоговыйЗапрос)
		
	ИмяПараметра = "КлючСвязи" + Условия.НомерСтроки;
	ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&КлючСвязи", "&" + ИмяПараметра);		
	
	Если Условия.ЕстьОтборПоНоменклатуре Тогда
		
		ТекстУсловия = СтрШаблон("
		|АналитикаНоменклатуры.Номенклатура В 
		|	(ВЫБРАТЬ 
		|		ОтборПоНоменклатуре.Номенклатура 
		|	ИЗ 
		|		ОтборПоНоменклатуре
		|	ГДЕ
		|		ОтборПоНоменклатуре.КлючСвязи = &%1)", ИмяПараметра);
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоНоменклатуре", ТекстУсловия);		
		
	Иначе
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоНоменклатуре", "ИСТИНА");		
		
	КонецЕсли;
	
	Если Условия.ЕстьОтборПоПартнерам Тогда
		
		ТекстУсловия = СтрШаблон("
		|АналитикаПоПартнерам.Партнер В 
		|	(ВЫБРАТЬ 
		|		ОтборПоПартнерам.Партнер 
		|	ИЗ 
		|		ОтборПоПартнерам
		|	ГДЕ
		|		ОтборПоПартнерам.КлючСвязи = %1)", ИмяПараметра);
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоПартнерам", "ИСТИНА");		
		
	Иначе
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ОтборПоПартнерам", "ИСТИНА");		
		
	КонецЕсли;
	
	ИтоговыйЗапрос.УстановитьПараметр(ИмяПараметра, Условия.КлючСвязи);
	
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ПолучитьШаблонТекстаЗапроса()
	
	Возврат "ВЫБРАТЬ
		| 	&КлючСвязи КАК КлючСвязи,
	        |	СУММА(ВложенныйЗапрос.Количество) КАК КоличествоШт,
	        |	СУММА(ВложенныйЗапрос.Выручка) КАК Выручка,
	        |	СУММА(ВложенныйЗапрос.ВаловаяПрибыль) КАК Прибыль,
	        |	СУММА(ВложенныйЗапрос.Вес) КАК Вес,
	        |	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.Партнер) КАК КоличествоПартнеров,
	        |	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.Номенклатура) КАК КоличествоSKU
	        |ИЗ
	        |	(ВЫБРАТЬ
	        |		АналитикаНоменклатуры.Номенклатура КАК Номенклатура,
	        |		АналитикаПоПартнерам.Партнер КАК Партнер,
	        |		СУММА(ВыручкаИСебестоимость.КоличествоОборот) КАК Количество,
	        |		СУММА(ВыручкаИСебестоимость.СуммаВыручкиОборот) КАК Выручка,
	        |		СУММА(ВыручкаИСебестоимость.СебестоимостьОборот) КАК Себестоимость,
	        |		СУММА(ВЫРАЗИТЬ(ВыручкаИСебестоимость.СуммаВыручкиОборот - ВыручкаИСебестоимость.СуммаДополнительныхРасходовОборот - ВыручкаИСебестоимость.СебестоимостьОборот КАК ЧИСЛО(15, 2))) КАК ВаловаяПрибыль,
	        |		СУММА(ВыручкаИСебестоимость.СуммаДополнительныхРасходовОборот) КАК СуммаДопРасходов,
	        |		СУММА(ВыручкаИСебестоимость.КоличествоОборот * (ВЫРАЗИТЬ(ВЫБОР
	        |					КОГДА АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.Вес)
	        |							И АналитикаНоменклатуры.Номенклатура.ВесИспользовать
	        |							И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Знаменатель, 0) <> 0
	        |						ТОГДА ВЫРАЗИТЬ(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Числитель / АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Знаменатель КАК ЧИСЛО(15, 7))
	        |					КОГДА АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.Упаковка)
	        |							И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ВесЕдиницаИзмерения.Знаменатель, 0) <> 0
	        |						ТОГДА ВЫРАЗИТЬ(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Вес * АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ВесЕдиницаИзмерения.Числитель / АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ВесЕдиницаИзмерения.Знаменатель КАК ЧИСЛО(15, 7))
	        |					КОГДА (АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.КоличествоШтук)
	        |							ИЛИ АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.ПустаяСсылка)
	        |							ИЛИ ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Ссылка, ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка))
	        |							И АналитикаНоменклатуры.Номенклатура.ВесИспользовать
	        |							И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ВесЗнаменатель, 0) <> 0
	        |							И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ВесЕдиницаИзмерения.Знаменатель, 0) <> 0
	        |						ТОГДА ВЫРАЗИТЬ(АналитикаНоменклатуры.Номенклатура.ВесЧислитель / АналитикаНоменклатуры.Номенклатура.ВесЗнаменатель * (АналитикаНоменклатуры.Номенклатура.ВесЕдиницаИзмерения.Числитель / АналитикаНоменклатуры.Номенклатура.ВесЕдиницаИзмерения.Знаменатель) КАК ЧИСЛО(15, 7))
	        |					ИНАЧЕ 0
	        |				КОНЕЦ / (ВЫРАЗИТЬ(1 КАК ЧИСЛО(15, 7))) КАК ЧИСЛО(15, 7)))) КАК Вес
	        |	ИЗ
	        |		РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &ОкончаниеПериода, Авто, Менеджер = &Менеджер) КАК ВыручкаИСебестоимость
	        |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК АналитикаНоменклатуры
	        |			ПО ВыручкаИСебестоимость.АналитикаУчетаНоменклатуры = АналитикаНоменклатуры.КлючАналитики
	        |			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаПоПартнерам
	        |			ПО ВыручкаИСебестоимость.АналитикаУчетаПоПартнерам = АналитикаПоПартнерам.КлючАналитики
	        |	ГДЕ
	        |		АналитикаПоПартнерам.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
	        |		И &ОтборПоНоменклатуре
	        |		И &ОтборПоПартнерам
	        |	
	        |	СГРУППИРОВАТЬ ПО
	        |		АналитикаНоменклатуры.Номенклатура,
	        |		АналитикаПоПартнерам.Партнер) КАК ВложенныйЗапрос";	
	
КонецФункции
// т.е. имеем шаблон, на основании его создаём итоговый по всем показателям, попутно устанавливаем отбор, а в конце соединяем тип плана и данные продаж по uid'у.
Показать


Есть идеи?:) Может хоть хотя бы "вектор движения" подскажет кто.
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. dka80 20 17.03.21 17:50 Сейчас в теме
В СКД сделать несколько источников данных: план, факт. Передать заполненные ТЗ в соответствующие источники и уже в СКД соединять план-факт
8. triviumfan 93 18.03.21 10:05 Сейчас в теме
(2) Это самое простое решение в лоб, хотел сначала попробовать одним запросом или.. как-то оригинально обыграть
3. user633533_encantado 11 17.03.21 18:06 Сейчас в теме
Не понял, а чем сложность есть у вас регистры, соединяйте их как хотите и делайте отборы.
_Alexei_; dnikolaev; +2 Ответить
5. triviumfan 93 17.03.21 22:14 Сейчас в теме
(3) Да ума не хватает.
Логику вроде понимаю...
1. Берём планы с отборами
2. Берём все факт продажи без отборов
3. Далее нужно как-то разделить планы продаж на кучу объединений по типу плана и каждый запрос из объединения нужно соединить с продажами по сложному условию (добавить какой-нибудь признак есть отбор или нету, и по нему накладывать отбор).
Как-то сложновато выходит =\
4. triviumfan 93 17.03.21 19:26 Сейчас в теме
Забыл прикрепить скрин
Прикрепленные файлы:
6. Dimony4 3 17.03.21 22:50 Сейчас в теме
Добрый день.
Где ошибка в моих рассуждениях?

Ваша задача отчет.
Группировки отчета: менеджер, партнер, номенклатура, заказ-клиента
Ресурсы: план, факт

Структура таблиц (скрин) не позволяет получить план по номенклатуре,
так как план ведется только в разрезе типов планов.
7. triviumfan 93 17.03.21 23:24 Сейчас в теме
(6)
Структура таблиц (скрин) не позволяет получить план по номенклатуре,
так как план ведется только в разрезе типов планов.

Не понял, почему не позволяет? Смотрите внимательней - есть две ТЧ с отборами, связь по УИДу "КлючСвязи".
9. FatPanzer 18.03.21 10:11 Сейчас в теме
(7) Исходя из вашей структуры - в ТЧ "Состав плана" все ключи должны быть уникальны (с общей суммой продаж). Соответственно, для этого плана может быть несколько номенклатур (с этим же ключом), и несколько партнеров (с этим же ключом). А вот как вы собрались распределять какому партнеру какой и сколько номенклатуры запланировать к продаже - этого у вас нет. И никакими запросами вы это не исправите.

Вам архитектуру менять надо.
12. triviumfan 93 18.03.21 14:41 Сейчас в теме
(9)
А вот как вы собрались распределять какому партнеру какой и сколько номенклатуры запланировать к продаже - этого у вас нет. И никакими запросами вы это не исправите

Этого не требуется. Нужно N номенклатур продать M партнерам, а не конкретную позицию конкретному партнеру. Да даже если потребуется последнее, то достаточно добавить новую строку в состав плана, она будет иметь новый UID и свои отборы.
10. starik-2005 3040 18.03.21 10:36 Сейчас в теме
1. Собираете план по нужным измерениям за нужный период.
2. Собираете факт по тем же измерениям..
3. Соединяете (полное соединение) по измерениям.
4. Профит!
13. triviumfan 93 18.03.21 15:41 Сейчас в теме
(10) А как факт то получить?) Все также динамически/кодом собирать? У меня N объединений ВыручкаИСебестоимость на каждый план, плюс установка отборов.
11. KVIKS 402 18.03.21 12:19 Сейчас в теме
я бы предложил такой вариант:
1 таблица план
менеджер, партнер, номенклатура, количество план, 0
Собирается из документа план продаж
Иванов, ООО РОмашка, Яблоки 10 0
Петров, ООО лютик, Яблоки 20 0



2 таблица факт
менеджер, партнер, номенклатура, 0 количество факт
Собирается по регистрам продаж или по документам
Иванов, ООО РОмашка, Яблоки 0 5

Объединяем 2 таблицы
Иванов, ООО РОмашка, Яблоки 10 0
Петров, ООО лютик, Яблоки 20 0
Иванов, ООО РОмашка, Яблоки 0 5

и группируем по менеджер, партнер, номенклатура
Иванов, ООО РОмашка, Яблоки 10 5
Петров, ООО лютик, Яблоки 20 0

Все это можно сделать 1 запросом
14. triviumfan 93 18.03.21 16:28 Сейчас в теме
Хочу попробовать одним запросом сначала.
Пока наваял такое:
ВЫБРАТЬ
	АналитикаНоменклатуры.Номенклатура КАК Номенклатура,
	АналитикаПоПартнерам.Партнер КАК Партнер,
	Продажи.КоличествоОборот КАК Количество,
	Продажи.СуммаВыручкиОборот КАК Выручка,
	Продажи.КоличествоОборот * (ВЫРАЗИТЬ(ВЫБОР
			КОГДА АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.Вес)
					И АналитикаНоменклатуры.Номенклатура.ВесИспользовать
					И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Знаменатель, 0) <> 0
				ТОГДА ВЫРАЗИТЬ(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Числитель / АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Знаменатель КАК ЧИСЛО(15, 7))
			КОГДА АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.Упаковка)
					И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ВесЕдиницаИзмерения.Знаменатель, 0) <> 0
				ТОГДА ВЫРАЗИТЬ(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Вес * АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ВесЕдиницаИзмерения.Числитель / АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ВесЕдиницаИзмерения.Знаменатель КАК ЧИСЛО(15, 7))
			КОГДА (АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.КоличествоШтук)
					ИЛИ АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.ТипИзмеряемойВеличины = ЗНАЧЕНИЕ(Перечисление.ТипыИзмеряемыхВеличин.ПустаяСсылка)
					ИЛИ ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ЕдиницаИзмерения.Ссылка, ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка))
					И АналитикаНоменклатуры.Номенклатура.ВесИспользовать
					И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ВесЗнаменатель, 0) <> 0
					И ЕСТЬNULL(АналитикаНоменклатуры.Номенклатура.ВесЕдиницаИзмерения.Знаменатель, 0) <> 0
				ТОГДА ВЫРАЗИТЬ(АналитикаНоменклатуры.Номенклатура.ВесЧислитель / АналитикаНоменклатуры.Номенклатура.ВесЗнаменатель * (АналитикаНоменклатуры.Номенклатура.ВесЕдиницаИзмерения.Числитель / АналитикаНоменклатуры.Номенклатура.ВесЕдиницаИзмерения.Знаменатель) КАК ЧИСЛО(15, 7))
			ИНАЧЕ 0
		КОНЕЦ / (ВЫРАЗИТЬ(1 КАК ЧИСЛО(15, 7))) КАК ЧИСЛО(15, 7))) КАК Вес,
	Продажи.ЗаказКлиента КАК ЗаказКлиента
ПОМЕСТИТЬ Продажи
ИЗ
	РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоПериода, &ОкончаниеПериода, Авто, Менеджер = &Менеджер) КАК Продажи
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК АналитикаНоменклатуры
		ПО (Продажи.АналитикаУчетаНоменклатуры = АналитикаНоменклатуры.КлючАналитики)
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК АналитикаПоПартнерам
		ПО (Продажи.АналитикаУчетаПоПартнерам = АналитикаПоПартнерам.КлючАналитики)
ГДЕ
	АналитикаПоПартнерам.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.НашеПредприятие)
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ПланПродаж.ТипПлана КАК ТипПлана,
	МАКСИМУМ(ПланПродаж.Значение) КАК План,
	ВЫБОР ПланПродаж.ТипПлана
		КОГДА ЗНАЧЕНИЕ(Перечисление.ИТМ_ТипПлана.КоличествоШт)
			ТОГДА СУММА(Продажи.Количество)
		КОГДА ЗНАЧЕНИЕ(Перечисление.ИТМ_ТипПлана.КоличествоSKU)
			ТОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Номенклатура)
		КОГДА ЗНАЧЕНИЕ(Перечисление.ИТМ_ТипПлана.КоличествоПартнеров)
			ТОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Продажи.Партнер)
		КОГДА ЗНАЧЕНИЕ(Перечисление.ИТМ_ТипПлана.Выручка)
			ТОГДА СУММА(Продажи.Выручка)
		КОГДА ЗНАЧЕНИЕ(Перечисление.ИТМ_ТипПлана.Вес)
			ТОГДА СУММА(Продажи.Вес)
		ИНАЧЕ 0
	КОНЕЦ КАК Факт,
	Продажи.Номенклатура КАК Номенклатура,
	Продажи.Партнер КАК Партнер,
	Продажи.ЗаказКлиента КАК ЗаказКлиента
ИЗ
	ПланПродаж КАК ПланПродаж
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИТМ_ПланыПродажНоменклатура КАК ОтборПоНоменклатуре
		ПО ПланПродаж.КлючСвязи = ОтборПоНоменклатуре.КлючСвязи
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ИТМ_ПланыПродажПартнеры КАК ОтборПоПартнерам
		ПО ПланПродаж.КлючСвязи = ОтборПоПартнерам.КлючСвязи
		ЛЕВОЕ СОЕДИНЕНИЕ Продажи КАК Продажи
		ПО (ВЫБОР
				КОГДА ОтборПоНоменклатуре.КлючСвязи ЕСТЬ НЕ NULL 
					ТОГДА ОтборПоНоменклатуре.Номенклатура = Продажи.Номенклатура
				ИНАЧЕ ИСТИНА
			КОНЕЦ)
			И (ВЫБОР
				КОГДА ОтборПоНоменклатуре.КлючСвязи ЕСТЬ НЕ NULL 
					ТОГДА ОтборПоПартнерам.Партнер = Продажи.Партнер
				ИНАЧЕ ИСТИНА
			КОНЕЦ)

СГРУППИРОВАТЬ ПО
	ПланПродаж.ТипПлана,
	Продажи.Номенклатура,
	Продажи.Партнер,
	Продажи.ЗаказКлиента
Показать
15. bmk74 234 18.03.21 18:49 Сейчас в теме
И (ВЫБОР
                КОГДА ОтборПоНоменклатуре.КлючСвязи ЕСТЬ НЕ NULL 

Тут тоже наверное ошибка

А вообще лучше еще один подзапрос добавить сначала для получения плана и суммы плана
а дальше уже с продажами соединять опять же тремя подзапросами, три левых соединения..не очень хорошо..
triviumfan; +1 Ответить
16. triviumfan 93 18.03.21 20:17 Сейчас в теме
(15) Ага, забыл исправить в соединении где ОтборПоПартнерам.КлючСвязи ЕСТЬ НЕ NULL
17. user1566402 20.03.21 12:23 Сейчас в теме
18. triviumfan 93 22.03.21 11:45 Сейчас в теме
Клиент захотел 2 вида расчета показателя "Количество SKU":
Если указан отбор по партнерам, то в одном случае факт считать как количество SKU для каждого партнера, а во втором случае - суммарно по всем партнерам) придётся признак какой-либо добавить в ТЧ...
Оставьте свое сообщение

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