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