Имя: Пароль:
1C
1С v8
ПОЛНОЕ СОЕДИНЕНИЕ в запросе
0 Kalina
 
26.02.14
14:52
Здравствуйте, 1с 8.2 КА
Нужно выбрать взаиморасчеты всех контрагентов  за период
Запрос.Текст = "ВЫБРАТЬ
                   |    Контрагенты.Ссылка,
                   |    Контрагенты.Наименование КАК Наименование,
                   |    Контрагенты.Родитель,
                   |    ВзаиморасчетыСКонтрагентами.СуммаУпр,
                   |    ВзаиморасчетыСКонтрагентами.Период КАК Период
                   |ИЗ
                   |    Справочник.Контрагенты КАК Контрагенты
                   |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами
                   |        ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент.Ссылка
                   |ГДЕ
                   |    ВзаиморасчетыСКонтрагентами.Период <= &ДатаКон
                   |    И ВзаиморасчетыСКонтрагентами.Период >= &ДатаНач
                   |
                   |УПОРЯДОЧИТЬ ПО
                   |    Наименование,
                   |    Период";
Выводит только тех контрагентов - по которым была торговля
Вроде ПОЛНОЕ СОЕДИНЕНИЕ со Справочником Контрагентов должно выводить всех Контрагентов???
В чем прикол ???
1 H A D G E H O G s
 
26.02.14
14:53
|ГДЕ
                   |    ВзаиморасчетыСКонтрагентами.Период <= &ДатаКон
                   |    И ВзаиморасчетыСКонтрагентами.Период >= &ДатаНач
2 H A D G E H O G s
 
26.02.14
14:53
здесь
3 H A D G E H O G s
 
26.02.14
14:53
|        ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент.Ссылка

заменить на

|        ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент
4 Fram
 
26.02.14
14:54
Лучше Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка.Ссылка
5 Fram
 
26.02.14
14:54
так он вернее
6 Fram
 
26.02.14
14:54
оно
7 shuhard
 
26.02.14
14:55
(0)[РегистрНакопления.ВзаиморасчетыСКонтрагентами]
заменить на обороты
8 Maxus43
 
26.02.14
14:57
вместо
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами

надо

ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентамиОбороты(&Нач, &Кон)
9 Ёпрст
 
26.02.14
14:57
ГДЕ заменить на И ..
10 Armando
 
26.02.14
15:04
Полное соединение оно такое полное...
Зачем здесь оно?
11 Feunoir
 
26.02.14
15:09
(0) Фильтруй выборку по регистру до связывания со справочником. Или во временную таблицу, или в подзапросе. Потом уже с готовой таблицей соединяй. И полное соединение здесь не нужно. Достаточно левого (или правого), смотря что с чем будешь соединять.
12 Speshuric
 
26.02.14
15:23
ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.Наименование,
    Контрагенты.Родитель,
    ВзаиморасчетыСКонтрагентами.СуммаУпр,
    ВзаиморасчетыСКонтрагентами.Период
ИЗ
    Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами КАК ВзаиморасчетыСКонтрагентами
        ПО Контрагенты.Ссылка = ВзаиморасчетыСКонтрагентами.Контрагент
            И ВзаиморасчетыСКонтрагентами.Период МЕЖДУ &ДатаНач И &ДатаКон
УПОРЯДОЧИТЬ ПО
    Наименование,
    Период
13 shuhard
 
26.02.14
15:33
(12)[    И ВзаиморасчетыСКонтрагентами.Период МЕЖДУ &ДатаНач И &ДатаКон ]
понизит скорость
часто катастрофически
14 Kalina
 
26.02.14
15:36
(12) 5 баллов - Спасибо Великий Мастер - Заработало
Всем остальным тоже спасибо, буду разбираться дальше
С Уважением Kalina
15 Maxus43
 
26.02.14
15:38
(14) вирт таблицу Обороты используй, остальное некрасиво и неправильно.
Если в период у тебя было 2 движения - будет 2 строчки. Это к примеру о неправильности, про другие косяки уже намекали
16 Kalina
 
26.02.14
15:46
(15) А мне и надо все движения, а не голый оборот, а про другие косяки можно поподробнее ???
17 Maxus43
 
26.02.14
15:48
(16) а, сори, период выбран, не заметил.
Но с вирт таблицей Обороты результат не изменится, всё будет так же хорошо
другие косяки см (13)
18 Speshuric
 
26.02.14
16:04
(13) В каком случае скорость понизится? А то в плане запросов MS SQL between в общем-то в >= <= и преобразуется.
(16) Если бы это был универсальный отчет для любой конфигурации, то еще стоило бы "Активность" учесть. В КА вроде штатно записи без активности не делаются.
Виртуальная таблица, если нужны именно все движения, не нужна.
19 Speshuric
 
26.02.14
16:07
(13)
Пруф:
SQL:
set statistics profile on
select * from dbo._AccumRgТвойРегистр where _Period between '20131201' and '20131206'
set statistics profile off
В результате видно: "WHERE:([ТвояБД].[dbo].[_AccumRg13101].[_Period]>='2013-12-01 00:00:00.000' AND [ТвояБД].[dbo].[_AccumRg13101].[_Period]<='2013-12-06 00:00:00.000'
20 Speshuric
 
26.02.14
16:08
(19) Причем этот WHERE в условии предиката на кластеризованный индекс.
21 Maxus43
 
26.02.14
16:11
(19) у тебя сферический запрос в вакууме, в (12) условие засунуто в Соединение, и не факт что оно хорошо будет транслировано сервером 1с в скуль, надо смотреть конечно.
По логике больше подходит вирт таблица оборотов РН
22 Speshuric
 
26.02.14
16:18
(21) Блин, ну могу из ТЖ выдернуть. Как будет транслировано - вполне факт, тут ничего другого не изобрести.
Таблица оборотов судя по "надо все движения" не подходит: зачем заставлять 1С формировать какой-то дикий подзапрос с группировками и having, если задача просто вывести движения? Например, таблица оборотов "схлопнет" сторнирующиеся движения в одном регистраторе.
Хотя, конечно, задача скорее всего противоречит логике учета КА, потому что эта логика не предполагает, что кто-то анализирует отдельные движения.
23 БибиГон
 
26.02.14
16:21
(22) Таблица оборотов вроде больше к этому приспособлена. А движения можно выдернуть и из таблицы оборотов если период по сек или запись
24 Speshuric
 
26.02.14
16:52
(23)(21)(15)
Коллеги! Почему вы считаете что в данном случае от таблицы оборотов будет польза? Если считать, что задача поставлена именно вывести суммы движений, то таблица оборотов тут и даром не нужна.
Без оборотов запрос на стороне SQL выглядит просто и красиво (таблицы не из типовой, но всё, кроме номеров таблиц будет аналогично):

SELECT
T1._IDRRef,
T1._Description,
T1._ParentIDRRef,
T2._Period,
T2._Fld13903
FROM _Reference166 T1 WITH(NOLOCK)
LEFT OUTER JOIN _AccumRg13898 T2 WITH(NOLOCK)
ON (((T2._Fld13900RRef = T1._IDRRef) AND ((T2._Period >= P1) AND (T2._Period <= @P2)))) AND (T2._Fld676 = @P3)

Если конфа с разделителем, то еще и разделитель: WHERE (T1._Fld676 = @P4)

Для таблицы оборотов будет следующее:
1. Получаются параметры регистра. Не знаю зачем, но получаются (пример из разделенной конфигурации, поэтому есть T1._Fld676 = P1):
SELECT
MIN(T1._Period),
MIN(T1._UseTotals),
MIN(T1._ActualPeriod),
MAX(T1._UseSplitter),
MIN(T1._MinPeriod)
FROM _AccumRgOpt14012 T1 WITH(NOLOCK)
WHERE ((T1._Fld676 = P1)) AND (T1._RegID = @P2)',N'P1 numeric(10),@P2 varbinary(8000)

2. Сам запрос сложнее и содержит лишние cast, group by и having:

SELECT
T1._IDRRef,
T1._Description,
T1._ParentIDRRef,
T2.Period_,
T2.Fld13903Turnover_
FROM _Reference166 T1 WITH(NOLOCK)
LEFT OUTER JOIN (SELECT
T3._Period AS Period_,
T3._RecorderTRef AS RecorderTRef,
T3._RecorderRRef AS RecorderRRef,
T3._LineNo AS LineNo_,
T3._Fld13900RRef AS Fld13900RRef,
CAST(SUM(CASE WHEN T3._RecordKind = 0.0 THEN T3._Fld13903 ELSE -T3._Fld13903 END) AS NUMERIC(24, 8)) AS Fld13903Turnover_
FROM _AccumRg13898 T3 WITH(NOLOCK)
WHERE ((T3._Fld676 = P1)) AND (T3._Period >= @P2 AND T3._Period <= @P3 AND T3._Active = 0x01)
GROUP BY T3._Period,
T3._RecorderTRef,
T3._RecorderRRef,
T3._LineNo,
T3._Fld13900RRef
HAVING (CAST(SUM(CASE WHEN T3._RecordKind = @P4 THEN T3._Fld13903 ELSE -T3._Fld13903 END) AS NUMERIC(24, 8))) <> @P5) T2
ON (T2.Fld13900RRef = T1._IDRRef)
WHERE (T1._Fld676 = @P6)

Причем (что логично) запросы почти-почти одинаковы по количеству логических чтений, но запрос с таблицей регистра чуть меньше по времени CPU и общему по времени выполнения. Но вся эта разница всё равно лишь несколько мс.