Имя: Пароль:
1C
1С v8
v8: Нюансы языка запросов
0 mgk2
 
16.08.13
13:27
Объясните пожалуйста почему два похожих запроса дают разные результаты?

1.
ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Организация КАК Организация,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Контрагент КАК Контрагент,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор КАК Регистратор,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовОстаток,
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты(&КрайняяДатаАнализа, &Дата, Регистратор, , ДоговорКонтрагента.ВидДоговора = &ВидДоговора) КАК ВзаиморасчетыСКонтрагентамиОстаткиИОбороты

УПОРЯДОЧИТЬ ПО
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор.Дата УБЫВ
ИТОГИ
    МИНИМУМ(СуммаВзаиморасчетовОстаток),
    МИНИМУМ(СуммаВзаиморасчетовПриход)
ПО
    Организация,
    Контрагент

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

УПОРЯДОЧИТЬ ПО
    ВзаиморасчетыСКонтрагентамиОстаткиИОбороты.Регистратор.Дата УБЫВ
ИТОГИ
    МИНИМУМ(СуммаВзаиморасчетовОстаток),
    МИНИМУМ(СуммаВзаиморасчетовПриход)
ПО
    Организация,
    Контрагент
1 Maxus43
 
16.08.13
13:31
ДоговорКонтрагента.ВидДоговора вытащи в выборку, и погляди где расходится
2 hhhh
 
16.08.13
13:34
(1) если он вытащит, то всё сойдется. имхо
3 mgk2
 
16.08.13
13:35
(1) Т.е. оба запроса должны работать одинаково? Косяк в базе?
4 GANR
 
16.08.13
13:36
А профайлер можно глянуть?
5 mgk2
 
16.08.13
13:42
(4) Как это сделать?
6 Maxus43
 
16.08.13
13:47
в базе всё нормально, так и должно быть
7 catena
 
16.08.13
13:50
(2)Аха, сойдется.
8 giallo
 
16.08.13
13:58
(0) во втором запросе данные из вт получаются в разрезе договоров, а потом фильтруются по виду договора. Разница может быть например в ситуации если на разных видах договоров одинаковые суммы с разным знаком, а остальная аналитика одинакова. Тогда в первом запросе это свернется и не попадет в выборку, а во втором попадет.
9 mgk2
 
16.08.13
14:04
> Тогда в первом запросе это свернется и не попадет в выборку, а во втором попадет.

А не наоборот?

Первым запросом я получаю более длинный список контрагентов.
10 giallo
 
16.08.13
14:26
(9) подкорректирую (8) - если например, на начало периода на двух разных договорах с одинаковым видом, удовлетворяющем отбору, одинаковые суммы с разным знаком, а остальная аналитика одинакова, то тогда в первом запросе это свернется и не попадет в выборку, а во втором будут записи по обоим договорам.
11 GANR
 
16.08.13
17:04
(0) Запустить MS SQL Profiler, запустить отладку в Profiler и выловить запрос, который тебе нужен. Это желательно делать когда в базе никто, кроме тебя не работает, так как иначе в отладчик профайлера будут вываливаться запросы, которые запускают другие пользователи.
12 GANR
 
16.08.13
17:04
(11) к (5)
13 mgk2
 
16.08.13
21:47
(12) у меня база файловая
14 giallo
 
16.08.13
22:29
(13) через тех журнал sdbl запросы можно помотреть
15 Reaper_1c
 
16.08.13
23:11
(0) Потому, что виртуальные таблицы - автогруппируемые. А еще за второй вариант сажают на кол.