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


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С оптимизирует, как бы :)



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