![]() |
|
Непонятки с запросом | ☑ | ||
---|---|---|---|---|
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С оптимизирует, как бы :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |