СКД меняет запрос

1. beldieff 29.03.23 10:35 Сейчас в теме
Приветствую! Есть erp и простая СКД для получения нефинансового показателя для бюджетирования. И при выполнении запрос в СКД преобразуется в такой: Но мне нужны и нулевые значения, как объяснить этой железяке что не надо править запрос?

Для тех кому лень качать СКД скажу, что запрос итоговый отличается от изначального четырьмя условиями
ВЫБОР
КОГДА Номенклатура.ВесЧислитель = 0
ИЛИ Номенклатура.ВесЧислитель ЕСТЬ NULL
ТОГДА 0
КОГДА Номенклатура.ВесЗнаменатель = 0
ИЛИ Номенклатура.ВесЗнаменатель ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
КОНЕЦ <> 0
И ВЫБОР
КОГДА Номенклатура.ВесЧислитель = 0
ИЛИ Номенклатура.ВесЧислитель ЕСТЬ NULL
ТОГДА 0
КОГДА Номенклатура.ВесЗнаменатель = 0
ИЛИ Номенклатура.ВесЗнаменатель ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
КОНЕЦ ЕСТЬ НЕ NULL
Показать


и

ГДЕ
ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) <> 0
И ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) ЕСТЬ НЕ NULL


ВЫБРАТЬ
	Номенклатура.Ссылка КАК Номенклатура,
	ВЫБОР
		КОГДА Номенклатура.ВесЧислитель = 0
				ИЛИ Номенклатура.ВесЧислитель ЕСТЬ NULL
			ТОГДА 0
		КОГДА Номенклатура.ВесЗнаменатель = 0
				ИЛИ Номенклатура.ВесЗнаменатель ЕСТЬ NULL
			ТОГДА 0
		ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
	КОНЕЦ КАК ЗначениеПоказателя
ПОМЕСТИТЬ ВТ_ВЕС
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	НЕ Номенклатура.ПометкаУдаления
	И ВЫБОР
			КОГДА Номенклатура.ВесЧислитель = 0
					ИЛИ Номенклатура.ВесЧислитель ЕСТЬ NULL
				ТОГДА 0
			КОГДА Номенклатура.ВесЗнаменатель = 0
					ИЛИ Номенклатура.ВесЗнаменатель ЕСТЬ NULL
				ТОГДА 0
			ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
		КОНЕЦ <> 0
	И ВЫБОР
			КОГДА Номенклатура.ВесЧислитель = 0
					ИЛИ Номенклатура.ВесЧислитель ЕСТЬ NULL
				ТОГДА 0
			КОГДА Номенклатура.ВесЗнаменатель = 0
					ИЛИ Номенклатура.ВесЗнаменатель ЕСТЬ NULL
				ТОГДА 0
			ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
		КОНЕЦ ЕСТЬ НЕ NULL 
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	&Период КАК Период,
	ВТ_Номенклатура.Номенклатура КАК Номенклатура,
	ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) КАК ЗначениеПоказателя
ИЗ
	ВТ_Номенклатура КАК ВТ_Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВЕС КАК ВТ_ВЕС
		ПО ВТ_Номенклатура.Номенклатура = ВТ_ВЕС.Номенклатура
ГДЕ
	ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) <> 0
	И ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) ЕСТЬ НЕ NULL 
Показать
Прикрепленные файлы:
ВЕС.xml
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. nomad_irk 76 29.03.23 10:46 Сейчас в теме
(1)
ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) ЕСТЬ НЕ NULL

НЕ совсем понимаю сакральный смысл сего условия......
Вы ж преобразовали NULL в 0 и проверяете на НЕ NULL, зачемЪ?
Условие всегда будет ИСТИНА
6. RustamZz 29.03.23 11:33 Сейчас в теме
(1) Условия ЗначениеПоказателя Заполнено в отборе нет?
8. spacecraft 29.03.23 11:50 Сейчас в теме
(1) что-то не договариваете. По приведенной схеме будет пустой запрос, так как не заполнен вывод данных.
Если добавить простейший вывод данных, то получится итоговый запрос следующий:
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Номенклатура,
	ВЫБОР
		КОГДА Номенклатура.ВесЧислитель = 0
				ИЛИ Номенклатура.ВесЧислитель ЕСТЬ NULL
			ТОГДА 0
		КОГДА Номенклатура.ВесЗнаменатель = 0
				ИЛИ Номенклатура.ВесЗнаменатель ЕСТЬ NULL
			ТОГДА 0
		ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
	КОНЕЦ КАК ЗначениеПоказателя
ПОМЕСТИТЬ ВТ_ВЕС
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	НЕ Номенклатура.ПометкаУдаления
;

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	&Период КАК Период,
	ВТ_Номенклатура.Номенклатура КАК Номенклатура,
	ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) КАК ЗначениеПоказателя,
	ПРЕДСТАВЛЕНИЕССЫЛКИ(ВТ_Номенклатура.Номенклатура) КАК НоменклатураПредставление
ИЗ
	ВТ_Номенклатура КАК ВТ_Номенклатура
		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВЕС КАК ВТ_ВЕС
		ПО ВТ_Номенклатура.Номенклатура = ВТ_ВЕС.Номенклатура
Показать


Где и как получали итоговый запрос по приведенной схеме?
9. beldieff 29.03.23 11:53 Сейчас в теме
(8)
что-то не договариваете. По приведенной схеме будет пустой запрос, так как не заполнен вывод данных.


https://its.1c.ru/db/erpwedoc/bookmark/QueryNonfinancialBudgetIndicators/Qu­eryNonfinancialBudgetIndicators

Вывод данных не нужен, это произвольные правила получения данных для бюджетирования

Где и как получали итоговый запрос по приведенной схеме?

В отладчике при выполнении отчета сохранил схему с помощью этого расширения https://infostart.ru/public/835718/
11. beldieff 29.03.23 11:59 Сейчас в теме
(8)
Если добавить простейший вывод данных, то получится итоговый запрос следующий:


В том то и дело, что это бюджетирование. Итоговый отчет может состоять из десятков таких СКДшек, и компилируются они БСПшной подсистемой в одну общую. и там запрос получается именно такой. Изначально у меня вообще запрос был как одна первая ВТшка и на него устанавливались эти ограничения, решил обмануть связью с непосредственной таблицей справочника, но железяка хоть и тупая но ее не обманешь) на итоговую тоже придумала условие.
12. spacecraft 29.03.23 12:07 Сейчас в теме
(11) так эти условия могут накладываться на этапе "компилируются они БСПшной подсистемой в одну общую". И ничего в запросе не сделаете.
17. beldieff 29.03.23 14:00 Сейчас в теме
(12)
так эти условия могут накладываться на этапе "компилируются они БСПшной подсистемой в одну общую". И ничего в запросе не сделаете.

Согласен, но все равно оно регулируется только настройками СКД. на скринах видно. Я не двигался с места, как остановился в точке и показываю вам два запроса первый из Схемы, второй из Макета, который получается простым кодом
МакетКД = ПолучитьМакетаКД(СхемаСКД, КомпоновщикНастроек);
	

	НаборДанных = МакетКД.НаборыДанных.Найти(ИмяНабораДанных);


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


Мой вопрос в том что это за настройка отвечающая за такое поведение. узнав ее может смогу в коде найти где это устанавливается "на этапе БСПшной компиляции")
Прикрепленные файлы:
18. spacecraft 29.03.23 14:24 Сейчас в теме
(17) начните с простого.
Замените текст запроса на такой:
ВЫБРАТЬ
	Номенклатура.Ссылка КАК Номенклатура,
	ВЫБОР
		КОГДА Номенклатура.ВесЗнаменатель = 0
			ТОГДА 0
		ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
	КОНЕЦ КАК ЗначениеПоказателя
ИЗ
	Справочник.Номенклатура КАК Номенклатура
ГДЕ
	НЕ Номенклатура.ПометкаУдаления
Показать
19. beldieff 29.03.23 14:27 Сейчас в теме
(18)
Замените текст запроса на такой:
С этого и начинал) остальные ВТшки были добавлены в надежде обмануть программу. Думал если две разных таблицы ограничение поставит на одну.
В таком запросе тоже будет установлено условие на не ноль
20. spacecraft 29.03.23 14:27 Сейчас в теме
(19) вот именно точно такой? А не приблизительно такой?
21. beldieff 29.03.23 14:28 Сейчас в теме
(20)
А не приблизительно такой?

ок, чз минут 10 приду с пруфами)
22. beldieff 29.03.23 15:03 Сейчас в теме
(20)Даже без сторонних расширений, в одной процедуре. СКД пришла с одним запросом, макет оказался с другим.
Прикрепленные файлы:
23. spacecraft 29.03.23 15:15 Сейчас в теме
(22) смотрите НастройкиКомпоновщика.
27. beldieff 29.03.23 15:38 Сейчас в теме
(23)
смотрите НастройкиКомпоновщика.
А их как нибудь можно расковырять? по шифтф9 там ничего, в функцию они попадают из хранилища значений (реквизит справочника). Возможно, где-то дополняются правятся Но в этих БСПшных скачках из одного места в другое фоном, искать то что не знаешь тяжеловато)
Прикрепленные файлы:
30. spacecraft 29.03.23 16:00 Сейчас в теме
(27) нет под рукой erp. Но именно в них дело должно быть. От схемы тут не зависит.
13. DesertPunk 29.03.23 12:52 Сейчас в теме
(1)Как минимум нужна проверка на 0 в знаменателе
	ВЫБОР
		КОГДА ЕСТЬNULL(Номенклатура.ВесЗнаменатель,0) <> 0
			ТОГДА ЕСТЬNULL(Номенклатура.ВесЧислитель,0) * 100 / ЕСТЬNULL(Номенклатура.ВесЗнаменатель,0)
              ИНАЧЕ 0
	КОНЕЦ КАК ЗначениеПоказателя
14. beldieff 29.03.23 12:56 Сейчас в теме
15. DesertPunk 29.03.23 13:04 Сейчас в теме
(14) Числитель = 4; Знаменатель = 0. Что мы получаем делая 4*100/0?
16. beldieff 29.03.23 13:05 Сейчас в теме
(15) покажи кусок исходного запроса, который приведет к делению на 0. Это раз
и расскажи как твоя конструкция поможет в решении вопроса. это два
2. soft_wind 29.03.23 10:42 Сейчас в теме
а что за странный запрос? вроде как сами реквизиты (основной таблицы запроса) не могут иметь значение Null
5. beldieff 29.03.23 10:50 Сейчас в теме
(2)
а что за странный запрос?
вопрос кажется странным потому что в ОП у меня не прикрепился файл СКД. Если посмотреть запрос в ХМЛке видно что никаких условий на 0 и null я не устанавливаю
4. beldieff 29.03.23 10:48 Сейчас в теме
(3) Это условие за меня додумывает СКД. Прикрепил файл, там видно какой запрос изначально
Прикрепленные файлы:
ВЕС.xml
7. glek 119 29.03.23 11:46 Сейчас в теме
(4) СКД строит запрос исходя из
обязательных полей
полей, которые выводятся.
отборов, которые используются.
10. beldieff 29.03.23 11:55 Сейчас в теме
(6) (7) Отборов нет, в ролях делал поле и обязательным, и не обязательным.
Прикрепленные файлы:
24. karamazoff 101 29.03.23 15:31 Сейчас в теме
скд пока не наделили искусственным интеллектом, чтобы он запросы менял...
25. beldieff 29.03.23 15:33 Сейчас в теме
(24)
скд пока не наделили искусственным интеллектом, чтобы он запросы менял...
Вы назвали меня лжецом? Советую почитать немного по этой теме.
26. karamazoff 101 29.03.23 15:36 Сейчас в теме
(25)в каком месте я вас оскорбил? Никак не хотел, уж, звиняйте
28. beldieff 29.03.23 15:38 Сейчас в теме
(26) Ну меняет же, в (22) яркий пример. Но оскорбления никакого не было, это был шутливый пост.
29. beldieff 29.03.23 15:44 Сейчас в теме
(26) Хотя, согласен, само меняться ничего не будет. железяка тупая. Но вот ищу ту самую галочку в декларативной и удобной схеме, которая не скажет программе добавь еще пару условий.
Оставьте свое сообщение

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