Имя: Пароль:
1C
1C 7.7
v7: ПрямойЗапрос: как правильно собрать все в кучу (Номенклатура, Штрихкод)
, ,
0 Dolly_EV
 
31.03.14
15:57
Есть табличка (#тзПрайс) поставщика с колонками 'ID' и 'EANCode'
Есть Спр.Номенклатура и Спр.ШтрихКод, подчиненный "Номенклатуре" (почти как в ТиС)
Есть документы 'РасходнаяНакладная', 'РасходнаяРозница' ("+") и 'Возврат' ("-")

Вопрос:
Как одним запросом собрать все в кучу вида
'ДатаДок','ID','Кво'?

Засада в том, что ШтрихКодов, подчиненных Спр.Номенклатура может быть несколько
для одной позиции Номенклатуры.

Вот такой запрос

    ТекстЗапроса="
    |ВЫБРАТЬ
    |    ВыборкаДок.ДатаДок КАК [ДатаДок $Дата]
    |    ,ВыборкаДок.Товар КАК [Товар $Справочник.Номенклатура]
    |    ,МАКСИМУМ($СпрШК.Штрихкод) КАК ШК
    |    ,МАКСИМУМ(тзПрайс.ID) КАК ИД
    |    ,СУММА(ВыборкаДок.Кво) КАК Кво
    |ИЗ("+ТекстЗапроса+") КАК ВыборкаДок
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |    Справочник.ШтрихКодСпр КАК СпрШК $nolock
    |ПО
    |    $СпрШК.Владелец = ВыборкаДок.Товар
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |    #тзПрайс КАК тзПрайс
    |ПО
    |    $СпрШК.ШтрихКод = тзПрайс.EANCode
    |СГРУППИРОВАТЬ
    |    ВыборкаДок.ДатаДок, ВыборкаДок.ТТ, ВыборкаДок.Товар";

Возвращает неправильное Кво (увеличенное на кол-во дублей Штихкодов для товара)

Пы.Сы. в серединке     |ИЗ("+ТекстЗапроса+") КАК ВыборкаДок
ТекстЗапроса = запрос к документам и их ТЧ через UNION ALL
1 Dolly_EV
 
31.03.14
15:59
вот ДенисЧ мне сейчас поможет))
2 AntonU
 
31.03.14
16:39
Мне кажется, это v8 -)))
3 Dolly_EV
 
31.03.14
16:43
(2) не, это V7, класс "ПрямойЗапрос", да не суть важно. Тут у меня с логикой проблемы :-(
4 viktor_vv
 
31.03.14
16:44
"ШтрихКодов, подчиненных Спр.Номенклатура может быть несколько
для одной позиции Номенклатуры."

имеется ввиду одинаковых штрихкодов может быть несколько для одной номенклатуры?
5 viktor_vv
 
31.03.14
16:45
(4)+ Если да и все равно какой элемент справочника Шрихкодов возьместя, то загони вначале вопроменную таблицу справочник штрихкодов, скгруппированный по владельцу и штрихкоду и максимум(по ссылке).
6 viktor_vv
 
31.03.14
16:46
* во временную таблицу
7 КонецЦикла
 
31.03.14
16:47
Штрихкод любой что ли?
Базовая единица есть?
8 КонецЦикла
 
31.03.14
16:49
Зачем выводить ШК если он есть в прайсе и по нему соединение?
9 viktor_vv
 
31.03.14
16:52
(8) Это он скорее всего соотвествие хочет получить Товар в базе и ID  в прайсе.
10 ikea
 
31.03.14
16:52
(0) На величину Кво количество штрих-кодов никак не влияет. У тебя группировка по реквизитам документа и только потом соединение с сгруппированной выборкой.
11 КонецЦикла
 
31.03.14
16:53
(10) Если бы он группировал во вложенном запросе или во временной таблице - таки да...
12 akaBrr
 
31.03.14
17:01
(11) Вот собственно и решение
13 Дык ё
 
31.03.14
17:23
(11) при такой структуре можно и без группировки засада будет только, если одной номенклатуре соответствует несколько ID
14 Dolly_EV
 
01.04.14
03:28
(9) Это и хочу, да.
(13) даже две засады: несколько ШК для одного Товара и (теоретически) несколько ID для одного ШК.
в общем связать надо Товар с тзПрайс через Спр.Шк и EANCode
15 Dolly_EV
 
01.04.14
05:06
Все, разобрался...вот так взлетело:
    ТекстЗапроса="
    |ВЫБРАТЬ
    |    ВыборкаДок.ДатаДок КАК [ДатаДок $Дата]
    |    ,ВыборкаДок.Товар КАК [Товар $Справочник.Номенклатура]
    |    ,МАКСИМУМ(СпрШК.Штрихкод) КАК ШК
    |    ,МАКСИМУМ(тзПрайс.ID) КАК ИД
    |    ,СУММА(ВыборкаДок.Кво) КАК Кво
    |ИЗ("+ТекстЗапроса+") КАК ВыборкаДок
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |    (ВЫБРАТЬ
    |        $СпрШК.Владелец КАК Товар
    |        ,МАКСИМУМ($СпрШК.Штрихкод) КАК Штрихкод
    |    ИЗ    Справочник.ШтрихКодСпр КАК СпрШК $nolock
    |    ГДЕ 1000=1000
    |    СГРУППИРОВАТЬ $СпрШК.Владелец) КАК СпрШК
    |ПО
    |    СпрШК.Товар = ВыборкаДок.Товар
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |    #тзПрайс КАК тзПрайс
    |ПО
    |    СпрШК.ШтрихКод = тзПрайс.EANCode
    |СГРУППИРОВАТЬ
    |    ВыборкаДок.ДатаДок, ВыборкаДок.ТТ, ВыборкаДок.Товар";

Соответственно, если тзПрайс не уникальна по 'EANCode' - ее тоже в подзапрос.

Но остается один большой минус: МАКСИМУМ($СпрШК.Штрихкод) вернет один бОльший ШК. А если это не тот ШК, который нужен для поиска по 'EANCode' ? :-(
16 Dolly_EV
 
01.04.14
13:36
+(15)
Вот так будет совсем правильно:

    ТекстЗапроса="
    |ВЫБРАТЬ
    |    ВыборкаДок.ДатаДок КАК [ДатаДок $Дата]
    |    ,ВыборкаДок.ТТ КАК [ТТ $Справочник.ТоргТочки]
    |    ,МАКСИМУМ(ВыборкаДок.Контр_ИННКПП) КАК Контр_ИННКПП
    |    ,МАКСИМУМ(ВыборкаДок.ТТ_КПП) КАК ТТ_КПП
    |    ,МАКСИМУМ(ВыборкаДок.АдресТТ) КАК АдресТТ
    |    ,ВыборкаДок.Товар КАК [Товар $Справочник.Номенклатура]
    |--    ,МАКСИМУМ(СпрШК.Штрихкод) КАК ШК
    |    ,МАКСИМУМ(СпрШК.ИД) КАК ИД
    |    ,СУММА(ВыборкаДок.Кво) КАК Кво
    |ИЗ("+ТекстЗапроса+") КАК ВыборкаДок
    |ЛЕВОЕ СОЕДИНЕНИЕ
    |    (ВЫБРАТЬ
    |        $СпрШК.Владелец КАК Товар
    |        ,МАКСИМУМ($СпрШК.Штрихкод) КАК Штрихкод
    |        ,МАКСИМУМ(тзПрайс.ID) КАК ИД
    |    ИЗ    Справочник.ШтрихКодСпр КАК СпрШК $nolock
    |    ЛЕВОЕ СОЕДИНЕНИЕ
    |        #тзПрайс КАК тзПрайс
    |    ПО    $СпрШК.ШтрихКод = тзПрайс.EANCode
    |    ГДЕ 1000=1000
    |    СГРУППИРОВАТЬ $СпрШК.Владелец) КАК СпрШК
    |ПО
    |    СпрШК.Товар = ВыборкаДок.Товар
    |СГРУППИРОВАТЬ
    |    ВыборкаДок.ДатаДок, ВыборкаДок.ТТ, ВыборкаДок.Товар";
17 Dolly_EV
 
01.04.14
13:38
(9)(11) @  viktor_vv, КонецЦикла
Спасибо за пинок в нужном направлении!
18 dk
 
01.04.14
14:00
может и не критично, но я бы поменял все левые на внутренние соединения
19 Dolly_EV
 
01.04.14
14:14
(18) не, на внутр не надо. Мне надо, чтобы товар, по которому не найден ИД из тзПрайс, тоже отображался в итоговой таблице