Имя: Пароль:
1C
1С v8
Помогите разобрать запрос
,
0 Обработка
 
30.05.23
07:55
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СотрСДатами.ПодразделениеОрганизации,
    СотрСДатами.ДатаНачала,
    СотрСДатами.ДатаОкончания,
    Лимиты.Период КАК Период,
    МИНИМУМ(Лимиты.Период1) КАК Период1,
    Лимиты.Прекратить
ПОМЕСТИТЬ ЛимитыБезСумм
ИЗ
    (ВЫБРАТЬ
        Лимиты.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
        Лимиты.Лимит КАК Лимит,
        Лимиты.Период КАК Период,
        ВЫБОР
            КОГДА ЕСТЬNULL(Лимит1.Период, &ДатаКон) = &ДатаКон
                ТОГДА &ДатаКон
            ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Лимит1.Период, ДЕНЬ, -1), ДЕНЬ)
        КОНЕЦ КАК Период1,
        Лимиты.Прекратить КАК Прекратить
    ИЗ
        (ВЫБРАТЬ
            РСДопНачСП.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
            РСДопНачСП.Лимит КАК Лимит,
            &ДатаНач КАК Период,
            РСДопНачСП.Прекратить КАК Прекратить
        ИЗ
            РегистрСведений.MCC_ДополнительныеНачисления.СрезПоследних(&ДатаНач, ) КАК РСДопНачСП
        ГДЕ
            РСДопНачСП.Сотрудник = &ПустойСотр
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            РСДопНач.ПодразделениеОрганизации,
            РСДопНач.Лимит,
            РСДопНач.Период,
            РСДопНач.Прекратить
        ИЗ
            РегистрСведений.MCC_ДополнительныеНачисления КАК РСДопНач
        ГДЕ
            РСДопНач.Период МЕЖДУ &ДатаНач И &ДатаКон
            И РСДопНач.Сотрудник = &ПустойСотр) КАК Лимиты
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                Лимиты.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                Лимиты.Лимит КАК Лимит,
                Лимиты.Период КАК Период,
                Лимиты.Прекратить КАК Прекратить
            ИЗ
                (ВЫБРАТЬ
                    РСДопНачСП.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                    РСДопНачСП.Лимит КАК Лимит,
                    &ДатаНач КАК Период,
                    РСДопНачСП.Прекратить КАК Прекратить
                ИЗ
                    РегистрСведений.MCC_ДополнительныеНачисления.СрезПоследних(&ДатаНач, ) КАК РСДопНачСП
                ГДЕ
                    РСДопНачСП.Сотрудник = &ПустойСотр
                
                ОБЪЕДИНИТЬ ВСЕ
                
                ВЫБРАТЬ
                    РСДопНач.ПодразделениеОрганизации,
                    РСДопНач.Лимит,
                    РСДопНач.Период,
                    РСДопНач.Прекратить
                ИЗ
                    РегистрСведений.MCC_ДополнительныеНачисления КАК РСДопНач
                ГДЕ
                    РСДопНач.Период МЕЖДУ &ДатаНач И &ДатаКон
                    И РСДопНач.Сотрудник = &ПустойСотр) КАК Лимиты) КАК Лимит1
            ПО
                Лимиты.ПодразделениеОрганизации = Лимит1.ПодразделениеОрганизации
                И Лимиты.Период < Лимит1.Период) КАК Лимиты
                
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СотрСДатами КАК СотрСДатами
        ПО Лимиты.ПодразделениеОрганизации = СотрСДатами.ПодразделениеОрганизации

СГРУППИРОВАТЬ ПО
    СотрСДатами.ДатаОкончания,
    СотрСДатами.ПодразделениеОрганизации,
    Лимиты.Период,
    СотрСДатами.ДатаНачала,
    Лимиты.Прекратить
;
1 Обработка
 
30.05.23
07:56
Помогите разобрать этот запрос.
Хочу переименовать одинаковые имена на разных уровнях.
После переделать запрос. Вероятно будет  у меня ВТ вместо вложенных.
2 Обработка
 
30.05.23
07:57
Специально упросил запрос сохраняя общую структуру удаляя лишние реквизиты.
3 Bigbro
 
30.05.23
08:02
а что не так
маленький запросик,
работает?
не трожь)
4 Обработка
 
30.05.23
08:03
Хочу разобрать "КАК Лимиты"
и переделать их в "КАК Лимиты0", "КАК Лимиты1" и "КАК Лимиты2" итп.
5 Обработка
 
30.05.23
08:05
(3) Это кусочек из запроса состоящий из 900 строк!
Я полностью переделываю и дорабатываю потому что в нем есть ошибка и недочеты.
6 Мимохожий Однако
 
30.05.23
08:26
Добавь в объединение запрос
.............
ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            РСДопНач.ПодразделениеОрганизации,
            РСДопНач.Лимит,
            РСДопНач.Период,
            РСДопНач.Прекратить
        ИЗ
            РегистрСведений.MCC_ДополнительныеНачисления КАК РСДопНач0
        ГДЕ
            РСДопНач.Период МЕЖДУ &ДатаНач И &ДатаКон
            И РСДопНач.Сотрудник = &ПустойСотр) КАК Лимиты0
..........
и т.д.
7 ADirks
 
30.05.23
09:05
(0) Если текст запроса оформить слегка по-другому, то он легче воспринимается
я бы сделал так

ВЫБРАТЬ
    СотрСДатами.ПодразделениеОрганизации,
    СотрСДатами.ДатаНачала,
    СотрСДатами.ДатаОкончания,
    Лимиты.Период КАК Период,
    МИНИМУМ(Лимиты.Период1) КАК Период1,
    Лимиты.Прекратить
ПОМЕСТИТЬ ЛимитыБезСумм
ИЗ
    (
    ВЫБРАТЬ
        Лимиты.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
        Лимиты.Лимит КАК Лимит,
        Лимиты.Период КАК Период,
        ВЫБОР
            КОГДА ЕСТЬNULL(Лимит1.Период, &ДатаКон) = &ДатаКон
                ТОГДА &ДатаКон
            ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Лимит1.Период, ДЕНЬ, -1), ДЕНЬ)
        КОНЕЦ КАК Период1,
        Лимиты.Прекратить КАК Прекратить
    ИЗ
        (
            ВЫБРАТЬ
                РСДопНачСП.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                РСДопНачСП.Лимит КАК Лимит,
                &ДатаНач КАК Период,
                РСДопНачСП.Прекратить КАК Прекратить
            ИЗ
                РегистрСведений.MCC_ДополнительныеНачисления.СрезПоследних(&ДатаНач, ) КАК РСДопНачСП
            ГДЕ
                РСДопНачСП.Сотрудник = &ПустойСотр
            
            ОБЪЕДИНИТЬ ВСЕ
            
            ВЫБРАТЬ
                РСДопНач.ПодразделениеОрганизации,
                РСДопНач.Лимит,
                РСДопНач.Период,
                РСДопНач.Прекратить
            ИЗ
                РегистрСведений.MCC_ДополнительныеНачисления КАК РСДопНач
            ГДЕ
                РСДопНач.Период МЕЖДУ &ДатаНач И &ДатаКон
                И РСДопНач.Сотрудник = &ПустойСотр
        ) КАК Лимиты
        
        ЛЕВОЕ СОЕДИНЕНИЕ
        (
            ВЫБРАТЬ
                Лимиты.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                Лимиты.Лимит КАК Лимит,
                Лимиты.Период КАК Период,
                Лимиты.Прекратить КАК Прекратить
            ИЗ
                (
                    ВЫБРАТЬ
                        РСДопНачСП.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                        РСДопНачСП.Лимит КАК Лимит,
                        &ДатаНач КАК Период,
                        РСДопНачСП.Прекратить КАК Прекратить
                    ИЗ
                        РегистрСведений.MCC_ДополнительныеНачисления.СрезПоследних(&ДатаНач, ) КАК РСДопНачСП
                    ГДЕ
                        РСДопНачСП.Сотрудник = &ПустойСотр
                    
                    ОБЪЕДИНИТЬ ВСЕ
                    
                    ВЫБРАТЬ
                        РСДопНач.ПодразделениеОрганизации,
                        РСДопНач.Лимит,
                        РСДопНач.Период,
                        РСДопНач.Прекратить
                    ИЗ
                        РегистрСведений.MCC_ДополнительныеНачисления КАК РСДопНач
                    ГДЕ
                        РСДопНач.Период МЕЖДУ &ДатаНач И &ДатаКон
                        И РСДопНач.Сотрудник = &ПустойСотр
                ) КАК Лимиты
        ) КАК Лимит1 ПО
            Лимиты.ПодразделениеОрганизации = Лимит1.ПодразделениеОрганизации
            И Лимиты.Период < Лимит1.Период
    ) КАК Лимиты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СотрСДатами КАК СотрСДатами
        ПО Лимиты.ПодразделениеОрганизации = СотрСДатами.ПодразделениеОрганизации

СГРУППИРОВАТЬ ПО
    СотрСДатами.ДатаОкончания,
    СотрСДатами.ПодразделениеОрганизации,
    Лимиты.Период,
    СотрСДатами.ДатаНачала,
    Лимиты.Прекратить
;
8 Галахад
 
гуру
30.05.23
09:11
(0) Ну да, такой себе запрос... Попей кофе съешь печеньку. Сядь да перепеши.
9 SleepyHead
 
гуру
30.05.23
09:23
(5) Иногда проще переписать заново. Лишние детали выкинуть. За счет временных таблиц может получиться сокращение строк.
10 Bigbro
 
30.05.23
09:35
ну если есть ошибка, надо разбираться конечно.
иногда бывает выбрасываешь все  что написано садишься делать заново.
пишешь вроде все просто и красиво, потом один нюанс, второй, потом при тестировании оказывается что в данных не все так гладко как думалось
добавляем еще костыль, еще один.
смотрим на результат - а получилось в целом все то же что было изначально.
из плюсов - теперь ты понимаешь почему написано именно так )))
11 Обработка
 
30.05.23
09:40
Вроде как разобрался со структурой.
12 Обработка
 
30.05.23
09:40
ВЫБРАТЬ
    СотрСДатами.ПодразделениеОрганизации,
    СотрСДатами.ДатаНачала,
    СотрСДатами.ДатаОкончания,
    Лимиты3.Период КАК Период,
    МИНИМУМ(Лимиты3.Период1) КАК Период1,
    Лимиты3.Прекратить
ПОМЕСТИТЬ ЛимитыБезСумм
ИЗ
    (ВЫБРАТЬ
        Лимиты2.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
        Лимиты2.СуммаЛимита КАК СуммаЛимита,
        Лимиты2.Период КАК Период,
        ВЫБОР
            КОГДА ЕСТЬNULL(Лимит1.Период, &ДатаКон) = &ДатаКон
                ТОГДА &ДатаКон
            ИНАЧЕ КОНЕЦПЕРИОДА(ДОБАВИТЬКДАТЕ(Лимит1.Период, ДЕНЬ, -1), ДЕНЬ)
        КОНЕЦ КАК Период1,
        Лимиты2.Прекратить КАК Прекратить
    ИЗ
        (ВЫБРАТЬ
            РСДопНачСП.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
            РСДопНачСП.Лимит КАК СуммаЛимита,
            &ДатаНач КАК Период,
            РСДопНачСП.Прекратить КАК Прекратить
        ИЗ
            РегистрСведений.MCC_ДополнительныеНачисления.СрезПоследних(&ДатаНач, ) КАК РСДопНачСП
        ГДЕ
            РСДопНачСП.Сотрудник = &ПустойСотр
        
        ОБЪЕДИНИТЬ ВСЕ
        
        ВЫБРАТЬ
            РСДопНач.ПодразделениеОрганизации,
            РСДопНач.Лимит,
            РСДопНач.Период,
            РСДопНач.Прекратить
        ИЗ
            РегистрСведений.MCC_ДополнительныеНачисления КАК РСДопНач
        ГДЕ
            РСДопНач.Период МЕЖДУ &ДатаНач И &ДатаКон
            И РСДопНач.Сотрудник = &ПустойСотр) КАК Лимиты2
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                Лимиты0.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                Лимиты0.СуммаЛимита КАК СуммаЛимита,
                Лимиты0.Период КАК Период,
                Лимиты0.Прекратить КАК Прекратить
            ИЗ
                (ВЫБРАТЬ
                    РСДопНачСП.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
                    РСДопНачСП.Лимит КАК СуммаЛимита,
                    &ДатаНач КАК Период,
                    РСДопНачСП.Прекратить КАК Прекратить
                ИЗ
                    РегистрСведений.MCC_ДополнительныеНачисления.СрезПоследних(&ДатаНач, ) КАК РСДопНачСП
                ГДЕ
                    РСДопНачСП.Сотрудник = &ПустойСотр
                
                ОБЪЕДИНИТЬ ВСЕ
                
                ВЫБРАТЬ
                    РСДопНач.ПодразделениеОрганизации,
                    РСДопНач.Лимит,
                    РСДопНач.Период,
                    РСДопНач.Прекратить
                ИЗ
                    РегистрСведений.MCC_ДополнительныеНачисления КАК РСДопНач
                ГДЕ
                    РСДопНач.Период МЕЖДУ &ДатаНач И &ДатаКон
                    И РСДопНач.Сотрудник = &ПустойСотр) КАК Лимиты0) КАК Лимит1
            ПО Лимиты2.ПодразделениеОрганизации = Лимит1.ПодразделениеОрганизации
                И Лимиты2.Период < Лимит1.Период) КАК Лимиты3
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ СотрСДатами КАК СотрСДатами
        ПО Лимиты3.ПодразделениеОрганизации = СотрСДатами.ПодразделениеОрганизации

СГРУППИРОВАТЬ ПО
    СотрСДатами.ДатаОкончания,
    СотрСДатами.ПодразделениеОрганизации,
    Лимиты3.Период,
    СотрСДатами.ДатаНачала,
    Лимиты3.Прекратить
13 Обработка
 
30.05.23
09:41
Зачем моему предшественнику пришло в голову вложенные запросы обзывать одним и тем же именем "Лимиты"?
Ведь сам же потом не распутает это?
14 Обработка
 
30.05.23
09:43
Я не люблю вложенные тем боле если надо вложенные повторять.
И если уровень вложенности три и более.
Да и данных там не много.
Лучше ВТ.
Во вторых читабельно.
А еще вот так обзывать  их. Это сверх беспечности.
15 Fish
 
30.05.23
10:07
(14) Лимиты - Прекратить!  Это же прекрасно :)
16 Обработка
 
30.05.23
10:11
(15) Назвать реквизиты РС логично и нормально это другая беда...
Об этом уже молчу.
17 Прапорщик
 
30.05.23
10:17
А чем вложенный запрос Лимиты0 отличается от Лимиты2?
Сравнение текстов этих двух вложенных запросов говорит, что "Файлы идентичны".
18 Обработка
 
30.05.23
10:32
(17) Там в запросе из 900 строк очень много повторений.
Вот я для начала хоть структуру разбираю потом уже оптимизирую.
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.