Имя: Пароль:
1C
1С v8
Непонятки с запросом
0 Nikoss
 
07.12.17
12:19
"
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент,
    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОстатки.Сделка КАК Сделка,
    ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
    ,    ВЫБОР
            КОГДА &ПереключательЗадолженность = 1
                ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0
            ИНАЧЕ Истина
        КОНЕЦ КАК ПОЛЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕ
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки() КАК ВзаиморасчетыСКонтрагентамиОстатки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки() КАК ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа
            ПО ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.ДоговорКонтрагента
            И ВзаиморасчетыСКонтрагентамиОстатки.Сделка = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.Сделка
            И Истина
"

Вот такой запрос. Это кусок типового запроса по задолженности контрагентов, с некоторыми упрощениями.
Так вот, если выполнять его как есть он выдает один результат, если убрать строки по выводу ПОЛЕЕЕЕЕЕ (ниже привожу их), другой результат. Как так может получаться?

"
//,ВЫБОР
//    КОГДА &ПереключательЗадолженность = 1
//        ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0
//    ИНАЧЕ Истина
//КОНЕЦ КАК ПОЛЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕ
"
1 Ёпрст
 
гуру
07.12.17
12:21
(0) И Истина, заменяется на условие в зависимости от &ПереключательЗадолженность ниже в коде.
2 Nikoss
 
07.12.17
12:35
(1) в оригинале да, но я уже оттуда убрал это условие (думал может параметр как-то не так обрабатывается во внутреннем соединение)

Просто если в выбранные поля запроса добавить или убрать поле:
ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0 КАК ПОЛЕЕЕЕЕ
меняется результат запроса
3 Nikoss
 
07.12.17
12:37
Еще раз...

Вот так:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент,
    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОстатки.Сделка КАК Сделка,
    ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
    ,ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0 КАК ПОЛЕЕЕЕЕЕЕЕЕ
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки() КАК ВзаиморасчетыСКонтрагентамиОстатки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки() КАК ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа
            ПО ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.ДоговорКонтрагента
            И ВзаиморасчетыСКонтрагентамиОстатки.Сделка = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.Сделка

И вот так:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВзаиморасчетыСКонтрагентамиОстатки.Контрагент КАК Контрагент,
    ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОстатки.Сделка КАК Сделка,
    ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток КАК СуммаУпр
    //,ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0 КАК ПОЛЕЕЕЕЕЕЕЕЕ
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки() КАК ВзаиморасчетыСКонтрагентамиОстатки
    ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки() КАК ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа
            ПО ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.ДоговорКонтрагента
            И ВзаиморасчетыСКонтрагентамиОстатки.Сделка = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.Сделка

Разные результаты запроса! О_о
4 DrShad
 
07.12.17
12:40
естественно разные ибо в выборке нет одного из полей
5 1Сергей
 
07.12.17
12:43
(4) +1
6 Nikoss
 
07.12.17
12:44
(4)(5) разные по количеству строк
7 DrShad
 
07.12.17
12:47
(6) естественно
8 mehfk
 
07.12.17
12:47
9 dezss
 
07.12.17
12:49
(6) естественно разные, так как появляется дробление по этому полю...
вот таблица
Имя   Количество
Вася   2
Петя   1

Если обращаться к ВТ остатков без имени, то будет одна строка с 3, если взять еще и имя, то будет 2 строки с 2 и 1.
10 dezss
 
07.12.17
12:49
(9) + то, что это поле у тебя хранится в другой таблице, не имеет значения, дробление все равно будет.

Почитай внимательней про ВТ остатков.
11 1Сергей
 
07.12.17
13:02
Объясните мне смысл внуетреннего соединения двух одиннаковых таблиц?
12 Nikoss
 
07.12.17
13:08
(10) хорошо. Тогда по вашему, сумма должна быть одинаковая в любом случае, правильно? (если брать ваш пример, сумма и там и тут 3).
Так вот у меня сумма отличается.

(11) Это я уже упростил до максимума, чтобы отловить поле которое влияет. В типовом отчете так реализован отбор деб./кред.задолженности. В соединение стоит условие на параметр. Вот так:
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
        РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&ДатаКон,{Контрагент.* КАК Контрагент, Сделка.* КАК Сделка, ДоговорКонтрагента.* КАК ДоговорКонтрагента, Организация.* КАК Организация}) КАК ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа
            ПО ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.ДоговорКонтрагента
            И ВзаиморасчетыСКонтрагентамиОстатки.Сделка = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.Сделка
            И ВЫБОР
                КОГДА &ПереключательЗадолженность = 1
                    ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток>0
                КОГДА &ПереключательЗадолженность = 2
                    ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток<0
                ИНАЧЕ Истина
            КОНЕЦ
13 Nikoss
 
07.12.17
13:11
Еще проще...
"
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    СУММА(ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток) КАК СуммаУпр
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(, ) КАК ВзаиморасчетыСКонтрагентамиОстатки
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(, ) КАК ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа
        ПО ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.ДоговорКонтрагента
            И ВзаиморасчетыСКонтрагентамиОстатки.Сделка = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.Сделка
            И (ВЫБОР
                КОГДА &ПереключательЗадолженность = 1
                    ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0
                ИНАЧЕ ИСТИНА
            КОНЕЦ)
"

И

"
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    СУММА(ВзаиморасчетыСКонтрагентамиОстатки.СуммаУпрОстаток) КАК СуммаУпр
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(, ) КАК ВзаиморасчетыСКонтрагентамиОстатки
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(, ) КАК ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа
        ПО ВзаиморасчетыСКонтрагентамиОстатки.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.ДоговорКонтрагента
            И ВзаиморасчетыСКонтрагентамиОстатки.Сделка = ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.Сделка
            //И (ВЫБОР
            //    КОГДА &ПереключательЗадолженность = 1
            //        ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0
            //    ИНАЧЕ ИСТИНА
            //КОНЕЦ)
"

Разные суммы. Параметр &ПереключательЗадолженность = 0.
14 Nikoss
 
07.12.17
13:19
+ (13) У многих же есть этот регистр. Попробуйте у себя в консольке этот запрос сформировать и так и с комментариям. Результат одинаковый?
15 GenAcid
 
07.12.17
13:25
Так и должно быть. Причина - разный состав строк и соединение таблиц.
16 hhhh
 
07.12.17
13:34
(14) ведь у вас 2 строчки при соединении получается. Поэтому естественно будет СуммаУпр+СуммаУпр = СуммаУпр*2. Должна задвоиться у вас СуммаУпр в первом запросе.
17 catena
 
07.12.17
13:42
Потому что вылетают контрагенты, у которых СуммаВзаиморасчетовОстаток=0, а СуммаУпрОстаток<>0
18 catena
 
07.12.17
13:48
ДОбавь в запросе поле                     ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаУпрОстаток
и будет все совпадать и там и там.
19 Nikoss
 
07.12.17
14:06
(16) не, тут внутренне соединение

(17) именно! у меня вылетает одна сделка, именно так как вы написали, СуммаВзаиморасчетовОстаток=0, а СуммаУпрОстаток<>0.

Только я не могу врубиться, почему так??
20 catena
 
08.12.17
06:53
(19)Видимо интерпретатор берет остатки только по используемому ресурсу, а по нему остатков и нет. Внутреннее соединение и режет эту строчку.
21 DrZombi
 
гуру
08.12.17
07:12
(0) Оптимизатор от 1С оптимизирует, как бы :)
Закон Брукера: Даже маленькая практика стоит большой теории.