Имя: Пароль:
1C
 
Запрос в отчете в ЗУП 3.0
0 SleepyHead
 
гуру
08.05.15
11:05
Разбираюсь с отчетом одним, и вот в нем такой запрос в схеме компоновки данных:

ВЫБРАТЬ
    ДАТАВРЕМЯ(1, 1, 1) КАК Период
ПОМЕСТИТЬ Представления_Периоды
ГДЕ
    "НачалоИнтервала" = &ДатаНачалаСЗапасом
    И "ОкончаниеИнтервала" = &КонецПериода
    И "Периодичность" = "ДЕНЬ"
    И "ИспользоватьКонецПериода" = ЛОЖЬ
;


Секция "ГДЕ". Смущает, что выполняется сравнение параметра (например, ДатаНачалаСЗапасом) со строковым значением. Параметр в схеме имеет тип дата.

Это что, какой-то новый синтаксис языка запросов? Или я что-то подзабыл?
1 asady
 
08.05.15
11:09
(0) посмотри есть ли обработка текста запроса - типа контекстная замена
2 asady
 
08.05.15
11:09
(0) отчет озвучь
3 SleepyHead
 
гуру
08.05.15
11:12
Хм, похоже что да, в модуле объекта используется обработчик "ПриКомпоновкеРезультата", а далее идет обращения к общим модулям, которые обрабатывают текст запроса.

Посмотрел обработку текста запроса, выполняется поиск строки "ОбщиеЗарпросы_", такого в тексте запроса нет.
4 SleepyHead
 
гуру
08.05.15
11:13
(2) СтатистикаПерсонала
5 asady
 
08.05.15
11:39
(3) плохо смотрел

точка входа здесь:    ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(
        Новый Структура("СхемаКомпоновкиДанных", СхемаКомпоновки));


потом:
ЗаменитьПредставленияЗапросов(Объект);
->ЗаменитьЗапросыКПредставлениямВиртуальныхТаблиц(НаборДанных.Запрос, Объект.СхемаКомпоновкиДанных);
->Запрос = ЗарплатаКадрыОбщиеНаборыДанныхПовтИсп.ПолучитьЗапросПоПредставлению(ТекстЗапроса, СоответствиеПараметров);
-> чепочка вызовов общих модулей
->
Запрос = ЗарплатаКадрыОбщиеНаборыДанныхБазовый.ПолучитьЗапросПоПредст
авлению(ТекстЗапроса, СоответствиеПараметров);

и вот ОНО:

    Если ВРег(ИмяПредставления) = Врег("Периоды") Тогда
        
        НачалоИнтервала = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрЗапроса("НачалоИнтервала", ПараметрыЗапроса);
        ОкончаниеИнтервала = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрЗапроса("ОкончаниеИнтервала", ПараметрыЗапроса);
        
        Периодичность = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрЗапроса("Периодичность", ПараметрыЗапроса);
        Если Периодичность = Неопределено Тогда
            Периодичность = ВРег("Месяц");
        КонецЕсли;
        
        ИмяПоляПериод = "Период";
        
        ПредставлениеИспользоватьКонецПериода = ЗарплатаКадрыОбщиеНаборыДанных.ПараметрЗапроса("ИспользоватьКонецПериода", ПараметрыЗапроса);
        Если Периодичность = Неопределено Тогда
            ИспользоватьКонецПериода = Ложь;
        Иначе
            ИспользоватьКонецПериода = ВРег(ПредставлениеИспользоватьКонецПериода) = ВРег("Истина");
        КонецЕсли;
        
        Запрос = ЗарплатаКадрыОбщиеНаборыДанных.ЗапросВТПериоды(
            НачалоИнтервала,
            ОкончаниеИнтервала,
            Периодичность,
            ИмяПоляПериод,
            ИмяИсточникаДанных,
            ИспользоватьКонецПериода);
6 SleepyHead
 
гуру
08.05.15
11:41
Медленно я пока еще смотрю, но уже почти вышел на твое, спасибо :)

раскопал, где выполняются замены.
7 SleepyHead
 
гуру
08.05.15
11:41
Я только не дошел до твоей цитаты пока еще "ЗаменитьПредставленияЗапросов"
8 SleepyHead
 
гуру
08.05.15
11:43
Вот только смысла этой хитропопой конструкции я пока не понял, почему нельзя написать ВЫБРАТЬ РАЗРЕШЕННЫЕ, например?

С периодами тоже непонятно.
9 asady
 
08.05.15
11:48
(8) типо зачем писать одни и те же запросы везде - вынесли их в одно место, обработали только параметры - это как раз вполне логично и правильно.

начинаю уважать разработчиков типовых.
10 SleepyHead
 
гуру
08.05.15
11:49
(9) все правильно, но в эту систему нужно вникнуть, а я сегодня первый раз на нее нарвался.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой