|   |   | 
| 
 | Оптимизация запроса с вложенным условием объединения | ☑ | ||
|---|---|---|---|---|
| 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) Большое спасибо!     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |