Имя: Пароль:
1C
1С v8
Получить запросом документ содержащий определенный список позиций номенклатуры
,
0 Торин
 
13.02.13
15:28
Уважаемые коллеги!
Нужна идея - как запросом выбрать те документы продаж, в которых присутствует  некоторый набор позиций номенклатуры, определяемый пользователем? Набор должен быть ВЕСЬ ЦЕЛИКОМ -- т.е. только те реализации, в которых ОДНОВРЕМЕННО ЕСТЬ и ном1 и ном2 и ном3?
Количество позиций в наборе и сами позиции определяются пользователем и заранее неизвестны...
Отчет для отдела маркетинга -- пытаются таким образом оценить эффективность акций типа "3+1", "4+1"...
1 mikecool
 
13.02.13
15:29
выбрать список номенклатуры
внутреннее соединение с табличными частями и взять ссылки
2 Торин
 
13.02.13
15:32
(1) это если бы количество позиций было бы каждый раз одинаковым... тогда да - отбор например по 3 табличным частям и три внутренних соединения...
3 Fragster
 
гуру
13.02.13
15:32
у нас акция в реквизит регистра Продажи пишется...
4 Торин
 
13.02.13
15:33
Но у меня количество неизвестно и в общем случае вполне может быть двузначным числом...
5 Fragster
 
гуру
13.02.13
15:33
но у нас нетленка. В типовой можно отдельный регистр под это дело запилить, чтобы сильно не корежить.
6 mikecool
 
13.02.13
15:33
(2) "это если бы количество позиций было бы каждый раз одинаковым" почему? или я тчто то не понял?
7 Fragster
 
гуру
13.02.13
15:33
тогда просто отбор по акции в отчете ставить можно
8 Торин
 
13.02.13
15:34
здесь стоит стандартная практически недоработанная УТ 10.3. Акция фиксируется документом "установка скидок" требуется проверить как изменились продажи определенных сочентаний товаров...
9 Торин
 
13.02.13
15:34
(6) тогда я не понял... можно подробнее?
10 mikecool
 
13.02.13
15:35
(9) внутреннее соединение должно выдать только те ссылки, где набор выбранной номенклатуры полностью входит в документ
11 GANR
 
13.02.13
15:36
левым соединением подцепить к ТЧ документов временную таблицу с нужной номенклатурой
...
ввести поле
СУММА(ВЫБОР
КОГДА
 ВТ_Номенклатура.Ссылка is null
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) ОтсутствующиеПоля
...
ИМЕЮЩИЕ
СУММА(ВЫБОР
КОГДА
 ВТ_Номенклатура.Ссылка is null
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ) = 0

Идея ясна? Как-то так...
12 mikecool
 
13.02.13
15:36
+10 хотя надо проверить
13 Торин
 
13.02.13
15:36
(10) вот КАК написать такое условие -- это-то я и спрашиваю...
14 Fragster
 
гуру
13.02.13
15:36
(9) берешь запрос к справочнику номенклатуры, на него отбор В Списке, помещаешь во временную таблицу. потом эту таблицу соединяешь уже с документами. из результата соединения убираешь строки, где количество строк в документе меньше количества строк во времеенной таблице
15 Fragster
 
гуру
13.02.13
15:37
но это наркомания, правильнее запилить при проведении документа заполнение данных
16 GANR
 
13.02.13
15:37
(13) Соединение, группировки и выбор надо особым образом использовать. Условие - никак.
17 mikecool
 
13.02.13
15:38
(14) зачем там временная таблица? и без нее спокойно
18 mikecool
 
13.02.13
15:38
(13) так я в (1) уже все расписал
19 Fragster
 
гуру
13.02.13
15:39
(17) без нее внутри запроса не получится определить, сколько же пользователь напихал в свой список. ну, конечно можно это отдельным параметром передавать...
20 GANR
 
13.02.13
15:40
(18) Тогда не весь список попасть может, а только часть. Левое соединение нужно задействовать.
21 Торин
 
13.02.13
15:40
(18)"внутреннее соединение должно выдать только те ссылки, где набор выбранной номенклатуры полностью входит в документ" -- нет, не дает, выдает все документы, где есть хотя бы одна позиция...
22 mikecool
 
13.02.13
15:40
(19) вложенный подзапрос
23 Торин
 
13.02.13
15:40
а нужно именно все
24 mikecool
 
13.02.13
15:42
Выбрать Ссылка
Из ТабличнаяЧасть
внутреннее соединение
(выбрать ссылка Из Справочник.Номенклатура Где Ссылка В(&Список)) Как _Номенклатура По ТабличнаяЧасть.Номенклатура = _Номенклатура.Ссылка

так?
25 Торин
 
13.02.13
15:42
пока самым реальным выглядит (11)
начинаю писать...
26 GANR
 
13.02.13
15:43
(23) Внимательно присмотритесь к (11).
27 Торин
 
13.02.13
15:43
(24) да, так и написал -- не работает...
28 mikecool
 
13.02.13
15:45
какие левые соединения?
29 ПиН
 
13.02.13
15:46
ха, ишь хитрый какой, запрос за 10 минут написал и думает, что он работать будет...
30 Serg_1960
 
13.02.13
15:46
Взять набор номенклатуры, соединить с табличными частями, выбрав различные. Потом сгрупировать записи по ссылке с количеством ссылок, отсортировать по количеству и отобрать только те записи, в которых количество равно количеству в наборе номенклатуры.
31 GANR
 
13.02.13
15:47
(28) Это необходимо, чтобы определить, есть ли в списке номенклатуры  о т с у т с т в у ю щ и е  в ТЧ позиции. Если есть - бракуем документ.
32 Тролль главный
 
13.02.13
15:52
ВЫБРАТЬ
   Товары.Номенклатура
ПОМЕСТИТЬ Товары
ИЗ
   &Товары КАК Товары
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   СУММА(1) КАК КоличествоТовара
ПОМЕСТИТЬ Количества
ИЗ
   Товары КАК Товары
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   РеализацияТоваровУслугТовары.Ссылка
ИЗ
   Товары КАК Товары
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
       ПО Товары.Номенклатура = РеализацияТоваровУслугТовары.Номенклатура,
   Количества КАК Количества

СГРУППИРОВАТЬ ПО
   РеализацияТоваровУслугТовары.Ссылка,
   Количества.КоличествоТовара

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РеализацияТоваровУслугТовары.Номенклатура) = Количества.КоличествоТовара
33 GANR
 
13.02.13
15:57
(28)А вот это (32) альтернатива. Хотя ЛС, кажется, шустрей будет.
35 mikecool
 
13.02.13
15:59
(31) зачем выбирать заранее не нужные документы? чтобы два раза обработать выборку?
36 mikecool
 
13.02.13
16:00
хоть убейте меня, но считаю что грех пользоваться временными таблицами если их результат используется всего один раз
37 Тролль главный
 
13.02.13
16:03
(11) один товар может быть в нескольких строках одного документа
(36) допросишься ))
38 GANR
 
13.02.13
16:08
(37) Тогда МАКСИМУМ вместо сумма
39 Торин
 
13.02.13
16:16
Тема закрыта Огромное спасибо  Тролль главный(32). Все заработало... Спасибо всем  участникам за поддержку интереса к задачке...
40 GANR
 
13.02.13
16:25
(34) В дворники пора идти - свежий воздух, хорошая нагрузка. Нда... (11) Кажется, надо к списку номенклатуры слева присоединять ТЧ документа, а не наоборот - без консоли не видно.
41 mikecool
 
13.02.13
16:26
(40) вот ты упертый... левое соединение не даст правильного результата
42 mikecool
 
13.02.13
16:26
+41 вернее возможно и даст но с использованием лишних телодвижений
43 GANR
 
13.02.13
16:33
(42) Даст, делал года 2 назад похожие запросы на MS SQL только.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший