Не выводится отчет скд, если меняю текст запроса

1. aalu14 30.09.22 12:36 Сейчас в теме
Добрый день! Делаю отчет скд. В запросе есть параметр, его передаю с формы отчета. Устанавливаю параметр, отчет выводится. Необходимое условие - если в форме параметр не выбран, то нужно вывести отчет без учета параметра, как решил: просто проверяю значение если обещание = "" тогда заменяю строку в запросе. Отчет не выводится...Текст запроса с удаленной строкой переношу в консоль запросов - там результат выводится. Посоветуйте, пожалуйста, куда копать?

Запрос из набора данных скд:
ВЫБРАТЬ
    СотрудникПоДоговоруСрезПоследних.Сотрудник,
    СотрудникПоДоговоруСрезПоследних.Договор КАК Договор,
    СотрудникПоДоговоруСрезПоследних.Период  КАК Период
ПОМЕСТИТЬ Сотрудник
ИЗ
    РегистрСведений.СотрудникПоДоговору.СрезПоследних(, ) КАК СотрудникПоДоговоруСрезПоследних
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Сотрудник.Сотрудник,
    СУММА(ХозрасчетныйОстатки.СуммаОстатокДт) КАК Долг,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сотрудник.Договор) КАК Количество,
    СУММА(ДоходыСотрудниковОбороты.СуммаОборот) КАК Сумма,
    СУММА(РАЗНОСТЬДАТ(АнкетаКлиента.Договор.ДатаОкончания, &Сегодня, ДЕНЬ)) КАК ДниПросрочки

ИЗ
    Сотрудник КАК Сотрудник
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(
                ,
                Счет.Код = "58"
                    ИЛИ Счет.Код = "76",
                ,
                ВЫРАЗИТЬ(Субконто2 КАК Справочник.ДоговорыКонтрагентов) В
                    (ВЫБРАТЬ
                        Сотрудник.Договор
                    ИЗ
                        Сотрудник КАК Сотрудник)) КАК ХозрасчетныйОстатки
        ПО (Сотрудник.Договор = (ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто2 КАК Справочник.ДоговорыКонтрагентов)))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ДоходыСотрудников.Обороты(
                ,
                ,
                ,
                Договор В
                    (ВЫБРАТЬ
                        Сотрудник.Договор
                    ИЗ
                        Сотрудник КАК Сотрудник)) КАК ДоходыСотрудниковОбороты
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АнкетаКлиента КАК АнкетаКлиента
            ПО ДоходыСотрудниковОбороты.Договор.Ссылка = АнкетаКлиента.Договор.Ссылка
        ПО Сотрудник.Договор = ДоходыСотрудниковОбороты.Договор

Где Сотрудник.Период между &НачалоПериода и &КонецПериода
    И АнкетаКлиента.Обещание = &об

СГРУППИРОВАТЬ ПО
    Сотрудник.Сотрудник

Показать


Меняю текст запроса так:

Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,КомпоновщикНастроек.ПолучитьНастройки(),ДанныеРасшифровки);
    
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(2).Значение = НачалоДня(ТекущаяДата());
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(2).Использование = Истина;
    
    
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(0).Значение = НачалоДня(НачалоПериода);
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(0).Использование = Истина;
    
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(1).Значение = КонецДня(КонецПериода);
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(1).Использование = Истина;
    
    //если все
    Если Обещание = "" тогда 
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Использование = Ложь;
    МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос=СтрЗаменить(МакетКомпоновки.НаборыДанных.НаборДанных1.Запрос,"И АнкетаКлиента.Обещание = &об","");
    иначе
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Значение = Обещание;
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Использование = Истина;
    КонецЕсли;
        
КонецПроцедуры


Показать


Текст запроса меняется как надо:
ВЫБРАТЬ
    СотрудникПоДоговоруСрезПоследних.Сотрудник,
    СотрудникПоДоговоруСрезПоследних.Договор КАК Договор,
    СотрудникПоДоговоруСрезПоследних.Период  КАК Период
ПОМЕСТИТЬ Сотрудник
ИЗ
    РегистрСведений.СотрудникПоДоговору.СрезПоследних(, ) КАК СотрудникПоДоговоруСрезПоследних
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Сотрудник.Сотрудник,
    СУММА(ХозрасчетныйОстатки.СуммаОстатокДт) КАК Долг,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Сотрудник.Договор) КАК Количество,
    СУММА(ДоходыСотрудниковОбороты.СуммаОборот) КАК Сумма,
    СУММА(РАЗНОСТЬДАТ(АнкетаКлиента.Договор.ДатаОкончания, &Сегодня, ДЕНЬ)) КАК ДниПросрочки

ИЗ
    Сотрудник КАК Сотрудник
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(
                ,
                Счет.Код = "58"
                    ИЛИ Счет.Код = "76",
                ,
                ВЫРАЗИТЬ(Субконто2 КАК Справочник.ДоговорыКонтрагентов) В
                    (ВЫБРАТЬ
                        Сотрудник.Договор
                    ИЗ
                        Сотрудник КАК Сотрудник)) КАК ХозрасчетныйОстатки
        ПО (Сотрудник.Договор = (ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто2 КАК Справочник.ДоговорыКонтрагентов)))
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ДоходыСотрудников.Обороты(
                ,
                ,
                ,
                Договор В
                    (ВЫБРАТЬ
                        Сотрудник.Договор
                    ИЗ
                        Сотрудник КАК Сотрудник)) КАК ДоходыСотрудниковОбороты
            ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.АнкетаКлиента КАК АнкетаКлиента
            ПО ДоходыСотрудниковОбороты.Договор.Ссылка = АнкетаКлиента.Договор.Ссылка
        ПО Сотрудник.Договор = ДоходыСотрудниковОбороты.Договор

Где Сотрудник.Период между &НачалоПериода и &КонецПериода

СГРУППИРОВАТЬ ПО
    Сотрудник.Сотрудник

Показать


Этот запрос прогоняю через консоль запросов и там выводится то, что нужно. Если вручную в наборе данных скд в тексте запроса убрать строку с параметром, то отчет тоже выводится. Опыта не хватает, чтобы разобраться, не знаю, куда копать. Подскажите, пожалуйста. Заранее спасибо.
По теме из базы знаний
Найденные решения
2. MuxaH 30.09.22 13:05 Сейчас в теме
(1) Что-то мне подсказывает, что сначала надо текст запроса поменять, а потом уже макет компоновки выполнять...
Что-то вроде
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    //если все
    Если Обещание = "" тогда 
        КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Использование = Ложь; 
        СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = СтрЗаменить(СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос,"И АнкетаКлиента.Обещание = &об","");
   иначе
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Значение = Обещание;
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Использование = Истина;
    КонецЕсли;
    
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
КонецПроцедуры
Показать


Ну или попробовать воспользоваться расширением языка запросов СКД, взять это условие в фигурные скобки, тогда если использование параметра отключено, то СКД сама условие из запроса исключает
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. MuxaH 30.09.22 13:05 Сейчас в теме
(1) Что-то мне подсказывает, что сначала надо текст запроса поменять, а потом уже макет компоновки выполнять...
Что-то вроде
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    //если все
    Если Обещание = "" тогда 
        КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Использование = Ложь; 
        СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос = СтрЗаменить(СхемаКомпоновкиДанных.НаборыДанных.НаборДанных1.Запрос,"И АнкетаКлиента.Обещание = &об","");
   иначе
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Значение = Обещание;
    КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Получить(3).Использование = Истина;
    КонецЕсли;
    
        КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.ПолучитьНастройки(), ДанныеРасшифровки);
    
    ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки, Истина);
    
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
    ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
КонецПроцедуры
Показать


Ну или попробовать воспользоваться расширением языка запросов СКД, взять это условие в фигурные скобки, тогда если использование параметра отключено, то СКД сама условие из запроса исключает
3. aalu14 30.09.22 13:20 Сейчас в теме
(2)Помогло, выводятся значения, но, к сожалению, почему-то не все.
4. MuxaH 30.09.22 13:24 Сейчас в теме
(3) Через отладчик и консоль компоновки данных смотреть какой реально запрос выполняет СКД.
5. aalu14 30.09.22 13:26 Сейчас в теме
(4)Нашел свою ошибку. Спасибо Вам огромное!
Оставьте свое сообщение

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