Если нет записей в регистре, то не объединять

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


Вот тут есть участок кода запроса:
|		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
	|			ТаблицаРасходов.Период,
	|			СУММА(ТаблицаРасходов.СуммаФакт) КАК СуммаРасходов
	|		ИЗ
	|			ТаблицаРасходов КАК ТаблицаРасходов
	|		СГРУППИРОВАТЬ ПО
	|			ТаблицаРасходов.Период) КАК ИтоговаяТаблицаРасходов
	|		ПО (ИСТИНА)





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


То работает как надо.

Вопрос: можно ли как-то задать условие, что если допустим записей в врем.таблице нет, то и не соединять
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. UtSpar 134 18.01.18 12:12 Сейчас в теме
(1) Не решили вопрос? решили если поделитесь инфой!
3. BigBoss 2 18.01.18 13:26 Сейчас в теме
4. dandykry 10 18.01.18 13:32 Сейчас в теме
(3)
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    |            ТаблицаРасходов.Период,
    |            СУММА(ТаблицаРасходов.СуммаФакт) КАК СуммаРасходов
    |        ИЗ
    |            ТаблицаРасходов КАК ТаблицаРасходов
    |        СГРУППИРОВАТЬ ПО
    |            ТаблицаРасходов.Период) КАК ИтоговаяТаблицаРасходов
    |        ПО ТаблицаРасходов.Период IS NOT NULL
Показать

Думаю так стоит попробовать
5. BigBoss 2 18.01.18 13:42 Сейчас в теме
(4)
IS NOT NULL

Не получилось. С таким кодом запрос работает так как и работал
6. dandykry 10 18.01.18 13:51 Сейчас в теме
(5)
Может я не обратил внимания на
//|        ПО ИтоговаяТаблицаРасходов.Период = ИтоговаяТаблицаДоходов.Период

  |        ПО  ВЫБОР КОГДА ИтоговаяТаблицаРасходов.Период IS NULL ТОГДА ЛОЖЬ ИНАЧЕ  = ИтоговаяТаблицаРасходов.Период = ИтоговаяТаблицаДоходов.Период КОНЕЦ
7. dandykry 10 18.01.18 13:53 Сейчас в теме
(5)

и тут раз ничего не изменилось

ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
| ТаблицаРасходов.Период, 
| СУММА(ТаблицаРасходов.СуммаФакт) КАК СуммаРасходов 
| ИЗ 
| ТаблицаРасходов КАК ТаблицаРасходов 
| СГРУППИРОВАТЬ ПО 
| ТаблицаРасходов.Период) КАК ИтоговаяТаблицаРасходов 
| ПО ВЫБОР КОГДА ИтоговаяТаблицаРасходов.Период IS NULL ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ.
8. Fox-trot 158 18.01.18 16:40 Сейчас в теме
ЕСТЬNULL(ИтоговаяТаблицаДоходов.Период, ИтоговаяТаблицаРасходов.Период),
замени на
ЕСТЬNULL(ИтоговаяТаблицаДоходов.Период, ЕСТЬNULL(ИтоговаяТаблицаРасходов.Период, 0)),
9. BigBoss 2 19.01.18 06:33 Сейчас в теме
(8)
ЕСТЬNULL(ИтоговаяТаблицаДоходов.Период, ЕСТЬNULL

Попробовал ваш вариант, выдаёт ошибку что операции доступны только для примитивных типов(булево,число дат и т.д.) Ругается на эту строчку:
Если СтрокаПериод.Период >= СметаЗатрат.ДатаНачала И СтрокаПериод.Период <= СметаЗатрат.ДатаОкончания Тогда

Отладчиком посмотрел, тип число имеет "СтрокаПериод.Период" а "СметаЗатрат.ДатаНачала" и "СметаЗатрат.ДатаОкончания" тип даты.


Закомментил. Выдаёт след.ошибку: повторяющийся псевдоним "СуммаФакт", как я понял ругается на вот это:
ПрефиксПериода = Формат(СтрокаПериод.Период, "ДФ=MMyy");
		Запрос.УстановитьПараметр("Период" + ПрефиксПериода, СтрокаПериод.Период);
		
		ПоляПоПериодам = ПоляПоПериодам + ",
		|	СУММА(ВЫБОР КОГДА ИтоговаяТаблица.Период = &Период" + ПрефиксПериода + " ТОГДА ИтоговаяТаблица.СуммаФакт ИНАЧЕ 0 КОНЕЦ) КАК СуммаФакт" + ПрефиксПериода + ",
		|	СУММА(ВЫБОР КОГДА ИтоговаяТаблица.Период = &Период" + ПрефиксПериода + " ТОГДА ИтоговаяТаблица.ДопСуммаФакт ИНАЧЕ 0 КОНЕЦ) КАК ДопСуммаФакт" + ПрефиксПериода + ",
		|	СУММА(ВЫБОР КОГДА ИтоговаяТаблица.Период = &Период" + ПрефиксПериода + " ТОГДА ИтоговаяТаблица.СуммаКорректировка ИНАЧЕ 0 КОНЕЦ) КАК СуммаКорректировка" + ПрефиксПериода + ",
		|	СУММА(ВЫБОР КОГДА ИтоговаяТаблица.Период = &Период" + ПрефиксПериода + " ТОГДА ИтоговаяТаблица.ДопСуммаКорректировка ИНАЧЕ 0 КОНЕЦ) КАК ДопСуммаКорректировка" + ПрефиксПериода;
		ИтогиПоПериодам = ИтогиПоПериодам + ",
		|	СУММА(СуммаФакт" + ПрефиксПериода + "),
		|	СУММА(ДопСуммаФакт" + ПрефиксПериода + "),
		|	СУММА(СуммаКорректировка" + ПрефиксПериода + "),
		|	СУММА(ДопСуммаКорректировка" + ПрефиксПериода + ")";
		
		КоличествоПериодов = КоличествоПериодов + 1;
		
	КонецЦикла;
	
	ТабличныйДокумент.ЗакончитьГруппуКолонок();
	
	Если Не КоличествоПериодов = 0 Тогда
		
		ОбластьМакета = Макет.ПолучитьОбласть("ШапкаТаблицы|Итого");
		
		ТабличныйДокумент.Присоединить(ОбластьМакета);
		
		Область = ТабличныйДокумент.Область(ЧислоОбщихСтрок + 2, 22 + ?(ДлительностьМесяц = 1, 0, 1), ЧислоОбщихСтрок + 2, 22 + ?(ДлительностьМесяц = 1, 0, 1) + КоличествоПериодов * 2);

		Область.Объединить();
		
	КонецЕсли;	
	
	Запрос.Текст = ТекстЗапроса + "
	|ВЫБРАТЬ
	|	ИтоговаяТаблица.ДляСортировки КАК ДляСортировки,
	|	ИтоговаяТаблица.Уровень1 КАК Уровень1,
	|	ИтоговаяТаблица.Уровень2 КАК Уровень2,
	|	ИтоговаяТаблица.Уровень3 КАК Уровень3,
	|	ИтоговаяТаблица.Уровень4 КАК Уровень4,
	|	СУММА(ИтоговаяТаблица.Сумма) КАК Сумма,
	|	СУММА(ИтоговаяТаблица.ДопСумма) КАК ДопСумма,
	|	СУММА(ИтоговаяТаблица.СуммаФакт) КАК СуммаФакт,
	|	СУММА(ИтоговаяТаблица.ДопСуммаФакт) КАК ДопСуммаФакт,
	|	СУММА(ИтоговаяТаблица.СуммаКорректировка) КАК СуммаКорректировка,
	|	СУММА(ИтоговаяТаблица.ДопСуммаКорректировка) КАК ДопСуммаКорректировка" + ПоляПоПериодам + "
	|ИЗ
	|	ИтоговаяТаблица КАК ИтоговаяТаблица
	|
	|СГРУППИРОВАТЬ ПО
	|	ИтоговаяТаблица.ДляСортировки,
	|	ИтоговаяТаблица.Уровень1,
	|	ИтоговаяТаблица.Уровень2,
	|	ИтоговаяТаблица.Уровень3,
	|	ИтоговаяТаблица.Уровень4
	|
	|УПОРЯДОЧИТЬ ПО
	|	ДляСортировки,
	|	Уровень1,
	|	Уровень2,
	|	Уровень3,
	|	Уровень4
	|
	|ИТОГИ
	|	МАКСИМУМ(ДляСортировки),
	|	СУММА(Сумма),
	|	СУММА(ДопСумма),
	|	СУММА(СуммаФакт),
	|	СУММА(ДопСуммаФакт),
	|	СУММА(СуммаКорректировка),
	|	СУММА(ДопСуммаКорректировка)" + ИтогиПоПериодам + "
	|ПО
	|	Уровень1,
	|	Уровень2,
	|	Уровень3";
Показать
10. Fox-trot 158 19.01.18 15:25 Сейчас в теме
глянь в отладчике окончательный текст запроса и поправь. видима проблемы с "+ ПрефиксПериода"
Оставьте свое сообщение

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