Соединяем план и факт

SDV 101 4 10

Коллеги добрый вечер.
Составляю отчет на СКД "Анализ расхода продуктов питания". Отчёт должен сравнивать фактические расходы продуктов с плановыми показателями. Ниже набросок Запроса (набора данных)

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

Вполне возможна ситуация, что плановые показатели для какого-то продукта существуют, а фактических расходов пока не было. Возможна и обратная ситуация: фактический расход произведён, а плановые показатели ещё не заведены. В данном случае результат вычисления полей ГруппаПродуктовПитания = КатегорияДовольствующихся = NULL

Я понимаю, что возможно заменить РасходПродуктовПоКДОбороты.КатегорияДовольствующихся на ЕСТЬNULL(РасходПродуктовПоКДОбороты.КатегорияДовольствующихся, АП_НормативыПитанияНатуральныеСрезПоследних.КатегорияДовольствующихся)

Наверное возможно решить проблему с помощью объединение наборов данных на уровне СКД.
(я с СКД на Вы)

Какие ещё варианты решения задачи существуют и какой из них предпочтительней? По каким причинам?

12

Ответы

Zloyka
#1, 04 октября 2020 10:01

Я полагаю нормативы заданы для всех продуктов, поэтому нужно левое соединение к таблице регистра сведений, собственно и поля "Учреждение", "КатегорияДовольствующихся" и "ГруппаПродкутовПитания" брать нужно оттуда, а из таблицы регистра накопления брать только фактические показатели по количеству и сумме. Отчет на самом деле очень простой, но по хорошему надо добавить параметры виртуальной таблицы оборотов, &ДатаНачала, &ДатаОкончания и брать срез последних на &ДатаНачала, чтобы вы получали результат за период.


SDV
#2, 04 октября 2020 11:22

(1) Zloyka, в процессе работы нормативы могут быть заданы не для всех позиций и пользователь это должен увидеть в отчёте.


Zloyka
#3, ред. 04 октября 2020 12:30

Сейчас попробую набросать.


SDV
#4, 04 октября 2020 12:32

(3) Zloyka, я так понимаю, что вы бы при решении сходной задачи пользовались бы именно этим способом? Я также решил эту задачу. Просто меня мучают сомнения: является ли этот способ оптимальным и правильным? Вот в БГУ 1.0 в отчете АнализИсполненияПланаФХД аналогичную задачу решают с помощью объединения Запросов по плану и факту в сводную временную таблицу, а дальше делают запрос к этой временной таблице... Почему разработчики пошли таким путём а не нашим?


SDV
#5, 04 октября 2020 12:43

(3) Zloyka, не утруждайтесь:

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

Это имеете в виду?!


Zloyka
#6, ред. 04 октября 2020 13:06

(4) SDV, во-первых уже не правильно, если оставить все как есть то у вас будут пустые поля где, например, не было движений, но были нормы, получится вот так

Поэтому правильно будет сделать для учреждения, группы и категории вот так
ЕСТЬNULL(РасходПродуктовОбороты.Учреждение, НормативыСрезПоследних.Учреждение) КАК Учреждение

Приложил, выгрузку базы с конфигурацией которую набросал, там есть этот отчет в СКД

Да, именно это я и име в виду.
АнализРасходаПродуктов.dt

неправильно.png


SDV
#7, ред. 04 октября 2020 13:14

У меня:
ЕСТЬNULL(РасходПродуктовПоКДОбороты.Учреждение, АП_НормативыПитанияНатуральныеСрезПоследних.Учреждение) КАК Учреждение,
у вас:
ЕСТЬNULL(РасходПродуктовОбороты.Учреждение, НормативыСрезПоследних.Учреждение) КАК Учреждение

эээ... не вижу разницы

p.s. Спасибо что так основательно взялись за обсуждение =)


Zloyka
#8, 04 октября 2020 13:33

(7) SDV, пока я разбирался как тут чего на форуме, не заметил вашего сообщения, поэтому разницы и нет)
А так основательно, потому что иначе не усну) По поводу правильно, и альтернативных вариантов, я бы сделал именно так, если же речь бы шла не об отчетах, а о табличной части (например) только опредленными сочетаниями, то там да, я бы ее сначала запихнул во временную таблицу, а потом во-первых в параметрах виртуальных таблиц в секции условия отбирал бы по ним, и в результирующей таблице, крепил левым соединением к ней регистр сведений и регистр накопления, а если нам нужен в отчет весь список полностью то больше того что есть изобреать не нужно.


SDV
#9, 04 октября 2020 13:36

Супер исчерпывающий ответ у вас получился =) Спасибо! С вашего позволения я немного повременю с установкой "Решено" - может будут ещё мнения по этому вопросу у сообщества. Интересно же =)


Zloyka
#10, 04 октября 2020 13:49

(9) SDV, вариант с объединением отчет "Анализ объединение"

ВЫБРАТЬ
	НормативыСрезПоследних.Учреждение КАК Учреждение,
	НормативыСрезПоследних.Категория КАК Категория,
	НормативыСрезПоследних.ГруппаПродуктов КАК ГруппаПродуктов,
	НормативыСрезПоследних.Количество КАК КоличествоПлан,
	НормативыСрезПоследних.Сумма КАК СуммаПлан,
	NULL КАК КоличествоФакт,
	NULL КАК СуммаФакт
ПОМЕСТИТЬ ВТ
ИЗ
	РегистрСведений.Нормативы.СрезПоследних КАК НормативыСрезПоследних

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	РасходПродуктовОбороты.Учреждение,
	РасходПродуктовОбороты.Категория,
	РасходПродуктовОбороты.ГруппаПродуктов,
	NULL,
	NULL,
	РасходПродуктовОбороты.КоличествоОборот,
	РасходПродуктовОбороты.СуммаОборот
ИЗ
	РегистрНакопления.РасходПродуктов.Обороты КАК РасходПродуктовОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ.Учреждение КАК Учреждение,
	ВТ.Категория КАК Категория,
	ВТ.ГруппаПродуктов КАК ГруппаПродуктов,
	СУММА(ВТ.КоличествоПлан) КАК КоличествоПлан,
	СУММА(ВТ.СуммаПлан) КАК СуммаПлан,
	СУММА(ВТ.КоличествоФакт) КАК КоличествоФакт,
	СУММА(ВТ.СуммаФакт) КАК СуммаФакт
ИЗ
	ВТ КАК ВТ

СГРУППИРОВАТЬ ПО
	ВТ.Учреждение,
	ВТ.Категория,
	ВТ.ГруппаПродуктов

Обновленная конфигурация прилагается, результат точно такой же, там оба отчета.
1Cv8.dt


SDV
#11, 04 октября 2020 13:56

(10) Zloyka, ну может тогда стоит и средствами СКД попробовать реализовать объединение?! Для полного комплекта


Лучший ответ Zloyka
#12, ред. 04 октября 2020 14:13

(11) SDV, открою вам страшную тайну ими никто не пользуется, но раз уж вы настаиваете) Кроме того чтобы просуммировать записи объединения, на закладке настройки придется создавать вместо группировки "детальные записи", группировку формирующуюся ключом уникальности из трех полей (учреждение, категория, группа продуктов). Конфигурацию со всеми тремя вариантами прилагаю. Третий отчет "Анализ объединением СКД", результат везде одинаковый.
Финальная.dt


См. также

Сравнение плановых и фактических дней отпуска

ПараметрыРезервнойКопии (БСП)

НазначениеПланаОбмена (БСП)

ЕстьМакетПланаОбмена (БСП)

ПланыОбменаРИБ (БСП)

ЭтоПланОбменаРаспределеннойИнформационнойБазы (БСП)

ПолучитьМенеджерПланаОбменаПоИмени (БСП)

ЭтоПланОбменаXDTO (БСП)

Модератору