УТ11, оптимизация запроса

1. triviumfan 93 20.09.18 09:49 Сейчас в теме
Доброго дня, коллеги.

Случайно наткнулся на такой казус - создаю ПКО на основании РТУ и жду порядка 15 секунд (и это в "разогретом" состоянии, с 5-7 раза). Думаю, эх, наверно опять рукоблуды подписку на обработкузаполнения() запилили, смотрю - а вот и нет. Включаю замеры от заполнения до открытия формы и обнаруживаю типовой запрос, уж очень с виду подозрительный. Выполняется 12с.
Вот он, негодяй (ВзаиморасчетыСервер.ЗаполнитьРасшифровкуПлатежаПоЗаказуКлиента()):
ВЫБРАТЬ
	РасчетыСКлиентами.ЗаказКлиента КАК ОснованиеПлатежа,
	РасчетыСКлиентами.ЗаказКлиента КАК Заказ,
	Аналитика.Партнер КАК Партнер,
	РасчетыСКлиентами.ЗаказКлиента.Соглашение КАК Соглашение,
	ВЫБОР
		КОГДА ЕСТЬNULL(РасчетыСКлиентами.ЗаказКлиента.Договор.СтатьяДвиженияДенежныхСредств, ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПустаяСсылка)) = ЗНАЧЕНИЕ(Справочник.СтатьиДвиженияДенежныхСредств.ПустаяСсылка)
			ТОГДА ВЫРАЗИТЬ(РасчетыСКлиентами.ЗаказКлиента.Соглашение КАК Справочник.СоглашенияСКлиентами).СтатьяДвиженияДенежныхСредств
		ИНАЧЕ РасчетыСКлиентами.ЗаказКлиента.Договор.СтатьяДвиженияДенежныхСредств
	КОНЕЦ КАК СтатьяДвиженияДенежныхСредств,
	РасчетыСКлиентами.Период КАК Период,
	РасчетыСКлиентами.Валюта КАК ВалютаВзаиморасчетов,
	РасчетыСКлиентами.ФормаОплаты КАК ФормаОплаты,
	РасчетыСКлиентами.КОплате КАК СуммаПоГрафику,
	ЕСТЬNULL(РасчетыСКлиентамиОбороты.КОплатеРасход, 0) + ЕСТЬNULL(РасчетыСКлиентамиОбороты.ОплачиваетсяОборот, 0) КАК СуммаОплаты
ИЗ
	РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКлиентами.Обороты(, , Период, ) КАК РасчетыСКлиентамиОбороты
		ПО РасчетыСКлиентами.ЗаказКлиента = РасчетыСКлиентамиОбороты.ЗаказКлиента
			И РасчетыСКлиентами.Валюта = РасчетыСКлиентамиОбороты.Валюта
			И РасчетыСКлиентами.АналитикаУчетаПоПартнерам = РасчетыСКлиентамиОбороты.АналитикаУчетаПоПартнерам
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК Аналитика
		ПО РасчетыСКлиентами.АналитикаУчетаПоПартнерам = Аналитика.КлючАналитики
			И (&Организация = Аналитика.Организация
				ИЛИ &Организация = НЕОПРЕДЕЛЕНО)
ГДЕ
	РасчетыСКлиентами.Активность
	И РасчетыСКлиентами.ЗаказКлиента В(&ЗаказКлиента)
	И РасчетыСКлиентами.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
	И РасчетыСКлиентами.КОплате > 0

УПОРЯДОЧИТЬ ПО
	РасчетыСКлиентами.Период,
	РасчетыСКлиентами.НомерСтроки
ИТОГИ ПО
	ОснованиеПлатежа
Показать

В последней редакции (11.4.5.86) он не изменился.
В качестве параметров - массив ЗК из ТЧ Товаров РТУ, а также Организация = Неопределено.

Думаю, дай его в ms ssms прогоню - результат на скриншоте. 12.7% ради индекса... не, бессмысленно. План слишком сложный...
Думаю, что нужно менять запрос. Подскажите, куда копать?
Прикрепленные файлы:
План выполнения.xml
По теме из базы знаний
Найденные решения
3. Sashares 34 20.09.18 10:16 Сейчас в теме
(2) А если так - сначала выбрать записи из регистра по условию во временную таблицу и только потом соединяться со всеми остальными регистрами?

ВЫБРАТЬ
    РасчетыСКлиентами.ЗаказКлиента,
    РасчетыСКлиентами.Период,
    РасчетыСКлиентами.Валюта,
    РасчетыСКлиентами.ФормаОплаты ,
     РасчетыСКлиентами.АналитикаУчетаПоПартнерам ,
    РасчетыСКлиентами.КОплате
Поместить ТаблицаРС
ИЗ
    РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
ГДЕ
    РасчетыСКлиентами.Активность
    И РасчетыСКлиентами.ЗаказКлиента В(&ЗаказКлиента)
    И РасчетыСКлиентами.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
;

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

УПОРЯДОЧИТЬ ПО
    РасчетыСКлиентами.Период,
    РасчетыСКлиентами.НомерСтроки
ИТОГИ ПО
    ОснованиеПлатежа
Показать
triviumfan; alex-l19041; +2 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. triviumfan 93 20.09.18 09:55 Сейчас в теме
Забыл sql запрос добавить.
exec sp_executesql N'SEL ECT
T1._Fld16102_TYPE,
T1._Fld16102_RTRef,
T1._Fld16102_RRRef,
T1._Fld16102_TYPE,
T1._Fld16102_RTRef,
T1._Fld16102_RRRef,
T4._Fld13473RRef,
CASE WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000117 THEN CASE WHEN T5._Fld7226RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000144 THEN CASE WHEN T6._Fld9355RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000129 THEN CASE WHEN T7._Fld8291RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000146 THEN CASE WHEN T8._Fld9507RRef IS NOT NULL THEN 0x000000DC END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000167 THEN CASE WHEN T9._Fld11212RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000166 THEN CASE WHEN T10._Fld11064RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000011B THEN CASE WHEN T11._Fld7514RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000010C THEN CASE WHEN T12._Fld6468RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000145 THEN CASE WHEN T13._Fld9448RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000121 THEN CASE WHEN T14._Fld7823RRef IS NOT NULL THEN 0x000000DA END ELSE CAST(NULL AS BINARY(4)) END,
CASE WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000117 THEN T5._Fld7226RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000144 THEN T6._Fld9355RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000129 THEN T7._Fld8291RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000146 THEN T8._Fld9507RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000167 THEN T9._Fld11212RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000166 THEN T10._Fld11064RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000011B THEN T11._Fld7514RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000010C THEN T12._Fld6468RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000145 THEN T13._Fld9448RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000121 THEN T14._Fld7823RRef ELSE CAST(NULL AS BINARY(16)) END,
CASE WHEN (ISNULL(CASE WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000117 THEN T15._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000144 THEN T16._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000149 
THEN T18._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000129 THEN T19._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000146 THEN T20._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000167 
THEN T21._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000166 THEN T22._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00005AB0 THEN T24._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000011B 
THEN T25._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000010C THEN T26._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000116 THEN T28._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000145 THEN T29._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000014B THEN T31._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000121 THEN T32._Fld17283RRef ELSE CAST(NULL AS BINARY(16)) END,@P1) = @P2) THEN T33._Fld17299RRef ELSE CASE WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000117 THEN T15._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000144 THEN T16._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000149 THEN T18._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000129 THEN T19._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000146 THEN T20._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000167 THEN T21._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000166 THEN T22._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00005AB0 THEN T24._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000011B THEN T25._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000010C THEN T26._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000116 THEN T28._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000145 THEN T29._Fld17283RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000014B THEN T31._Fld29327RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000121 THEN T32._Fld17283RRef ELSE CAST(NULL AS BINARY(16)) END END,
T1._Period,
T1._Fld16103RRef,
T1._Fld16108RRef,
T1._Fld16105,
(ISNULL(CAST(T2.Fld16105Expense_ AS NUMERIC(21, 2)),0.0) + ISNULL(CAST(T2.Fld22815Turnover_ AS NUMERIC(21, 2)),0.0)),
T1._LineNo
FR OM dbo._AccumRg16100 T1
LEFT OUTER JOIN (SELECT
T3._Fld16101RRef AS Fld16101RRef,
T3._Fld16102_TYPE AS Fld16102_TYPE,
T3._Fld16102_RTRef AS Fld16102_RTRef,
T3._Fld16102_RRRef AS Fld16102_RRRef,
T3._Fld16103RRef AS Fld16103RRef,
CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN T3._Fld22815 ELSE -T3._Fld22815 END) AS NUMERIC(27, 8)) AS Fld22815Turnover_,
CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN 0.0 ELSE T3._Fld22815 END) AS NUMERIC(27, 8)) AS Fld22815Expense_,
CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN T3._Fld16105 ELSE -T3._Fld16105 END) AS NUMERIC(27, 8)) AS Fld16105Turnover_,
CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN 0.0 ELSE T3._Fld16105 END) AS NUMERIC(27, 8)) AS Fld16105Expense_
FR OM dbo._AccumRg16100 T3
WHERE ((T3._Fld706 = @P3)) AND (T3._Active) = 0x01
GROUP BY T3._Fld16101RRef,
T3._Fld16102_TYPE,
T3._Fld16102_RTRef,
T3._Fld16102_RRRef,
T3._Fld16103RRef
HAVING (CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN T3._Fld22815 ELSE -T3._Fld22815 END) AS NUMERIC(27, 8))) <> 0.0 OR (CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN 0.0 ELSE T3._Fld22815 END) AS NUMERIC(27, 8))) <> 0.0 OR (CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN T3._Fld16105 ELSE -T3._Fld16105 END) AS NUMERIC(27, 8))) <> 0.0 OR (CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN 0.0 ELSE T3._Fld16105 END) AS NUMERIC(27, 8))) <> 0.0) T2
ON (((T1._Fld16102_TYPE = T2.Fld16102_TYPE AND T1._Fld16102_RTRef = T2.Fld16102_RTRef AND T1._Fld16102_RRRef = T2.Fld16102_RRRef) AND (T1._Fld16103RRef = T2.Fld16103RRef)) AND (T1._Fld16101RRef = T2.Fld16101RRef))
INNER JOIN dbo._InfoRg13472 T4
ON ((T1._Fld16101RRef = T4._Fld13476RRef) AND ((@P4 = T4._Fld13474RRef) OR (0x08 = 0x01 AND 0x00000091 = 0x00000000 AND @P5 = @P6)))
LEFT OUTER JOIN dbo._Document279 T5
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000117 AND T1._Fld16102_RRRef = T5._IDRRef) AND (T5._Fld706 = @P7)
LEFT OUTER JOIN dbo._Document324 T6
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000144 AND T1._Fld16102_RRRef = T6._IDRRef) AND (T6._Fld706 = @P8)
LEFT OUTER JOIN dbo._Document297 T7
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000129 AND T1._Fld16102_RRRef = T7._IDRRef) AND (T7._Fld706 = @P9)
LEFT OUTER JOIN dbo._Document326 T8
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000146 AND T1._Fld16102_RRRef = T8._IDRRef) AND (T8._Fld706 = @P10)
LEFT OUTER JOIN dbo._Document359 T9
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000167 AND T1._Fld16102_RRRef = T9._IDRRef) AND (T9._Fld706 = @P11)
LEFT OUTER JOIN dbo._Document358 T10
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000166 AND T1._Fld16102_RRRef = T10._IDRRef) AND (T10._Fld706 = @P12)
LEFT OUTER JOIN dbo._Document283 T11
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000011B AND T1._Fld16102_RRRef = T11._IDRRef) AND (T11._Fld706 = @P13)
LEFT OUTER JOIN dbo._Document268 T12
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000010C AND T1._Fld16102_RRRef = T12._IDRRef) AND (T12._Fld706 = @P14)
LEFT OUTER JOIN dbo._Document325 T13
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000145 AND T1._Fld16102_RRRef = T13._IDRRef) AND (T13._Fld706 = @P15)
LEFT OUTER JOIN dbo._Document289 T14
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000121 AND T1._Fld16102_RRRef = T14._IDRRef) AND (T14._Fld706 = @P16)
LEFT OUTER JOIN dbo._Reference86 T15
ON (T5._Fld7250RRef = T15._IDRRef) AND (T15._Fld706 = @P17)
LEFT OUTER JOIN dbo._Reference86 T16
ON (T6._Fld9385RRef = T16._IDRRef) AND (T16._Fld706 = @P18)
LEFT OUTER JOIN dbo._Document329 T17
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000149 AND T1._Fld16102_RRRef = T17._IDRRef) AND (T17._Fld706 = @P19)
LEFT OUTER JOIN dbo._Reference29241 T18
ON (T17._Fld9754RRef = T18._IDRRef) AND (T18._Fld706 = @P20)
LEFT OUTER JOIN dbo._Reference86 T19
ON (T7._Fld8332RRef = T19._IDRRef) AND (T19._Fld706 = @P21)
LEFT OUTER JOIN dbo._Reference86 T20
ON (T8._Fld9529RRef = T20._IDRRef) AND (T20._Fld706 = @P22)
LEFT OUTER JOIN dbo._Reference86 T21
ON (T9._Fld11213RRef = T21._IDRRef) AND (T21._Fld706 = @P23)
LEFT OUTER JOIN dbo._Reference86 T22
ON (T10._Fld11077RRef = T22._IDRRef) AND (T22._Fld706 = @P24)
LEFT OUTER JOIN dbo._Document23216 T23
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00005AB0 AND T1._Fld16102_RRRef = T23._IDRRef) AND (T23._Fld706 = @P25)
LEFT OUTER JOIN dbo._Reference29241 T24
ON (T23._Fld23590RRef = T24._IDRRef) AND (T24._Fld706 = @P26)
LEFT OUTER JOIN dbo._Reference86 T25
ON (T11._Fld7523RRef = T25._IDRRef) AND (T25._Fld706 = @P27)
LEFT OUTER JOIN dbo._Reference86 T26
ON (T12._Fld6475RRef = T26._IDRRef) AND (T26._Fld706 = @P28)
LEFT OUTER JOIN dbo._Document278 T27
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000116 AND T1._Fld16102_RRRef = T27._IDRRef) AND (T27._Fld706 = @P29)
LEFT OUTER JOIN dbo._Reference29241 T28
ON (T27._Fld7163RRef = T28._IDRRef) AND (T28._Fld706 = @P30)
LEFT OUTER JOIN dbo._Reference86 T29
ON (T13._Fld9467RRef = T29._IDRRef) AND (T29._Fld706 = @P31)
LEFT OUTER JOIN dbo._Document331 T30
ON (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000014B AND T1._Fld16102_RRRef = T30._IDRRef) AND (T30._Fld706 = @P32)
LEFT OUTER JOIN dbo._Reference29241 T31
ON (T30._Fld9863RRef = T31._IDRRef) AND (T31._Fld706 = @P33)
LEFT OUTER JOIN dbo._Reference86 T32
ON (T14._Fld7860RRef = T32._IDRRef) AND (T32._Fld706 = @P34)
LEFT OUTER JOIN dbo._Reference218 T33
ON (CASE WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000117 THEN CASE WHEN T5._Fld7226RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000144 THEN CASE WHEN T6._Fld9355RRef IS NOT NULL THEN 0x000000DA END 
WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000129 THEN CASE WHEN T7._Fld8291RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000146 THEN CASE WHEN T8._Fld9507RRef IS NOT NULL THEN 0x000000DC END WHEN 
T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000167 THEN CASE WHEN T9._Fld11212RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000166 THEN CASE WHEN T10._Fld11064RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000011B THEN CASE WHEN T11._Fld7514RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000010C THEN CASE WHEN T12._Fld6468RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000145 THEN CASE WHEN T13._Fld9448RRef IS NOT NULL THEN 0x000000DA END WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000121 THEN CASE WHEN T14._Fld7823RRef IS NOT NULL THEN 0x000000DA END ELSE CAST(NULL AS BINARY(4)) END = 0x000000DA AND CASE WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000117 THEN T5._Fld7226RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000144 THEN T6._Fld9355RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000129 THEN T7._Fld8291RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000146 THEN T8._Fld9507RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000167 THEN T9._Fld11212RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000166 THEN T10._Fld11064RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000011B THEN T11._Fld7514RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x0000010C THEN T12._Fld6468RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000145 THEN T13._Fld9448RRef WHEN T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef = 0x00000121 THEN T14._Fld7823RRef ELSE CAST(NULL AS BINARY(16)) END = T33._IDRRef) AND (T33._Fld706 = @P35)
WH ERE (((T1._Fld706 = @P36)) AND (T4._Fld706 = @P37)) AND (T1._Active = 0x01 AND (T1._Fld16102_TYPE = 0x08 AND T1._Fld16102_RTRef + T1._Fld16102_RRRef IN (0x00000121 + @P38, 0x00000166 + @P39)) AND (T1._RecordKind = @P40) AND (T1._Fld16105 > @P41))
ORDER BY (T1._Period), (T1._LineNo)',N'@P1 varbinary(16),@P2 varbinary(16),@P3 numeric(10),@P4 varbinary(16),@P5 varbinary(16),@P6 varbinary(16),@P7 numeric(10),@P8 numeric(10),@P9 numeric(10),@P10 numeric(10),@P11 numeric(10),@P12 numeric(10),@P13 numeric(10),@P14 numeric(10),@P15 numeric(10),@P16 numeric(10),@P17 numeric(10),@P18 numeric(10),@P19 numeric(10),@P20 numeric(10),@P21 numeric(10),@P22 numeric(10),@P23 numeric(10),@P24 numeric(10),@P25 numeric(10),@P26 numeric(10),@P27 numeric(10),@P28 numeric(10),@P29 numeric(10),@P30 numeric(10),@P31 numeric(10),@P32 numeric(10),@P33 numeric(10),@P34 numeric(10),@P35 numeric(10),@P36 numeric(10),@P37 numeric(10),@P38 varbinary(16),@P39 varbinary(16),@P40 numeric(10),@P41 numeric(10)',0x00000000000000000000000000000000,0x00000000000000000000000000000000,0,0x00000000000000000000000000000000,0x00000000000000000000000000000000,0x00000000000000000000000000000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x951A00155D000D0111E8B2A581A328A0,0x951A00155D000D0111E8B2C28E832A9B,0,0
Показать

Слишком много соединений с документами...
3. Sashares 34 20.09.18 10:16 Сейчас в теме
(2) А если так - сначала выбрать записи из регистра по условию во временную таблицу и только потом соединяться со всеми остальными регистрами?

ВЫБРАТЬ
    РасчетыСКлиентами.ЗаказКлиента,
    РасчетыСКлиентами.Период,
    РасчетыСКлиентами.Валюта,
    РасчетыСКлиентами.ФормаОплаты ,
     РасчетыСКлиентами.АналитикаУчетаПоПартнерам ,
    РасчетыСКлиентами.КОплате
Поместить ТаблицаРС
ИЗ
    РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
ГДЕ
    РасчетыСКлиентами.Активность
    И РасчетыСКлиентами.ЗаказКлиента В(&ЗаказКлиента)
    И РасчетыСКлиентами.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
;

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

УПОРЯДОЧИТЬ ПО
    РасчетыСКлиентами.Период,
    РасчетыСКлиентами.НомерСтроки
ИТОГИ ПО
    ОснованиеПлатежа
Показать
triviumfan; alex-l19041; +2 Ответить
7. triviumfan 93 20.09.18 10:32 Сейчас в теме
(3) Спасибо, прирост производительности в 10 раз. Попробую теперь поместить в ВТ таблицу остатков.
alex-l19041; +1 Ответить
10. Sashares 34 20.09.18 10:38 Сейчас в теме
(7)В параметрах виртуальной таблицы оборотов еще попробуйте задать отбор по заказу.
16. triviumfan 93 20.09.18 11:06 Сейчас в теме
(10) Добавил - разницы нет.
Оказалось, что теперь "узкое горло" совсем другой запрос, а этот я оставлю таким:
ВЫБРАТЬ
	РасчетыСКлиентами.ЗаказКлиента КАК ЗаказКлиента,
	РасчетыСКлиентами.Период КАК Период,
	РасчетыСКлиентами.АналитикаУчетаПоПартнерам КАК АналитикаУчетаПоПартнерам,
	РасчетыСКлиентами.НомерСтроки КАК НомерСтроки,
	РасчетыСКлиентами.Валюта КАК Валюта,
	РасчетыСКлиентами.ФормаОплаты КАК ФормаОплаты,
	РасчетыСКлиентами.КОплате КАК КОплате
ПОМЕСТИТЬ ТаблицаРС
ИЗ
	РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
ГДЕ
	РасчетыСКлиентами.Активность
	И РасчетыСКлиентами.ЗаказКлиента В(&ЗаказКлиента)
	И РасчетыСКлиентами.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
	И РасчетыСКлиентами.КОплате > 0
;

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

УПОРЯДОЧИТЬ ПО
	РасчетыСКлиентами.Период,
	РасчетыСКлиентами.НомерСтроки
ИТОГИ ПО
	ОснованиеПлатежа
Показать

Лезть в новые дебри не хочется (ДенежныеСредстваСервер.РасшифровкаПлатежаНДС()):
ВЫБРАТЬ РАЗЛИЧНЫЕ
	СчетаФактуры.ДокументОснование КАК ДокументОснование
ПОМЕСТИТЬ СчетаФактуры
ИЗ
	Документ.СчетФактураВыданный.ДокументыОснования КАК СчетаФактуры
ГДЕ
	СчетаФактуры.Ссылка В(&МассивДокументов)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТаблицаДокумента.Ссылка КАК Ссылка,
	ТаблицаДокумента.СтавкаНДС КАК СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС КАК СуммаСНДС,
	ТаблицаДокумента.СуммаНДС КАК СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта КАК Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента КАК СуммаДокумента
ПОМЕСТИТЬ ТаблицаСуммНДС
ИЗ
	Документ.АктВыполненныхРабот.Услуги КАК ТаблицаДокумента
		ЛЕВОЕ СОЕДИНЕНИЕ СчетаФактуры КАК СчетаФактуры
		ПО ТаблицаДокумента.Ссылка = СчетаФактуры.ДокументОснование
ГДЕ
	(ТаблицаДокумента.Ссылка В (&МассивДокументов)
			ИЛИ СчетаФактуры.ДокументОснование ЕСТЬ НЕ NULL )

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ВыкупВозвратнойТарыКлиентом.Товары КАК ТаблицаДокумента
		ЛЕВОЕ СОЕДИНЕНИЕ СчетаФактуры КАК СчетаФактуры
		ПО ТаблицаДокумента.Ссылка = СчетаФактуры.ДокументОснование
ГДЕ
	(ТаблицаДокумента.Ссылка В (&МассивДокументов)
			ИЛИ СчетаФактуры.ДокументОснование ЕСТЬ НЕ NULL )

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ЗаказКлиента.Товары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)
	И НЕ ТаблицаДокумента.Отменено
	И (ТаблицаДокумента.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
			ИЛИ НЕ ТаблицаДокумента.Ссылка.ВернутьМногооборотнуюТару)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ЗаказПоставщику.Товары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)
	И НЕ ТаблицаДокумента.Отменено
	И (ТаблицаДокумента.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
			ИЛИ НЕ ТаблицаДокумента.Ссылка.ВернутьМногооборотнуюТару)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ЗаявкаНаВозвратТоваровОтКлиента.ВозвращаемыеТовары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)
	И НЕ &ОплатаОтКлиента
	И НЕ ТаблицаДокумента.Отменено
	И (ТаблицаДокумента.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
			ИЛИ НЕ ТаблицаДокумента.Ссылка.ВернутьМногооборотнуюТару)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ЗаявкаНаВозвратТоваровОтКлиента.ЗаменяющиеТовары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)
	И &ОплатаОтКлиента
	И НЕ ТаблицаДокумента.Отменено
	И (ТаблицаДокумента.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
			ИЛИ НЕ ТаблицаДокумента.Ссылка.ВернутьМногооборотнуюТару)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ОтчетКомитенту.Товары КАК ТаблицаДокумента
		ЛЕВОЕ СОЕДИНЕНИЕ СчетаФактуры КАК СчетаФактуры
		ПО ТаблицаДокумента.Ссылка = СчетаФактуры.ДокументОснование
ГДЕ
	(ТаблицаДокумента.Ссылка В (&МассивДокументов)
			ИЛИ СчетаФактуры.ДокументОснование ЕСТЬ НЕ NULL )
	И НЕ &ОплатаОтКлиента

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ОтчетКомитентуОСписании.Товары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ОтчетКомиссионера.Товары КАК ТаблицаДокумента
		ЛЕВОЕ СОЕДИНЕНИЕ СчетаФактуры КАК СчетаФактуры
		ПО ТаблицаДокумента.Ссылка = СчетаФактуры.ДокументОснование
ГДЕ
	(ТаблицаДокумента.Ссылка В (&МассивДокументов)
			ИЛИ СчетаФактуры.ДокументОснование ЕСТЬ НЕ NULL )
	И &ОплатаОтКлиента

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ОтчетКомиссионераОСписании.Товары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ПоступлениеТоваровУслуг.Товары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)
	И (ТаблицаДокумента.Номенклатура.ТипНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара)
			ИЛИ НЕ ТаблицаДокумента.Ссылка.ВернутьМногооборотнуюТару)

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

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

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ВозвратТоваровОтКлиента.Товары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	ТаблицаДокумента.СуммаСНДС,
	ТаблицаДокумента.СуммаНДС,
	ТаблицаДокумента.Ссылка.Валюта,
	ТаблицаДокумента.Ссылка.СуммаДокумента
ИЗ
	Документ.ВозвратТоваровПоставщику.Товары КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	ТаблицаДокумента.Ссылка,
	ТаблицаДокумента.СтавкаНДС,
	0,
	0,
	НЕОПРЕДЕЛЕНО,
	0
ИЗ
	Справочник.ДоговорыКонтрагентов КАК ТаблицаДокумента
ГДЕ
	ТаблицаДокумента.Ссылка В(&МассивДокументов)

ОБЪЕДИНИТЬ ВСЕ

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

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	КурсВалюты.Валюта КАК Валюта,
	КурсВалюты.Курс * КурсВалютыДокумента.Кратность / (КурсВалюты.Кратность * КурсВалютыДокумента.Курс) КАК КоэффициентПересчета
ПОМЕСТИТЬ КурсыВалют
ИЗ
	РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, ) КАК КурсВалюты
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, Валюта = &ВалютаДокумента) КАК КурсВалютыДокумента
		ПО (ИСТИНА)
ГДЕ
	КурсВалюты.Кратность <> 0
	И КурсВалютыДокумента.Курс <> 0

ИНДЕКСИРОВАТЬ ПО
	Валюта
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ТаблицаСуммНДС.Ссылка КАК Ссылка,
	ТаблицаСуммНДС.СуммаДокумента * ЕСТЬNULL(КурсыВалют.КоэффициентПересчета, 1) КАК СуммаДокумента,
	ВЫБОР
		КОГДА ТаблицаСуммНДС.СтавкаНДС В (&СтавкаНДС18)
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
		КОГДА ТаблицаСуммНДС.СтавкаНДС В (&СтавкаНДС10)
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
		ИНАЧЕ ТаблицаСуммНДС.СтавкаНДС
	КОНЕЦ КАК СтавкаНДС,
	СУММА(ТаблицаСуммНДС.СуммаСНДС) * ЕСТЬNULL(КурсыВалют.КоэффициентПересчета, 1) КАК СуммаСНДС,
	СУММА(ТаблицаСуммНДС.СуммаНДС) * ЕСТЬNULL(КурсыВалют.КоэффициентПересчета, 1) КАК СуммаНДС
ИЗ
	ТаблицаСуммНДС КАК ТаблицаСуммНДС
		ЛЕВОЕ СОЕДИНЕНИЕ КурсыВалют КАК КурсыВалют
		ПО ТаблицаСуммНДС.Валюта = КурсыВалют.Валюта

СГРУППИРОВАТЬ ПО
	ТаблицаСуммНДС.Ссылка,
	ТаблицаСуммНДС.СуммаДокумента,
	КурсыВалют.КоэффициентПересчета,
	ВЫБОР
		КОГДА ТаблицаСуммНДС.СтавкаНДС В (&СтавкаНДС18)
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
		КОГДА ТаблицаСуммНДС.СтавкаНДС В (&СтавкаНДС10)
			ТОГДА ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
		ИНАЧЕ ТаблицаСуммНДС.СтавкаНДС
	КОНЕЦ

ИМЕЮЩИЕ
	(СУММА(ТаблицаСуммНДС.СуммаСНДС) <> 0
		ИЛИ СУММА(ТаблицаСуммНДС.СуммаНДС) <> 0
		ИЛИ ТИПЗНАЧЕНИЯ(ТаблицаСуммНДС.Ссылка) В (ТИП(Справочник.ДоговорыКонтрагентов), ТИП(Справочник.ДоговорыМеждуОрганизациями)))
Показать

Похоже, что торговля и тормоза - вещи неразлучные. Печаль.
Прикрепленные файлы:
17. triviumfan 93 20.09.18 11:08 Сейчас в теме
(16) В целом, не так сильно заметны лаги, 2 секунды ввод на основании - нормально. Всем больше спасибо!
18. Sashares 34 20.09.18 11:12 Сейчас в теме
(16) Единственное предложение
ЗаказКлиента В (ВЫБРАТЬ ТаблицаРС.ЗаказКлиента ИЗ ТаблицаРС)


заменить на ЗаказКлиента В(&ЗаказКлиента)
12. VmvLer 20.09.18 10:47 Сейчас в теме
(7) вот только помещение физической таблицы во временную дало прирост в 10 раз при соединении, но это все равно плохо если записей в этой таблице может быть десятки миллионов. Если еще подробить данные во временные таблицы, то прирост не заставит себя ждать,

а неявные преобразования условий СУБД и сама сделает - оптимизация в этом даст малых выхлоп
4. dandykry 10 20.09.18 10:22 Сейчас в теме
(2) по всей видимости неявные соединения плодятся тут из-за составного типа заказа

 ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКлиентами.Обороты(, , Период, ) КАК РасчетыСКлиентамиОбороты
        ПО РасчетыСКлиентами.ЗаказКлиента = РасчетыСКлиентамиОбороты.ЗаказКлиента


По логике так и надо т.к. заказ не только заказ клиента(

Выход1 - можно перед выполнением в начале определить тип заказа

ЗаказКлиента     = ПараметрыЗаполнения.ЗаказКлиента;


После обработать текст запроса, чтоб было
ПО ВЫРАЗИТЬ (РасчетыСКлиентами.ЗаказКлиента как ТипКоторыйМыОпределили) = ВЫРАЗИТЬ (РасчетыСКлиентамиОбороты.ЗаказКлиента как ТипКоторыйМыОпределили)

Выход 2 - Виртуальную таблицу остатков поместить в ВТ и после ее соединять с таблицей движений (не наоборот как ниже посоветовали)
triviumfan; +1 Ответить
6. triviumfan 93 20.09.18 10:27 Сейчас в теме
(4) 1й вариант очень логичен, логичен, спасибо.
А с временной таблицей сейчас поэкспериментирую: сначала обычную таблицу, а потом остатков. Отпишусь.
5. VmvLer 20.09.18 10:27 Сейчас в теме
я думаю основные тормоза из этого

ИЗ
    РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКлиентами.Обороты


т.е. массивная физическая таблица обротного регистра соединяется с выртуальной таблицей этого же регистра - это ужасно!

я бы нашел способ вообще не использовать физическую таблицу регистра - именно ее чтение вызывает львиную долю тормозов.
можно собрать во временные таблицы необходимые данные и потом соединять их с виртуальными таблицами.
alex-l19041; +1 Ответить
8. dandykry 10 20.09.18 10:34 Сейчас в теме
(5) Например СтатьяДвиженияДенежныхСредств это реквизит регистра. Без таблицы движений вы его не получите.
Такая архитектура регистра. В измерение его тоже не засунешь, т.к. может быть не всегда запролнен (не уверен, но вроде так) и лишние индексы в регистре, лишние блокировки, ради простой аналитики.
triviumfan; +1 Ответить
9. VmvLer 20.09.18 10:37 Сейчас в теме
(8) я написал, то что написал и считаю что причина именно в этих строках - фильтры, неявные соединения тут вторичны в плане производительности.

можно, конечно, искать причины оставить физическую таблицу в запросе и "есть кактус", а можно найти способ от нее избавиться

по выражению

ТОГДА ВЫРАЗИТЬ(РасчетыСКлиентами.ЗаказКлиента.Соглашение КАК Справочник.СоглашенияСКлиентами).СтатьяДвиженияДенежныхСредств


понятно, что ваше утверждение, что статью можно получить только из физической таблицы регистра ложь.
11. dandykry 10 20.09.18 10:40 Сейчас в теме
(9) Я описал почему нельзя

я бы нашел способ вообще не использовать физическую таблицу регистра
13. Sashares 34 20.09.18 10:54 Сейчас в теме
(11) Так СтатьяДвиженияДенежныхСредств в этом запросе и не используется.
14. dandykry 10 20.09.18 10:56 Сейчас в теме
(13) Промахнулся. ФормаОплаты используется. Тоже реквизит. Смысл тот же
15. Sashares 34 20.09.18 11:05 Сейчас в теме
(14)УТ под рукой нет, спасиб =)
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот