Вход | Регистрация


1С:Предприятие ::

Метки:

Непонятки с запросом

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

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

"
//,ВЫБОР

//    КОГДА &ПереключательЗадолженность = 1
//        ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0

//    ИНАЧЕ Истина
//КОНЕЦ КАК ПОЛЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕЕ

"
 
  Рекламное место пустует
   Ёпрст
 
1 - 07.12.17 - 12:21
(0) И Истина, заменяется на условие в зависимости от &ПереключательЗадолженность ниже в коде.
   Nikoss
 
2 - 07.12.17 - 12:35
(1) в оригинале да, но я уже оттуда убрал это условие (думал может параметр как-то не так обрабатывается во внутреннем соединение)

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

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

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

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

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

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

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

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

И

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

            //    КОГДА &ПереключательЗадолженность = 1

            //        ТОГДА ВзаиморасчетыСКонтрагентамиОстаткиНужногоТипа.СуммаВзаиморасчетовОстаток > 0

            //    ИНАЧЕ ИСТИНА

            //КОНЕЦ)

"

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

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

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



Список тем форума
  Рекламное место пустует
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует