Владелец справочника в запрос.

1. Intercititude 10.02.20 11:30 Сейчас в теме
Есть отчёт на скд :
ВЫБРАТЬ
	ВЗ.Заказчик КАК Клиент,
	ВЗ.Заказчик.ОсновнойМенеджерПокупателя.Родитель КАК Канал,
	ВЗ.Ссылка КАК Ссылка,
	ВнутреннийЗаказТовары.Номенклатура КАК Номенклатура,
	ВЗ.ГраницаРезерва КАК ДатаКонцаСрочногоРезерва,
	ВЗ.Дата КАК ДатаНачалаСрочногоРезерва,
	ВнутреннийЗаказТовары.Количество КАК ПервоначальноеЗначениеРезерва,
	ВнутреннийЗаказТовары.СерияНоменклатуры КАК СерияНоменклатуры
ПОМЕСТИТЬ ВЗаказ
ИЗ
	Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВнутреннийЗаказ КАК ВЗ
		ПО ВнутреннийЗаказТовары.Ссылка = ВЗ.Ссылка
ГДЕ
	ВЗ.Дата МЕЖДУ &ДатаНач И &ДатаКон
	И ВЗ.Проведен = ИСТИНА
	И ВЗ.ПометкаУдаления = ЛОЖЬ
;

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

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

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

УПОРЯДОЧИТЬ ПО
	ДатаНачалаСрочногоРезерва,
	ДатаКонцаСрочногоРезерва
Показать


Вопрос следующий.Реквизит "Заказчик" у документа "Внутрений заказ" имеет составной тип Справочник.Контрагенты и Справочник.Категории.

И есть справочник "КатегорииКонтрагентов"(владелец у него спр.Контрагенты) с реквизитом "Значение"(типа.спр.Категории).

При выборе в документа ВидЗаказчика = Категории, можно выбрать название категории и вывести отчёт по этой категории(группе) в которую входят несколько "Контрагентов". Пример кода этого отчёта:

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


Проблема следующего характера. В моём отчёте Остатки и обороты выводит по контрагенту безупречно. Но если у документа выбрана "Категория", то эту группу категории не видно.
Подскажите как сделать запрос, чтобы пользователь смог увидеть ТекЗначение и среднее по группе Контрагентов?

Приложил скрин,как раз где формируется отчёт по Категории.
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
3. dhurricane 10.02.20 12:00 Сейчас в теме +0.5 $m
Если решать Вашу задачу "в лоб", то самое простое, это доработать последний запрос следующим образом:
ВЫБРАТЬ
	...
ИЗ
	Резервы КАК Резервы
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КатегорииКонтрагентов КАК КатегорииКонтрагентов
		ПО Резервы.Клиент = КатегорииКонтрагентов.Значение
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(ДОБАВИТЬКДАТЕ(&ДатаДок, МЕСЯЦ, -3), &ДатаДок, , ) КАК ПродажиОбороты
		ПО Резервы.Номенклатура = ПродажиОбороты.Номенклатура
			И ЕСТЬNULL(КатегорииКонтрагентов.Владелец, Резервы.Клиент) = ПродажиОбороты.Контрагент
Показать

Однако будьте готовы к тому, что у Вас появятся дубли значений (например, "ПервоначальноеЗнач").
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. lmnlmn 69 10.02.20 11:51 Сейчас в теме
(1)
Реквизит "Заказчик" у документа "Внутрений заказ" имеет составной тип Справочник.Контрагенты и Справочник.Категории.

Это вот неплохой такой источник проблем, на самом деле. Вопрос: если в заказе указана категория в которую входит несколько контрагентов то как понять на кого из них отнести заказ?
4. Intercititude 10.02.20 13:36 Сейчас в теме
(2) Заказ относится на группу контрагентов. То есть каждая продажа у каждого контрагента по идее плюсуются и выводятся как общее по "Категории".
3. dhurricane 10.02.20 12:00 Сейчас в теме +0.5 $m
Если решать Вашу задачу "в лоб", то самое простое, это доработать последний запрос следующим образом:
ВЫБРАТЬ
	...
ИЗ
	Резервы КАК Резервы
		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.КатегорииКонтрагентов КАК КатегорииКонтрагентов
		ПО Резервы.Клиент = КатегорииКонтрагентов.Значение
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(ДОБАВИТЬКДАТЕ(&ДатаДок, МЕСЯЦ, -3), &ДатаДок, , ) КАК ПродажиОбороты
		ПО Резервы.Номенклатура = ПродажиОбороты.Номенклатура
			И ЕСТЬNULL(КатегорииКонтрагентов.Владелец, Резервы.Клиент) = ПродажиОбороты.Контрагент
Показать

Однако будьте готовы к тому, что у Вас появятся дубли значений (например, "ПервоначальноеЗнач").
5. alex008s 10.02.20 14:02 Сейчас в теме
(3) А мне думается что нужно в первый запрос добавить выборку где заказы расписанные на категории будут дублироваться на каждого входящего в категорию заказчика. Чтобы в последнем запросе резервы по конкретным заказчикам расписать. Только нужно будет еще и категорию туда добавить чтобы можно было по ней среднюю считать...
6. Intercititude 10.02.20 14:13 Сейчас в теме
(5)ну я примерно так же мыслил,но реализовать не вышло...
7. dhurricane 10.02.20 15:40 Сейчас в теме
(5) Я не могу прокоментировать, как лучше, т.к. плохо представляю конечный результат, которого автор пытается достичь. Да, предварительное получение контрагентов будет выгоднее еще и тем, что обороты продаж можно будет получить отдельной выборкой с отбором по этим контрагентам. Это может положительно сказаться на производительности отчета.

Но как я уже указал выше, есть риск получить дубли значений в отчете. Тогда в этом случае придется либо писать сложные выражения ресурсов, либо переделывать запрос вовсе. Потому и предложил самый простой путь. Если потребуется, автор задаст дополнительные вопросы с уточнениями по задаче, тогда и я смогу предложить более корректное альтернативное решение.
8. Intercititude 11.02.20 09:58 Сейчас в теме
(3)
КатегорииКонтрагентов.Владелец


Ругается мол КатегорииКонтрагентов.Владелец поле не найдено.
9. dhurricane 11.02.20 10:10 Сейчас в теме
(8) Возможно Вы или я опечатались в синониме таблицы.
10. Intercititude 11.02.20 12:22 Сейчас в теме
(9) Сделал копированием из своей базы. Странно. Точно можно в связях делать естьnull ?
11. dhurricane 11.02.20 12:25 Сейчас в теме
(10) Если было бы нельзя, то сообщение об ошибке было бы направлено на функцию ЕСТЬNULL. А у Вас же поле не найдено.
12. Intercititude 11.02.20 12:28 Сейчас в теме
(11) в этом месте
ЕСТЬNULL(КатегорииКонтрагентов.Владелец, Резервы.Клиент)


Мы же можем указать слева только одну таблицу. Как сразу две ?
13. Intercititude 11.02.20 12:31 Сейчас в теме
(11) А вот.Получилось. И правда куча дублей номенклатуры и значении. А среднее так и не выводит вовсе ;(
14. dhurricane 11.02.20 12:35 Сейчас в теме
(13) Странно. А не могли бы Вы привести текущий запрос?
15. Intercititude 11.02.20 12:37 Сейчас в теме
(14) пожалуйста
ВЫБРАТЬ
	ВЗ.Заказчик КАК Клиент,
	ВЗ.Заказчик.ОсновнойМенеджерПокупателя.Родитель КАК Канал,
	ВЗ.Ссылка КАК Ссылка,
	ВнутреннийЗаказТовары.Номенклатура КАК Номенклатура,
	ВЗ.ладГраницаРезерва КАК ДатаКонцаСрочногоРезерва,
	ВЗ.Дата КАК ДатаНачалаСрочногоРезерва,
	ВнутреннийЗаказТовары.Количество КАК ПервоначальноеЗначениеРезерва,
	ВнутреннийЗаказТовары.СерияНоменклатуры КАК СерияНоменклатуры
ПОМЕСТИТЬ ВЗаказ
ИЗ
	Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТовары
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ВнутреннийЗаказ КАК ВЗ
		ПО ВнутреннийЗаказТовары.Ссылка = ВЗ.Ссылка
ГДЕ
	ВЗ.Дата МЕЖДУ &ДатаНач И &ДатаКон
	И ВЗ.Проведен = ИСТИНА
	И ВЗ.ПометкаУдаления = ЛОЖЬ
;

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

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

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

УПОРЯДОЧИТЬ ПО
	ДатаНачалаСрочногоРезерва,
	ДатаКонцаСрочногоРезерва
Показать
16. dhurricane 11.02.20 12:40 Сейчас в теме
(15) Вы невнимательно скопировали. У меня в примере было 2 условия связи с таблицей оборотов продаж, не 3.
17. Intercititude 11.02.20 12:41 Сейчас в теме
(16) да,заметил. переделал так. всё равно та же история:

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

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

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

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

УПОРЯДОЧИТЬ ПО
	ДатаНачалаСрочногоРезерва,
	ДатаКонцаСрочногоРезерва
Показать
18. dhurricane 11.02.20 12:49 Сейчас в теме
(17) На всякий случай переспрошу. Какого типа реквизит "Заказчик" документа "ВнутреннийЗаказ"?
19. Intercititude 11.02.20 12:54 Сейчас в теме
(18)СправочникСсылка.Подразделения, СправочникСсылка.Контрагенты, СправочникСсылка.Склады, СправочникСсылка.Категории
20. dhurricane 11.02.20 12:57 Сейчас в теме
(19) Отобразите в отчете (или в консоли запросов) помимо поля "Резервы.Клиент" еще и "ладКатегорииКонтрагентов.Владелец". Есть ли в результате для категорий их контрагенты?
21. Intercititude 11.02.20 13:03 Сейчас в теме
(20) Да. Дак поэтому и дублируется вся номенклатура,текзначение и первоначальноезнач. Но продажи всё равно не видно. Это главный вопрос.
22. dhurricane 11.02.20 13:13 Сейчас в теме
(21) Так я пытаюсь понять, почему продаж нет. :)

Контрагент отображается правильный (для категорий), однако оборотов нет, хотя в регистре реально данные есть?
23. Intercititude 11.02.20 13:18 Сейчас в теме
(22) А вот. Всё вышло. На рабочей базе проверил. извините,не выспался )

Последний вопрос только. Как мне сгруппировать всю номенклатуру и сложить все средние для каждой номенклатуры? Именно только когда Категории.
24. Intercititude 11.02.20 13:26 Сейчас в теме
(22) Вот к примеру. Слева одна и та же номенклатура. Как бы схлопнуть её приплюсовав все Средние ?
Прикрепленные файлы:
25. dhurricane 11.02.20 13:32 Сейчас в теме +0.5 $m
(24) Мне стыдно предлагать Вам это, но Вы можете просто сгруппировать данные в последнем запросе. :) Первоначальное значение пусть попадет в поля группировки, а средние - просуммируются.
26. Intercititude 11.02.20 13:46 Сейчас в теме
(25) А в других случаях разве не будет проблем. Ну когда не категории а контрагент.
27. dhurricane 11.02.20 13:56 Сейчас в теме
(26) Только те же, что и для категорий: если будет несколько одинаковых строк, то они просто свернутся.
Оставьте свое сообщение

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