Имя: Пароль:
1C
1С v8
Оптимизация запроса с вложенным условием объединения
0 denya_novichek
 
17.07.20
10:35
Уважаемые коллеги, подскажите пожалуйста оптимизацию запроса в части условия ЛЕВОЕ СОЕДИНЕНИЕ:
ПО (ВЫБОР
    КОГДА (НЕ Взаиморасчеты.ДокументРасчетовСКонтрагентом ЕСТЬ NULL )
        ТОГДА Взаиморасчеты.ДокументРасчетовСКонтрагентом = СведенияДокументов.Документ
            ИНАЧЕ ВЫБОР
                КОГДА (НЕ Взаиморасчеты.Сделка ЕСТЬ NULL )
                    ТОГДА Взаиморасчеты.Сделка = СведенияДокументов.Документ
                ИНАЧЕ Взаиморасчеты.ДокументРасчетовСКонтрагентом = СведенияДокументов.Документ
                    И Взаиморасчеты.Сделка = СведенияДокументов.Документ
            КОНЕЦ
    КОНЕЦ)
То, как написано вешает базу на несколько часов. Весь запрос:

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

ИНДЕКСИРОВАТЬ ПО
    Документ

;

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

СГРУППИРОВАТЬ ПО
    ВзаиморасчетыБезГруппировки.Организация,
    ВзаиморасчетыБезГруппировки.Контрагент,
    ВзаиморасчетыБезГруппировки.ДоговорКонтрагента,
    ВзаиморасчетыБезГруппировки.Сделка,
    ВзаиморасчетыБезГруппировки.ДокументРасчетовСКонтрагентом,
    ВзаиморасчетыБезГруппировки.ДоговорКонтрагента.ВалютаВзаиморасчетов,
    ЕСТЬNULL(ВзаиморасчетыБезГруппировки.ТорговаяТочка, ЗНАЧЕНИЕ(Справочник.кпкТорговыеТочки.ПустаяСсылка))

ИНДЕКСИРОВАТЬ ПО
    ДокументРасчетовСКонтрагентом,
    Сделка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Взаиморасчеты.Организация КАК Организация,
    Взаиморасчеты.Контрагент КАК Контрагент,
    Взаиморасчеты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    Взаиморасчеты.Сделка КАК Сделка,
    Взаиморасчеты.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом,
    Взаиморасчеты.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов,
    Взаиморасчеты.СуммаВзаиморасчетовОстаток КАК СуммаВзаиморасчетовОстаток,
    СведенияДокументов.Категория,
    СведенияДокументов.КатегорияДляДолга,
    Взаиморасчеты.ТорговаяТочка КАК ТорговаяТочка
ИЗ
    Взаиморасчеты КАК Взаиморасчеты
        ЛЕВОЕ СОЕДИНЕНИЕ СведенияДокументов КАК СведенияДокументов
        *******ПО (ВЫБОР
                КОГДА (НЕ Взаиморасчеты.ДокументРасчетовСКонтрагентом ЕСТЬ NULL )
                    ТОГДА Взаиморасчеты.ДокументРасчетовСКонтрагентом = СведенияДокументов.Документ
                ИНАЧЕ ВЫБОР
                        КОГДА (НЕ Взаиморасчеты.Сделка ЕСТЬ NULL )
                            ТОГДА Взаиморасчеты.Сделка = СведенияДокументов.Документ
                        ИНАЧЕ Взаиморасчеты.ДокументРасчетовСКонтрагентом = СведенияДокументов.Документ
                            И Взаиморасчеты.Сделка = СведенияДокументов.Документ
                    КОНЕЦ
            КОНЕЦ)*******
ГДЕ
    Взаиморасчеты.СуммаВзаиморасчетовОстаток > 0
    И ВЫБОР
            КОГДА (НЕ &ВыбАгент = ЗНАЧЕНИЕ(Справочник.ФизическиеЛица.ПустаяСсылка))
                ТОГДА СведенияДокументов.Агент = &ВыбАгент
            ИНАЧЕ ИСТИНА
        КОНЕЦ

УПОРЯДОЧИТЬ ПО
    Взаиморасчеты.Контрагент.Наименование
ИТОГИ
    СУММА(СуммаВзаиморасчетовОстаток),
    МИНИМУМ(ТорговаяТочка)
ПО
    Организация,
    Контрагент,
    ДоговорКонтрагента,
    ДокументРасчетовСКонтрагентом
1 Ненавижу 1С
 
гуру
17.07.20
10:55
ПО ЕСТЬNULL(Взаиморасчеты.ДокументРасчетовСКонтрагентом = СведенияДокументов.Документ,Взаиморасчеты.Сделка = СведенияДокументов.Документ)

или даже так:

ПО ЕСТЬNULL(Взаиморасчеты.ДокументРасчетовСКонтрагентом,Взаиморасчеты.Сделка) = СведенияДокументов.Документ

еще лучше сделать во временной таблице поле
ЕСТЬNULL(Взаиморасчеты.ДокументРасчетовСКонтрагентом,Взаиморасчеты.Сделка) КАК ДокументСоединения

и соединяться по нему:

ПО Взаиморасчеты.ДокументСоединения = СведенияДокументов.Документ
2 denya_novichek
 
17.07.20
11:54
(1) Большое спасибо!
2 + 2 = 3.9999999999999999999999999999999...