Имя: Пароль:
1C
1С v8
Выборка документов, содержащих ВСЕ значения параметра (список)
0 McCoy
 
08.12.11
15:35
Есть список номенклатуры. Необходимо выбрать все Заказы за период, которые содержат ВСЮ номенклатуру из списка.
Вроде бы все просто: в СКД создаем простейший запрос по Заказам, добавляем параметр &Товар (тот самый список номенклатур), добавляем условие В:

ВЫБРАТЬ РАЗЛИЧНЫЕ
   ЗаказСостав.Ссылка КАК Ссылка
ИЗ
   Документ.Заказ.Состав КАК ЗаказСостав
ГДЕ
   ЗаказСостав.Товар В(&Товар)
   И ЗаказСостав.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

И тут соображаем: выбираются Заказы, содержащие не ВЕСЬ список товара, а содержащие хотя бы одну номенклатуру из списка-параметра &Товар. Как быть? Можно ли решить одним запросом? Кто сталкивался?
1 shuhard
 
08.12.11
15:38
(0) составь список заказов не содержащий данный список номенклатуры и исключи его из своего списка
2 Rovan
 
гуру
08.12.11
15:39
(1) получит то же самое - где хотя бы 1
3 Mort
 
08.12.11
15:39
Сделай таблицу номенклатуры и смотри левым соединением с ТЧ есть ли позиции NULL в правой части (ТЧ)
4 Defender aka LINN
 
08.12.11
15:41
(1) И?
(0) Ну, извратным путем, разве что. Сначала посчитать размер списка (выборкой из справочника), потом искать заказы, где количество строк с номенклатурой из списка равно этому количеству
5 Rovan
 
гуру
08.12.11
15:41
(0) надо в запросе получить кол-во строк ТЧ попавшей в список
и сравнить это кол-во с колвом значений переданного списка - если равно то берем этот док
6 shuhard
 
08.12.11
15:41
(2)
(4)
не а
7 Defender aka LINN
 
08.12.11
15:44
(6) Дада :)
8 Mort
 
08.12.11
15:45
Доктор, меня все игнорируют.
9 Mort
 
08.12.11
15:46
Если нужно 100% чтобы не только был весь список в составе ТЧ, но и лишних не было, можно делать полное соединение и смотреть отсутствие NULLов в обеих частях.
10 McCoy
 
08.12.11
16:11
Нужно чтобы весь список входил в ТЧ документа, но не обязательно чтобы он на 100% совпадал с ТЧ (т.е. может быть и другая номенклатура). Mort, не понял насчет "Сделай таблицу номенклатуры и смотри левым соединением с ТЧ есть ли позиции NULL в правой части (ТЧ)".

Я реализовал задачу. Криво-косо правда. Выяснил что параметр &Товар будет ограничен количеством не более 5 штук. В СКД создал 5 параметров: Товар1, Товар2,... Товар5. И по количеству введенных параметров (могут искать как одну номенклатуру, так и несколько) откорректировал запрос. Получается нечто вроде:

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

Если будут выбраны параметры Товар1 и Товар 5, то текст запроса будет переделан. Если будет выбрано например 3 параметра, добавится еще один вложенный запрос "Товары3", еще одно внутреннее соединение. Криво, косо, неоптимально это все... Не нравится мне это решение. Но из услышанных здесь предложений более оптимального пока не уловил...
11 shuhard
 
08.12.11
16:13
(10) пипец
загрузи свой список во временную таблицу и соедини
тебе ж русским языком Mort объяснил
12 McCoy
 
08.12.11
16:16
shuhard Точно! Балбесина я:) Спасибо Морту)
13 McCoy
 
09.12.11
15:06
Не получается. Можно было попробовать через полное соединение отловить Null, но СКД премило съедает "нули". Погрызу еще эту тему, но кажется уперся в тупик...

P.S. Дядьки, не бейте ногами! Как вы "номерок в кавычках" в сообщении выставляете со ссылкой на сообщение?
14 orefkov
 
09.12.11
16:20
(13)
PS: ты не поверишь...
15 Defender aka LINN
 
09.12.11
16:22
(11) Можно просто запрос к справочнику сделать. Уж там-то наверняка все эти элементы есть, я гарантирую это :)
16 orefkov
 
09.12.11
16:35
я язык запросов 8ки плохо знаю, но на скл это решается примерно так:
ВЫБРАТЬ
   ЗаказСостав.Ссылка КАК Ссылка,
   сумма(1) Как КолСовпадений
ИЗ Документ.Заказ.Состав КАК ЗаказСостав внутреннее соединение ТвояВремТаблица по ЗаказСостав.Товар = ТвояВремТаблица.Товар
группировка по ЗаказСостав.Ссылка
имееющие
сумма(1) = &КоличествоТоваровВСписке
17 McCoy
 
09.12.11
16:52
orefkov отчего же. Чем умничать, подсказал бы)
18 McCoy
 
09.12.11
16:58
orefkov это я про P.S.

Но похоже ты прав насчет количества. Попробую
19 Defender aka LINN
 
09.12.11
17:06
Я это в (4) говорил :)
20 McCoy
 
09.12.11
17:08
(19) я помню, хотелось просто красиво сделать... Но видно иначе не выйдет:)
21 McCoy
 
10.12.11
19:29
Сделал. Ниже запрос, может кому понадобится. УТ на примере документа ЗаказПокупателя. Сравнение идет по количеству товара в списке из параметра запроса и в самих Заказах, как предложил Defender aka LINN Проверял, работает корректно.


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

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

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