Имя: Пароль:
1C
1С v8
Почему ГДЕ - зло
,
0 neon009
 
12.05.14
16:47
Вот столкнулся с проблемой. Не хотела консоль запросов как и сама система выдавать правильный результат при выборке. А именно, у меня в приходных документах есть только номенклатура "Ручка", а в расходной я пытаюсь списать еще и "Карандаш". Если использовать оператор ГДЕ в запросе то "Карандаша" как будто и вовсе нет. Вот ИБ:

http://webfile.ru/a1f7b0403d32d9daff95c3cd6f41aedf

там несколько приходных с "Ручкой"

а вот собственно запросы, там параметры поэтому выгружаю в файл:

неправильный:
http://webfile.ru/d5d6f4a210897d006e3720da3ca7c93f
правильный:
http://webfile.ru/dd1ad09aecbcd7ad387bfc4f25d94064

Вот не правильный запрос

ВЫБРАТЬ
        РасходнаяТовары.Номенклатура,
        СУММА(РасходнаяТовары.Количество) КАК КоличествоСпс,
        СУММА(РасходнаяТовары.Сумма) КАК СуммаСпс,
        МИНИМУМ(РасходнаяТовары.НомерСтроки) КАК НомерСтроки
    ПОМЕСТИТЬ ДокТЧ
    ИЗ
        Документ.Расходная.Товары КАК РасходнаяТовары
    ГДЕ
        НЕ РасходнаяТовары.Номенклатура.Услуга
        И РасходнаяТовары.Ссылка = &Ссылка
    
    СГРУППИРОВАТЬ ПО
        РасходнаяТовары.Номенклатура
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        *
    ИЗ
        Документ.Расходная.Товары КАК РасходнаяТовары
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&Дата, Номенклатура В (ВЫБРАТЬ ДокТЧ.Номенклатура ИЗ ДокТЧ КАК ДокТЧ) ) КАК ОстаткиТоваровОстатки
            ПО РасходнаяТовары.Номенклатура = ОстаткиТоваровОстатки.Номенклатура
            И ОстаткиТоваровОстатки.Партия.Склад=&Склад
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиПоСкладам.Остатки(
                    &Дата,
                        ) КАК ОстаткиПоСкладамОстатки
            ПО РасходнаяТовары.Номенклатура = ОстаткиПоСкладамОстатки.Номенклатура
ГДЕ ОстаткиПоСкладамОстатки.Склад = &Склад

Но если убрать ГДЕ ОстаткиПоСкладамОстатки.Склад = &Склад
и вместо этого поставить условие как параметр то все отрабатывает на ура

ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиПоСкладам.Остатки(
                    &Дата,
                    Склад = &Склад
                        ) КАК ОстаткиПоСкладамОстатки

пользуюсь учебной версией
1 mikecool
 
12.05.14
16:48
результат запроса ровно тот, что просишь, никак не другой...
2 Чайник Рассела
 
12.05.14
16:49
народ прямо ринулся качать твой dt
3 mikecool
 
12.05.14
16:49
+1 если знаешь как пользоваться, то НЕ ГДЕ = ЗЛО
4 ILM
 
гуру
12.05.14
16:50
- Мужик ручка есть?
- Есть, на.
- А карандаш?
- Неа,
- А если найду?
5 Чайник Рассела
 
12.05.14
16:50
(3) новая нормативно-оценочная категории морального сознания:
добро, зло и ГДЕ.
6 mikecool
 
12.05.14
16:52
- Студент, трахаться хочешь?
- конечно хочу, но НЕ ГДЕ
вот тут точно зло!!!
7 Господин ПЖ
 
12.05.14
16:52
дело традиционно не в бобине?
8 Фокусник
 
12.05.14
16:52
(0)
в данном случае "Склад = &Склад"  относится только к таблице РегистрНакопления.ОстаткиПоСкладам.Остатки
а "ГДЕ ОстаткиПоСкладамОстатки.Склад = &Склад"
ко выборке: Документ.Расходная.Товары  которая через ЛЕВОЕ СОЕДИНЕНИЕ  соединена с РегистрНакопления.ОстаткиТоваров.Остатки

т.е., если на остатках (РегистрНакопления.ОстаткиТоваров.Остатки)  нет номенклатуры, то

ОстаткиПоСкладамОстатки.Склад = NULL
и следовательно эта строка НЕ попадает в выборку...

однако это совсем не следует, что "ГДЕ - зло", а только следует только (3)... ;)
9 salvator
 
12.05.14
16:53
Добро побеждает зло.
Параметр виртуальной таблицы побеждает ГДЕ.
10 Beduin
 
12.05.14
16:54
(6) СОЕДИНЕНИЕ добро здесь
11 Beduin
 
12.05.14
16:58
(8) Кстати разницы нет. В случае ограничения на виртуальную таблицу ты просто сужаешь табличку для объединения, результат должен быть тот же.
12 neon009
 
12.05.14
16:58
Вообщем то ГДЕ может и не зло, но в данном случае злит. За коментарии (8)
13 1dvd
 
12.05.14
17:01
(9) Бабло побеждает зло. Добро тут не причем
14 Enders
 
12.05.14
17:03
(12) Чего злит то? потому что пользоваться не умеешь?)
Данные выбираешь из двух таблиц, а условия ГДЕ используешь на одну, соответственно если в другой таблице нет записей удовлетворяющих условиям(а их нет), то они не попадают в выборку.
15 Фокусник
 
12.05.14
17:06
(11) " результат должен быть тот же."
Результат не может быть тот же, ведь в выборке (в случае отсутствия записи в правой таблице)

ОстаткиПоСкладамОстатки.Склад = NULL

а NULL никогда не будет = &Склад ;)
16 neon009
 
12.05.14
17:22
(14) так там же ЛЕВОЕ СОЕДИНЕНИЕ
17 Enders
 
12.05.14
17:23
(11) как это нет?
Пример:

Склад;    Товар; Расход  ; Остаток
Склад1;   Товар1;Расход1; Null
Склад2;   Товар2;Расход2; Остаток2;

Если наложить условие на таблицу остатков, то записи с NULLом выбраны не будут. Если эти условия прописать в соединении или в вирт таблице, то эти записи попадут в выборку.
Условие "Где" отрабатывает уже после соединений, в отличии от условий вирт таблицы(до соединения) или условий соединений(во время).
18 Enders
 
12.05.14
17:24
(16) и? в (17) понятно или детальней надо?
19 neon009
 
12.05.14
17:25
(18) детальнее ...
20 neon009
 
12.05.14
17:26
(18) вообщем понял что с вирт.таблицей проблем не будет
21 Enders
 
12.05.14
17:30
(19) Хорошо. Пример 2

СкладРасхода; СкладОстатка; НоменРасх; НоменОст; Расх; Ост

Склад1;        NULL;         Товар1;    NUll;     1;    Null
Склад1;        Склад1;       Товар2;    Товар2;   1;    1

Это та таблица, которая у тебя получается после твоего левого соединения расхода с остатком.
Далее на эту таблицу ты накладываешь условие: "ГДЕ СкладОстатка = Склад1".  Так вот NULL не равно Склад1, соответственно этих записей ты не увидишь.

Почему появляется NULL надеюсь объяснять не надо.
22 neon009
 
12.05.14
17:34
(21) Спасибо за детальную разборку. Теперь понятно
23 Леша1с
 
12.05.14
17:42
Вообще не понял, о чем спор. О порядке отбора - где раньше отрабатывает условие, в ВТ или в ГДЕ? О скорости "параметры ВТ против ГДЕ"?
Че-т народ совсем того-этого.... ))
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс