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

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 71 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 95 29.03.23 15:31 Сейчас в теме
скд пока не наделили искусственным интеллектом, чтобы он запросы менял...
25. beldieff 29.03.23 15:33 Сейчас в теме
(24)
скд пока не наделили искусственным интеллектом, чтобы он запросы менял...
Вы назвали меня лжецом? Советую почитать немного по этой теме.
26. karamazoff 95 29.03.23 15:36 Сейчас в теме
(25)в каком месте я вас оскорбил? Никак не хотел, уж, звиняйте
28. beldieff 29.03.23 15:38 Сейчас в теме
(26) Ну меняет же, в (22) яркий пример. Но оскорбления никакого не было, это был шутливый пост.
29. beldieff 29.03.23 15:44 Сейчас в теме
(26) Хотя, согласен, само меняться ничего не будет. железяка тупая. Но вот ищу ту самую галочку в декларативной и удобной схеме, которая не скажет программе добавь еще пару условий.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)