Приветствую! Есть 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
(1) что-то не договариваете. По приведенной схеме будет пустой запрос, так как не заполнен вывод данных.
Если добавить простейший вывод данных, то получится итоговый запрос следующий:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ВЫБОР
КОГДА Номенклатура.ВесЧислитель = 0
ИЛИ Номенклатура.ВесЧислитель ЕСТЬ NULL
ТОГДА 0
КОГДА Номенклатура.ВесЗнаменатель = 0
ИЛИ Номенклатура.ВесЗнаменатель ЕСТЬ NULL
ТОГДА 0
ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
КОНЕЦ КАК ЗначениеПоказателя
ПОМЕСТИТЬ ВТ_ВЕС
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура
ПОМЕСТИТЬ ВТ_Номенклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
&Период КАК Период,
ВТ_Номенклатура.Номенклатура КАК Номенклатура,
ЕСТЬNULL(ВТ_ВЕС.ЗначениеПоказателя, 0) КАК ЗначениеПоказателя,
ПРЕДСТАВЛЕНИЕССЫЛКИ(ВТ_Номенклатура.Номенклатура) КАК НоменклатураПредставление
ИЗ
ВТ_Номенклатура КАК ВТ_Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ВЕС КАК ВТ_ВЕС
ПО ВТ_Номенклатура.Номенклатура = ВТ_ВЕС.Номенклатура
Показать
Где и как получали итоговый запрос по приведенной схеме?
Если добавить простейший вывод данных, то получится итоговый запрос следующий:
В том то и дело, что это бюджетирование. Итоговый отчет может состоять из десятков таких СКДшек, и компилируются они БСПшной подсистемой в одну общую. и там запрос получается именно такой. Изначально у меня вообще запрос был как одна первая ВТшка и на него устанавливались эти ограничения, решил обмануть связью с непосредственной таблицей справочника, но железяка хоть и тупая но ее не обманешь) на итоговую тоже придумала условие.
так эти условия могут накладываться на этапе "компилируются они БСПшной подсистемой в одну общую". И ничего в запросе не сделаете.
Согласен, но все равно оно регулируется только настройками СКД. на скринах видно. Я не двигался с места, как остановился в точке и показываю вам два запроса первый из Схемы, второй из Макета, который получается простым кодом
МакетКД = ПолучитьМакетаКД(СхемаСКД, КомпоновщикНастроек);
НаборДанных = МакетКД.НаборыДанных.Найти(ИмяНабораДанных);
ЗапросНабораДанных = Новый Запрос();
ЗапросНабораДанных.Текст = НаборДанных.Запрос;
Для каждого ПараметрКД из МакетКД.ЗначенияПараметров Цикл
Если ТипЗнч(ПараметрКД.Значение) = Тип("ТаблицаЗначений") Тогда
Продолжить;
ИначеЕсли ТипЗнч(ПараметрКД.Значение) = Тип("ВыражениеКомпоновкиДанных") Тогда
ЗапросНабораДанных.УстановитьПараметр(ПараметрКД.Имя, ТекущаяДата());
Иначе
ЗапросНабораДанных.УстановитьПараметр(ПараметрКД.Имя, ПараметрКД.Значение);
КонецЕсли;
КонецЦикла;
Возврат ЗапросНабораДанных;
Показать
Мой вопрос в том что это за настройка отвечающая за такое поведение. узнав ее может смогу в коде найти где это устанавливается "на этапе БСПшной компиляции")
(17) начните с простого.
Замените текст запроса на такой:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
ВЫБОР
КОГДА Номенклатура.ВесЗнаменатель = 0
ТОГДА 0
ИНАЧЕ Номенклатура.ВесЧислитель * 100 / Номенклатура.ВесЗнаменатель
КОНЕЦ КАК ЗначениеПоказателя
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
НЕ Номенклатура.ПометкаУдаления
С этого и начинал) остальные ВТшки были добавлены в надежде обмануть программу. Думал если две разных таблицы ограничение поставит на одну.
В таком запросе тоже будет установлено условие на не ноль
А их как нибудь можно расковырять? по шифтф9 там ничего, в функцию они попадают из хранилища значений (реквизит справочника). Возможно, где-то дополняются правятся Но в этих БСПшных скачках из одного места в другое фоном, искать то что не знаешь тяжеловато)
ВЫБОР
КОГДА ЕСТЬNULL(Номенклатура.ВесЗнаменатель,0) <> 0
ТОГДА ЕСТЬNULL(Номенклатура.ВесЧислитель,0) * 100 / ЕСТЬNULL(Номенклатура.ВесЗнаменатель,0)
ИНАЧЕ 0
КОНЕЦ КАК ЗначениеПоказателя
вопрос кажется странным потому что в ОП у меня не прикрепился файл СКД. Если посмотреть запрос в ХМЛке видно что никаких условий на 0 и null я не устанавливаю
(26) Хотя, согласен, само меняться ничего не будет. железяка тупая. Но вот ищу ту самую галочку в декларативной и удобной схеме, которая не скажет программе добавь еще пару условий.