Имя: Пароль:
1C
1С v8
Левое соединение
, , ,
0 Makar47
 
27.07.17
11:34
Это, какой-то, позор! (с)
Ткните носом, пожалуйста - что здесь не так? Ну простейший же запрос!

ВЫБРАТЬ
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура1    
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ПО ЗаказКлиентаТовары.Номенклатура = ПеремещениеТоваровТовары.Номенклатура
ГДЕ
    ЗаказКлиентаТовары.Ссылка = &Ссылка
    И ПеремещениеТоваровТовары.Ссылка = &СсылкаП

В Заказе 15 строк, в Перемещении - 7.
Результат - 7 (при любом варианте соединения, т.е. фактически всегда получаю внутреннее). Почему?
1 Волшебник
 
модератор
27.07.17
11:35
Не надо так соединять документы
2 Дарлок
 
27.07.17
11:36
(0) останутся только совпадающие номенклатуры... делай через объединить ВСЕ
3 1dvd
 
27.07.17
11:36
потому что в ГДЕ ПеремещениеТоваровТовары.Ссылка = &СсылкаП
4 vde69
 
модератор
27.07.17
11:37
ты выводишь ВСЕ документы в базе

зы
у тебя нет условия

ПеремещениеТоваровТовары.Ссылка = .....


условия ГДЕ - это НЕ ТО МЕСТО где это должно быть
5 Волшебник
 
модератор
27.07.17
11:38
Этот запрос к документам вообще не нужен.
6 vde69
 
27.07.17
11:39
ВЫБРАТЬ
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура1    
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ПО ЗаказКлиентаТовары.Номенклатура = ПеремещениеТоваровТовары.Номенклатура
И
    ЗаказКлиентаТовары.Ссылка = &Ссылка
    И ПеремещениеТоваровТовары.Ссылка = &СсылкаП
7 Makar47
 
27.07.17
11:39
(3) - а что там не так?
(1) - а как?
(2) - Почему? Левое же соединение.

Сделал синтетический пример - пустая конфа, два дока и один справочник на 5 наименований. Все работает (??).
8 1dvd
 
27.07.17
11:41
(7) конечно, работает он тебе покажет номенклатуру, которая есть в обоих документах
9 braslavets
 
27.07.17
11:41
потому что null
10 Дарлок
 
27.07.17
11:42
(7) убери условие  И ПеремещениеТоваровТовары.Ссылка = &СсылкаП
и выведи в поля ПеремещениеТоваровТовары.Ссылка
там где номенклатура не пересекается оно будет равно NULL
11 Волшебник
 
модератор
27.07.17
11:43
(7) Вообще никак. Запросы нужно делать к регистрам
12 Makar47
 
27.07.17
11:43
(6) - кака будет... Овер 120000 строк выдаст..
13 vde69
 
27.07.17
11:44
(12) обоснуй
14 Makar47
 
27.07.17
11:45
(13) - проверил опытным путем
15 vde69
 
27.07.17
11:47
(14) не верю, ты где то не то сделал
16 1dvd
 
27.07.17
11:47
(13) Макар прав, в запрос попадут все заказы
17 Alexandr_U1982
 
27.07.17
11:51
ВЫБРАТЬ
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура1    

ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ПО ЗаказКлиентаТовары.Номенклатура = ПеремещениеТоваровТовары.Номенклатура
        И ПеремещениеТоваровТовары.Ссылка = &СсылкаП
ГДЕ
    ЗаказКлиентаТовары.Ссылка = &Ссылка
18 sergeyshik
 
27.07.17
11:53
Ну либо через временные таблицы или внутренние запросы для выборки номенклатуры из определенных доков, а потом уже левое соединение
19 Makar47
 
27.07.17
11:56
(18) - да, через ВТ, работает.
Чую, правда кроется где-то в (10)...
20 1dvd
 
27.07.17
11:58
21 vde69
 
27.07.17
11:58
ихмо автору нужно что то типа

ВЫБРАТЬ
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура1    
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
        СОЕДИНЕНИЕ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ПО ЗаказКлиентаТовары.Номенклатура = ПеремещениеТоваровТовары.Номенклатура И ЗаказКлиентаТовары.Ссылка = ПеремещениеТоваровТовары.Ссылка.Заказ
ГДЕ
    ЗаказКлиентаТовары.Ссылка = &Ссылка
22 Makar47
 
27.07.17
12:01
(17), (21) - да! Это оно! Спасибо, попробую разобраться почему так...
23 h-sp
 
27.07.17
12:11
(22) ну сам прикинь. Если левое соединение, то у тебя

ПеремещениеТоваровТовары.Ссылка = NULL

ты пишешь условие

ГДЕ
    ПеремещениеТоваровТовары.Ссылка = &СсылкаП


и на что-то надеешься. На какую-то мистику. Чтобы NULL вдруг стало равно &СсылкаП
24 Basilio
 
27.07.17
12:14
ПеремещениеТоваровТовары.Ссылка = &СсылкаП
Изза этого условия Левое соединение становится внутренним.
25 Makar47
 
27.07.17
12:22
(23) >> Если левое соединение, то у тебя
ПеремещениеТоваровТовары.Ссылка = NULL

--
С чего это вдруг там NULL? Я же через параметр явно передаю ссылку на конкретное перемещение
26 dezss
 
27.07.17
12:24
(25) и левое становится врутренним
27 Sserj
 
27.07.17
12:25
(25) Да не парьсься. Либо сначала выбери товары заказа во временную таблицу и потом к ней левым соединеним прлепляй товары перемещений, либо выбирай товары из товары заказа и левое соединение к подзапросу товаров перемещения.
28 dezss
 
27.07.17
12:27
(25) ты ж сам говоришь, что в заказе у тебя 15 строк, а в перемещении только 7.
Эти 7 присоединяются к тем 15...у семи строк есть перемещение, у остальных перемещение null.
А в ГДЕ ты явно указываешь, что null быть не может, может быть только то, что ты передаешь параметром, вот эти 8 строк и отсекаются.
29 xXeNoNx
 
27.07.17
12:32
(0)Фу как не эстетично.
Берем вирт таблицы регистров, накладываем фильтры, соединяем.
Если доки не проведены, то отбираем товары перемещения, цепляем левым к Товарам заказа, индексы не надо
30 h-sp
 
27.07.17
12:46
(25) в общем пиши так

ГДЕ
    ЗаказКлиентаТовары.Ссылка = &Ссылка
    И ЕСТЬNULL(ПеремещениеТоваровТовары.Ссылка, &СсылкаП) = &СсылкаП
31 Волшебник
 
модератор
27.07.17
12:50
(29) А я уже это говорил в (1)(5)(11), но меня все игнорируют
32 Makar47
 
27.07.17
13:44
(31) - не игнорирую я никого :) Осиливаю по немногу...
33 Makar47
 
27.07.17
13:47
(28) ёкарный бабай! Все понял! Спасибо.
Закон Брукера: Даже маленькая практика стоит большой теории.