Имя: Пароль:
1C
 
Прошу критично выругаться, оценить рабочий запрос
0 sintez1234
 
09.09.14
19:24
Учусь писать большие запросы, задачи есть. Ниже полностью рабочий запрос, но уверен что многое сделано криво. Прошу поругать, покритиковать, поумничать, как можно было бы сделать крисивее или оптимательнее, что на что поменять. Это запрос для СКД без форм.

ВЫБРАТЬ
    ЗапросФакт.Подразделение,
    ЗапросФакт.Дата,
    НАЧАЛОПЕРИОДА(ЗапросФакт.Дата, МЕСЯЦ) КАК ПериодМесяц,
    ЗапросФакт.Дата КАК ДеньНедели,
    ЕСТЬNULL(ЗапросПлан.Вес, 0) КАК ВесДня,
    ЗапросСравнениеФакт.ДатаСравнения КАК ДатаПериодаСравнения,
    ЗапросСравнениеФакт.ДатаСравнения КАК ДеньНеделиСравнения,
    ЕСТЬNULL(ЗапросПлан.Сумма, 0) КАК ПланВыручка,
    ЕСТЬNULL(ЗапросФакт.Сумма, 0) КАК ФактВыручка,
    ЕСТЬNULL(ЗапросСравнениеФакт.Сумма, 0) КАК ФактВыручкаПериодаСравнения,
    ЕСТЬNULL(ЗапросДопТовары.Сумма, 0) КАК ФактДоп,
    ЕСТЬNULL(ЗапросПосетители.Количество, 0) КАК Посетители,
    ВЫРАЗИТЬ(ЕСТЬNULL(ЗапросЧеки.Количество, 0) - ЕСТЬNULL(ЗапросВозвраты.Количество, 0) КАК ЧИСЛО(15, 0)) КАК Чеки,
    ВЫБОР
        КОГДА ЕСТЬNULL(ЗапросЧеки.Количество, 0) > 0
            ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ЗапросКрос.СтрокВЧеке, 0) / ЗапросЧеки.Количество КАК ЧИСЛО(15, 2))
        ИНАЧЕ 0
    КОНЕЦ КАК Кроссовость,
    ВЫБОР
        КОГДА ЕСТЬNULL(ЗапросПосетители.Количество, 0) > 0
            ТОГДА (ВЫРАЗИТЬ(ЕСТЬNULL(ЗапросЧеки.Количество, 0) / ЗапросПосетители.Количество КАК ЧИСЛО(15, 2))) * 100
        ИНАЧЕ 0
    КОНЕЦ КАК КПД,
    ВЫБОР
        КОГДА ЕСТЬNULL(ЗапросСравнениеФакт.Сумма, 0) > 0
            ТОГДА ВЫРАЗИТЬ((ЕСТЬNULL(ЗапросФакт.Сумма, 0) / ЗапросСравнениеФакт.Сумма - 1) * 100 КАК ЧИСЛО(15, 2))
        ИНАЧЕ 0
    КОНЕЦ КАК Прирост
ИЗ
    (ВЫБРАТЬ
        НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК Дата,
        Продажи.Подразделение КАК Подразделение,
        СУММА(Продажи.СуммаВыручки) КАК Сумма
    ИЗ
        РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Продажи
    ГДЕ
        НЕ Продажи.Период < &НачДата
        И НЕ Продажи.Период > &КонДата
    
    СГРУППИРОВАТЬ ПО
        НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ),
        Продажи.Подразделение) КАК ЗапросФакт
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ), ДЕНЬ, &КоличествоДней) КАК Дата,
            НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК ДатаСравнения,
            Продажи.Подразделение КАК Подразделение,
            СУММА(Продажи.СуммаВыручки) КАК Сумма
        ИЗ
            РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Продажи
        ГДЕ
            НЕ Продажи.Период < &СравнениеНачДата
            И НЕ Продажи.Период > &СравнениеКонДата
        
        СГРУППИРОВАТЬ ПО
            ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ), ДЕНЬ, &КоличествоДней),
            НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ),
            Продажи.Подразделение) КАК ЗапросСравнениеФакт
        ПО ЗапросФакт.Дата = ЗапросСравнениеФакт.Дата
            И ЗапросФакт.Подразделение = ЗапросСравнениеФакт.Подразделение
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            НАЧАЛОПЕРИОДА(Продажи.Период, ДЕНЬ) КАК Дата,
            Продажи.Подразделение КАК Подразделение,
            СУММА(Продажи.СуммаВыручки) КАК Сумма
        ИЗ
            РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Продажи
                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК ДопРеквизиты
                ПО Продажи.АналитикаУчетаНоменклатуры.Номенклатура = ДопРеквизиты.Ссылка
                    И (ДопРеквизиты.Свойство = &ДопТовар)
                    И (ДопРеквизиты.Значение = ИСТИНА)
        ГДЕ
            НЕ Продажи.Период < &НачДата
            И НЕ Продажи.Период > &КонДата
        
        СГРУППИРОВАТЬ ПО
            Продажи.Период,
            Продажи.Подразделение) КАК ЗапросДопТовары
        ПО ЗапросФакт.Дата = ЗапросДопТовары.Дата
            И ЗапросФакт.Подразделение = ЗапросДопТовары.Подразделение
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            НАЧАЛОПЕРИОДА(Планы.Период, ДЕНЬ) КАК Дата,
            Планы.Подразделение КАК Подразделение,
            Планы.КоэффициентСезонности КАК Вес,
            Планы.Сумма КАК Сумма
        ИЗ
            РегистрНакопления.дпПланыПродаж КАК Планы
        ГДЕ
            НЕ НАЧАЛОПЕРИОДА(Планы.Период, ДЕНЬ) > &КонДата
            И НЕ НАЧАЛОПЕРИОДА(Планы.Период, ДЕНЬ) < &НачДата) КАК ЗапросПлан
        ПО ЗапросФакт.Дата = ЗапросПлан.Дата
            И ЗапросФакт.Подразделение = ЗапросПлан.Подразделение
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            Посетители.Период КАК Дата,
            Посетители.Магазин КАК Подразделение,
            Посетители.КоличествоПосетителей КАК Количество
        ИЗ
            РегистрСведений.дпПосетители КАК Посетители
        ГДЕ
            НЕ НАЧАЛОПЕРИОДА(Посетители.Период, ДЕНЬ) < &НачДата
            И НЕ НАЧАЛОПЕРИОДА(Посетители.Период, ДЕНЬ) > &КонДата) КАК ЗапросПосетители
        ПО ЗапросФакт.Дата = ЗапросПосетители.Дата
            И ЗапросФакт.Подразделение = ЗапросПосетители.Подразделение
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            НАЧАЛОПЕРИОДА(Чеки.Дата, ДЕНЬ) КАК Дата,
            Чеки.КассаККМ.Подразделение КАК Подразделение,
            КОЛИЧЕСТВО(Чеки.Ссылка) КАК Количество
        ИЗ
            Документ.ЧекККМ КАК Чеки
        ГДЕ
            НЕ НАЧАЛОПЕРИОДА(Чеки.Дата, ДЕНЬ) < &НачДата
            И НЕ НАЧАЛОПЕРИОДА(Чеки.Дата, ДЕНЬ) > &КонДата
            И Чеки.Ссылка.Проведен = ИСТИНА
        
        СГРУППИРОВАТЬ ПО
            НАЧАЛОПЕРИОДА(Чеки.Дата, ДЕНЬ),
            Чеки.КассаККМ.Подразделение) КАК ЗапросЧеки
        ПО ЗапросФакт.Дата = ЗапросЧеки.Дата
            И ЗапросФакт.Подразделение = ЗапросЧеки.Подразделение
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            НАЧАЛОПЕРИОДА(Возвраты.Дата, ДЕНЬ) КАК Дата,
            Возвраты.КассаККМ.Подразделение КАК Подразделение,
            КОЛИЧЕСТВО(Возвраты.Ссылка) КАК Количество
        ИЗ
            Документ.ЧекККМВозврат КАК Возвраты
        ГДЕ
            НЕ НАЧАЛОПЕРИОДА(Возвраты.Дата, ДЕНЬ) < &НачДата
            И НЕ НАЧАЛОПЕРИОДА(Возвраты.Дата, ДЕНЬ) > &КонДата
            И Возвраты.Ссылка.Проведен = ИСТИНА
        
        СГРУППИРОВАТЬ ПО
            НАЧАЛОПЕРИОДА(Возвраты.Дата, ДЕНЬ),
            Возвраты.КассаККМ.Подразделение) КАК ЗапросВозвраты
        ПО ЗапросФакт.Дата = ЗапросВозвраты.Дата
            И ЗапросФакт.Подразделение = ЗапросВозвраты.Подразделение
        ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
            НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) КАК Дата,
            Товары.Ссылка.КассаККМ.Подразделение КАК Подразделение,
            КОЛИЧЕСТВО(Товары.Номенклатура) КАК СтрокВЧеке
        ИЗ
            Документ.ЧекККМ.Товары КАК Товары
        ГДЕ
            НЕ НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) < &НачДата
            И НЕ НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ) > &КонДата
            И Товары.Ссылка.Проведен = ИСТИНА
        
        СГРУППИРОВАТЬ ПО
            НАЧАЛОПЕРИОДА(Товары.Ссылка.Дата, ДЕНЬ),
            Товары.Ссылка.КассаККМ.Подразделение) КАК ЗапросКрос
        ПО ЗапросФакт.Дата = ЗапросКрос.Дата
            И ЗапросФакт.Подразделение = ЗапросКрос.Подразделение
ГДЕ
    НЕ ЗапросФакт.Подразделение = ЗНАЧЕНИЕ(Справочник.СтруктураПредприятия.ПустаяСсылка)
    И ЗапросФакт.Подразделение В(&Подразделения)

УПОРЯДОЧИТЬ ПО
    ЗапросФакт.Подразделение,
    ЗапросФакт.Дата
1 sintez1234
 
09.09.14
19:26
я думаю что запрос по возвратам и по чекам можно было бы как-то объединить в один. А нужно ли?
2 roman52
 
09.09.14
19:48
для начала избавься от вложенных запросов, запость сюда
потом посмотрим..
3 0xFFFFFF
 
09.09.14
19:55
СУММА(Продажи.СуммаВыручки) КАК Сумма
        ИЗ
            РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК Продажи
4 0xFFFFFF
 
09.09.14
19:55
про виртуальные таблицы слыхал?
5 ShoGUN
 
09.09.14
19:56
Задачу озвучьте, я вижу кучу джоинов регистра с собой самим, с непонятной целью.
6 bolobol
 
09.09.14
20:31
Цель: написать большой запрос и править всем форумом)
Не проще ли озвучить задачу и решить её сразу правильно, а не разбирать анализы неизвестного прога?
7 Новенький_2009
 
09.09.14
20:41
А мне понравился запрос. Длинный, красивый, нипонятный. Но до моего рекорда пока далеко. Я когда учился, один раз запрос на 3,5 тыщи строк кода конструктором нарисовал, правда от автора отличался тем, что я вообще не знал, что регистры - есть :)

А так, ТС, молодец! С возрастом твои запросы будут все меньше и меньше. Когда дойдешь до уровня просветленного Гуру, то твой запрос, априори будет выглядеть так:

Выбрать * Из *
8 hhhh
 
09.09.14
22:44
(6) запрос вроде мизерный. Даже до 100 строк не дотягивает.
9 КонецЦикла
 
10.09.14
01:40
(7) дроп датабазе - вот просветление где
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой