Имя: Пароль:
1C
 
Возможно ли получить выборку запросом без использования циклов?
0 slasher
 
18.11.14
14:11
Доброго времени суток всем!

Есть запрос:

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

В списке товаров, например яблоки и груши.
Запросом нужно получить ссылки на документы, в которых есть И яблоки И груши одновременно. А не ИЛИ яблоки ИЛИ груши.
Понятно, что можно сделать в цикле, сначала яблоки, потом груши, но это не вариант. Список товаром может быть большим.
1 Ненавижу 1С
 
гуру
18.11.14
14:12
не поверишь, но в данном случае будет хотя бы ЯБЛОКИ или ГРУШИ
2 Banned
 
18.11.14
14:13
Пить во вторник днём - вредно.
3 Ненавижу 1С
 
гуру
18.11.14
14:13
(0) или тебе "исключающее или" XOR нужно?
4 sapphire
 
18.11.14
14:14
(0) Правильно понимаю, что нужно что бы весь перечень списка был?
5 Maxus43
 
18.11.14
14:16
ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Ссылка,
    Количество(ПоступлениеТоваровУслугТовары.Ссылка)
.....
Имеющие
Количество(ПоступлениеТоваровУслугТовары.Ссылка)=2
6 sapphire
 
18.11.14
14:17
(5) Это если не ведется учет в разрезе серий и характеристик :)
7 Эмбеддер
 
18.11.14
14:18
1) 2 запроса, 1-й - документы с яблоками, 2-й - документы с грушами. СОЕДИНЕНИЕ по документу
2) внутренний запрос - ОБЪЕДИНЕНИЕ, 2 колонки - в первой цифра 1 и 0 во второй, если есть яблоко в строке документа и 0 и 1 соответственно, если груши
СГРУППИРОВАТЬ ПО Документ
ИМЕЮЩИЕ СУММА(КоличествоСтрокГруши)>=1 И СУММА(КоличествоСтрокЯблоки)>=1

и так далее - вариантов много
8 sapphire
 
18.11.14
14:18
(5) А то вполне может статься, что будет
Товар  Хар
Яблоки Ранет
Грушу  Белая
Яблоки Белый налив
9 sapphire
 
18.11.14
14:19
(7) Садись, 2
10 Ненавижу 1С
 
гуру
18.11.14
14:19
ВЫБРАТЬ
    ПоступлениеТоваровУслугТовары.Ссылка
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ
    ПоступлениеТоваровУслугТовары.Номенклатура В(&СписокТоваров)
СГРУППИРОВАТЬ ПО
   ПоступлениеТоваровУслугТовары.Ссылка
ИМЕЮЩИЕ
   Количество(РАЗЛИЧНЫЕ ПоступлениеТоваровУслугТовары.Номенклатура)=2
11 DrZombi
 
гуру
18.11.14
14:19
(0) Лучше так

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

Имеющие Количество(Ралзличное ПоступлениеТоваровУслугТовары.Номенклатура) = &КолНужныхЭлементов
12 Эмбеддер
 
18.11.14
14:20
(9) да мне все равно
13 slasher
 
18.11.14
14:20
(4) да, нужно чтобы весь список был
14 DrZombi
 
гуру
18.11.14
14:21
(13) Смотри в (10), Повнимательней или в (11) :)
15 Maxus43
 
18.11.14
14:21
(8) ну под условия конкретные доработать. Я не вижу чо там у автора. это есно частный случай
16 Эмбеддер
 
18.11.14
14:22
(13) понятно. я то понял, что 1 яблоко и 1 груша и уже документ проходит по условию
17 slasher
 
18.11.14
14:26
(3) не, исключающее или не надо
18 slasher
 
18.11.14
14:28
(5) по-моему фигня получится
19 slasher
 
18.11.14
14:29
(6) характеристик и серий нету
20 Эмбеддер
 
18.11.14
14:29
(18) это правильно решение. сформулируйте условие задачи
21 zsergey
 
18.11.14
14:30
(0) Если я правильно понял задачу, предлагаю так:

//Готовим врем. таблицу
ВЫБРАТЬ
    &Яблоки
ПОМЕСТИТЬ ВремТаб

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    &Груши

;

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

СГРУППИРОВАТЬ ПО
    ПоступлениеТоваровУслугТовары.Ссылка
имеющие КОЛИЧЕСТВО(ПоступлениеТоваровУслугТовары.Номенклатура)=1
22 an-korot
 
18.11.14
14:35
вы примитивную задачку по основам информатики мусолите )))
"как исключить из множества значения принадлежащие другому множеству"
ВЫБРАТЬ
    ТаблицаА.ИзмерениеА
ИЗ
    РегистрСведений.ТаблицаА КАК ТаблицаА
ГДЕ
    (НЕ ТаблицаА.ИзмерениеА В
                (ВЫБРАТЬ
                    ТаблицаА.ИзмерениеА
                ИЗ
                    РегистрСведений.ТаблицаА КАК ТаблицаА ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТаблицаВ КАК ТаблицаВ
                        ПО
                            ТаблицаА.ИзмерениеА = ТаблицаВ.ИзмерениеВ))

//======================================================================

ссылка на полный текст
http://www.1c-h.ru/?p=917
23 slasher
 
18.11.14
14:49
(10) последняя цифра это, как я понял количество элементов списке?
а если в списке будет группа, запрос перестанет работать?
24 antoneus
 
18.11.14
14:52
(23) Почему перестанет? Находишь количество элементов справочника в списке и передаешь в запрос.
25 Ненавижу 1С
 
гуру
18.11.14
14:53
(23) можешь во временной таблице посчитать число входящих элементов
26 Гёдза
 
18.11.14
14:59
через 2 левых соединения делается влет.
Но вот возможно ли для произвольного количества? без формирования текста
27 Гёдза
 
18.11.14
15:00
(26) хотя (11) решает вроде
28 kudlach
 
18.11.14
15:07
Если тебе нужно получить перечень документов, в которых есть каждый товар из списка -

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

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

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

Как ни печально, но множество документов, в которых содержится один конкретный товар нужно выбирать отдельно.
Текст Соединения можешь сделать в цикле по массиву значений, начиная со второго значения. первое - в основной текст включи.
29 Гёдза
 
18.11.14
15:08
ПРЯМОЕ СОЕДИНЕННИЕ
Это что-то новенькое
30 kudlach
 
18.11.14
15:12
(29) да, ВНУТРЕННЕЕ  конечно же. сори.
Я его помню как Inner join, а в 1с 8.х уже двненько надобности не было в нем. Подзапамятовал.
31 kudlach
 
18.11.14
15:15
Ну, кстати, если приложится, то и в (21) с использованием КОЛИЧЕСТВО(...)  есть кусок истины - не в лоб, я бя заценил как нерутинный вариант.
32 slasher
 
18.11.14
15:24
(10)(11) нормально работает
33 slasher
 
18.11.14
15:27
(28) как-то сложно всё, а если 100 товаров? будет 101 запрос?
34 kudlach
 
18.11.14
15:31
(32) да, (10), (11) - проще
(33) если формируется запрос в цикле, то по барабану сколько их.
В скуле, на сколько я помню, аналогичные запросы формируются на порядок быстрее после выполнения первого, но тут, да, 10 вариант менее головоломный.
35 slasher
 
18.11.14
15:49
всем спасибо за помощь