Имя: Пароль:
1C
1С v8
Простой запрос с левым соединением
,
0 BOFFKA
 
08.11.11
16:37
Есть запрос
ВЫБРАТЬ
   Продажи.Номенклатура,
   Продажи.Количество
ИЗ
   РегистрНакопления.Продажи КАК Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
       ПО Продажи.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
ГДЕ
   ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
   И ПартииТоваровНаСкладах.Период МЕЖДУ &Период И &кон
   И ПартииТоваровНаСкладах.Регистратор = &Регистратор
   И ПартииТоваровНаСкладах.КодОперации = &КодОперации
   И Продажи.Период МЕЖДУ &Период И &кон
   И Продажи.Контрагент = &Контрагент

Почему он выводит в два раза больше движений, чем есть в регистре продаж?
1 shuhard
 
08.11.11
16:38
(0) сгруппируй
2 Нуф-Нуф
 
08.11.11
16:39
ужаснах. параметры виртуальных таблиц нам неизвестны?
3 BOFFKA
 
08.11.11
16:40
(2) а какая из этих таблиц виртуальная???
4 Нуф-Нуф
 
08.11.11
16:40
а не, беру слова обратно.
5 BOFFKA
 
08.11.11
16:41
(1) группировка не подойдёт. Это кусок запроса, дальше хуже, поэтому с группировкой не получится.
6 BOFFKA
 
08.11.11
16:41
Разве я не правильно понимаю, что левое соединение, это записи из одной таблицы плюс те поля которые есть во второй?
7 DEVIce
 
08.11.11
16:42
На количество селеклисте сумму применить и сгруппировать по номенклатуре.
8 Не Печенкин
 
08.11.11
16:42
(3) а Продажи регистратором ограничивать не надо?
9 shuhard
 
08.11.11
16:42
(6) вынеси в подзапрос и сгруппируй,
у тебя две записи  в партиях на одну в продажах
10 Evpatiy
 
08.11.11
16:42
(0) может быть каждой строке регистра "Продажи" соответствует несколько строк регистра "партии" по указанной связи?
11 DEVIce
 
08.11.11
16:43
(9). Зачем еще подзапрос? Сгруппировать можно и так.
12 Evpatiy
 
08.11.11
16:43
(9) При группировке у него сумма увеличится
13 BOFFKA
 
08.11.11
16:44
документ оформлен двумя строками. по регистрам прошёл тоже двумя. всё из одной партии
14 DEVIce
 
08.11.11
16:44
(12). Ну все правильно.
15 Не Печенкин
 
08.11.11
16:45
(13) ты ответишь на (8) ?
16 DEVIce
 
08.11.11
16:45
Вообще, как-бы принято в условии первыми пихать выражения по основной таблице. Это я так, поворчал. :)
17 shuhard
 
08.11.11
16:45
(13) тебе большими буквами группировка написать ?
18 Михаил Козлов
 
08.11.11
16:46
Группировать нужно до соединения, чтобы была 1 строка на номенклатуру.
19 shuhard
 
08.11.11
16:47
(18) угу
см. (9)
20 Evpatiy
 
08.11.11
16:47
(14) Так у него суммы будут удвоены и утроены
21 Evpatiy
 
08.11.11
16:47
+(20) Не о том, видимо, подумал.
22 BOFFKA
 
08.11.11
16:48
Итак: есть номенклатура1, из одной партии, продано в реализации 8 штук (4+4),
при таком раскладе группировка

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

СГРУППИРОВАТЬ ПО
   Продажи.Номенклатура

выдаёт 16 штук
23 DEVIce
 
08.11.11
16:48
И таки да, выше совершенно справедливо заметили: надо связывать таблицы по регистратору. А то на один документ соберешь движения всех по номенклатуре.
24 BOFFKA
 
08.11.11
16:49
группировать вложенную Продажи ?
25 DEVIce
 
08.11.11
16:49
(22). Смотри (23).
26 shuhard
 
08.11.11
16:49
(22) все верно,
нет подзапроса - херовый результат


неожиданно ?
27 DEVIce
 
08.11.11
16:50
ВЫБРАТЬ
   Продажи.Номенклатура,
   СУММА(Продажи.Количество) КАК Количество
ИЗ
   РегистрНакопления.Продажи КАК Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
       ПО Продажи.Номенклатура = ПартииТоваровНаСкладах.Номенклатура И
       Продажи.Регистратор = ПартииТоваровНаСкладах.Регистратор
ГДЕ
   ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
   И ПартииТоваровНаСкладах.Период МЕЖДУ &Период И &кон
   И ПартииТоваровНаСкладах.Регистратор = &Регистратор
   И ПартииТоваровНаСкладах.КодОперации = &КодОперации
   И Продажи.Период МЕЖДУ &Период И &кон
   И Продажи.Контрагент = &Контрагент

СГРУППИРОВАТЬ ПО
   Продажи.Номенклатура
28 DEVIce
 
08.11.11
16:50
(26). У него нет связи по регистратору. Подзапрос тут нафиг не нужен.
29 BOFFKA
 
08.11.11
16:50
ВЫБРАТЬ
   Продажи.Номенклатура,
   СУММА(Продажи.Количество) КАК Количество
ИЗ
   РегистрНакопления.Продажи КАК Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
       ПО Продажи.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
           И Продажи.Регистратор = ПартииТоваровНаСкладах.Регистратор
ГДЕ
   ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
   И ПартииТоваровНаСкладах.Период МЕЖДУ &Период И &кон
   И ПартииТоваровНаСкладах.Регистратор = &Регистратор
   И ПартииТоваровНаСкладах.КодОперации = &КодОперации
   И Продажи.Период МЕЖДУ &Период И &кон
   И Продажи.Контрагент = &Контрагент

СГРУППИРОВАТЬ ПО
   Продажи.Номенклатура

16
30 BOFFKA
 
08.11.11
16:51
По регистратору тоже связывал. не помогает
31 Не Печенкин
 
08.11.11
16:51
(29) чукча не читатель?
32 Evpatiy
 
08.11.11
16:51
(29) Сунь партиТоваровНаСкладах в подзапрос и сгруппируй по номенклатуре
33 Не Печенкин
 
08.11.11
16:52
(30) покажи, наверняка строки с одинаковой номенклатурой
34 shuhard
 
08.11.11
16:52
(30) вроде до пятницы ещё дожить надо
35 DEVIce
 
08.11.11
16:53
(30). Ты блин вообще убери из ГДЕ ПартииТоваровНаСкладах.Регистратор и напиши Продажи.Регистратор. Ты запрос строишь корне неверно. У тебя таблицы местами перепутаны похоже. :)
36 BOFFKA
 
08.11.11
16:53
(33) это я в 22 написал. Да строки с одинаковой номенклатурой.
37 DEVIce
 
08.11.11
16:54
Кстати, обратите внимание, он данные берет только из Продажи, а соединяет партии, только чтобы наложить условия. Короче, запрос написан через *опу.
38 shuhard
 
08.11.11
16:54
(36) прикольно
ответ дан сразу
группировка в подзапросе
39 DEVIce
 
08.11.11
16:55
Накера ставить услоие на период, если выборка идет по регистратору? В индекс попасть что-ли хочет? И много всяких других косяков.
40 BOFFKA
 
08.11.11
16:55
И Продажи.Регистратор = &Регистратор
тоже 16
41 DEVIce
 
08.11.11
16:56
Автор. Напиши словами что хочешь получить.
42 shuhard
 
08.11.11
16:57
(40) автор ты читать умеешь ?
43 Evpatiy
 
08.11.11
16:57
(41) ОФФ: В лоб от архитектора :))
44 BOFFKA
 
08.11.11
16:58
(41) пишу отчет по Валовой.

Запрос для продаж такой

ВЫБРАТЬ РАЗРЕШЕННЫЕ
   Продажи.Номенклатура КАК Номенклатура,
   Продажи.НДС КАК НДС,
   ПартииТоваровНаСкладах.ДокументОприходования КАК ДокументОприходования,
   Продажи.Подразделение КАК Подразделение,
   Продажи.Организация КАК Организация,
   Продажи.Контрагент КАК Контрагент,
   ПартииТоваровНаСкладах.Регистратор КАК Регистратор,
   ПартииТоваровНаСкладах.Количество КАК КоличествоПар,
   ПартииТоваровНаСкладах.Стоимость КАК СтоимостьПар,
   Продажи.Стоимость / Продажи.Количество * ЕСТЬNULL(ПартииТоваровНаСкладах.Количество, 0) КАК ПродажиСНДС,
   Продажи.Стоимость / Продажи.Количество * ПартииТоваровНаСкладах.Количество - Продажи.НДС / Продажи.Количество * ПартииТоваровНаСкладах.Количество КАК ПродажиБезНДС,
   Продажи.Стоимость / Продажи.Количество * ПартииТоваровНаСкладах.Количество - ПартииТоваровНаСкладах.Стоимость КАК ВаловаяПрибыль
ИЗ
   РегистрНакопления.Продажи КАК Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
       ПО Продажи.Номенклатура = ПартииТоваровНаСкладах.Номенклатура
           И Продажи.Регистратор = ПартииТоваровНаСкладах.Регистратор
ГДЕ
   Продажи.Период МЕЖДУ &ДатаНач И &ДатаКон
   И Продажи.Количество > 0
   И Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
   И Продажи.Подразделение = &Подразделение
   И Продажи.Контрагент = &Контрагент
   И ПартииТоваровНаСкладах.КодОперации = &КодОперации

И столкнулся с тем что в доках с одинаковой номенклатурой двоится инфа
45 DEVIce
 
08.11.11
16:59
(44). Хыыыы. Не это конечно тоже словами написано, но имел в виду письменную речь, а не код. :)
46 BOFFKA
 
08.11.11
16:59
(45) я решил развернуто ответить)))
47 DEVIce
 
08.11.11
17:01
(46). С этим кодом понятно, ты чего хочешь чтобы он стал делать?
48 BOFFKA
 
08.11.11
17:03
мне нужно чтобы он мне дал две записи по 4 шт. Либо одну 8.
49 BOFFKA
 
08.11.11
17:04
Я не понимаю почему двоит. Такая группировка

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

Тоже 16
50 shuhard
 
08.11.11
17:06
(49) ни чё, что вложенный запрос должен идти по партиям ?
51 BOFFKA
 
08.11.11
17:13
ВЫБРАТЬ
   Продажи.Номенклатура,
   Продажи.Количество,
   ПартииТаб.Количество КАК Количество1
ИЗ
   РегистрНакопления.Продажи КАК Продажи
       ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
           ПартииТоваровНаСкладах.Регистратор КАК Регистратор,
           СУММА(ПартииТоваровНаСкладах.Количество) КАК Количество
       ИЗ
           РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
       ГДЕ
           ПартииТоваровНаСкладах.Номенклатура = &Номенклатура
           И ПартииТоваровНаСкладах.Период МЕЖДУ &Период И &кон
           И ПартииТоваровНаСкладах.КодОперации = &КодОперации
       
       СГРУППИРОВАТЬ ПО
           ПартииТоваровНаСкладах.Номенклатура,
           ПартииТоваровНаСкладах.Регистратор) КАК ПартииТаб
       ПО Продажи.Регистратор = ПартииТаб.Регистратор
           И Продажи.Регистратор = ПартииТаб.Регистратор
ГДЕ
   Продажи.Регистратор = &Регистратор

КОличество продажи правильное, но партии задвоены
52 shuhard
 
08.11.11
17:16
(51) пациент безнадёжен
53 BOFFKA
 
08.11.11
17:24
(52) покажи как нужно. вдруг пациент прозреет
54 DEVIce
 
08.11.11
17:28
(48). Щас сделаю:

ВЫБРАТЬ ПЕРВЫЕ 1
   "Номенклатура" КАК Номенклатура,
   8 КАК Количество
ИЗ
   РегистрНакопления.Продажи КАК Продажи
ГДЕ
   Продажи.Регистратор = &Регистратор
55 DEVIce
 
08.11.11
17:29
А не, вот так надо:

ВЫБРАТЬ ПЕРВЫЕ 1
   &Номенклатура КАК Номенклатура,
   8 КАК Количество
ИЗ
   РегистрНакопления.Продажи КАК Продажи
ГДЕ
   Продажи.Регистратор = &Регистратор
56 Buster007
 
08.11.11
17:46
дык и по Период надо тоже связывать.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан