Имя: Пароль:
1C
1С v8
Объединение запроса
, ,
0 pessok
 
29.03.12
10:52
Народ, что-то туплю, подскажите плз...
Есть простенький запросец
ВЫБРАТЬ
   ВложенныйЗапрос.Номенклатура,
   ВложенныйЗапрос.ХарактеристикаНоменклатуры,
   ВложенныйЗапрос.ЦелевойУровень КАК ЦелевойУровень,
   ВложенныйЗапрос.КоличествоОстаток КАК КоличествоОстаток,
   ВложенныйЗапрос.КоличествоЗаказано КАК КоличествоЗаказано,
   ЗаказыПоставщикамОстатки.ЗаказПоставщику
ИЗ
   (ВЫБРАТЬ
       ПараметрыЗакупкиНоменклатуры.Номенклатура КАК Номенклатура,
       ПараметрыЗакупкиНоменклатуры.ХарактеристикиНоменклатуры КАК ХарактеристикаНоменклатуры,
       ПараметрыЗакупкиНоменклатуры.ЦелевойУровень КАК ЦелевойУровень,
       0 КАК КоличествоОстаток,
       0 КАК КоличествоЗаказано,
       NULL КАК ЗаказПоставщику
   ИЗ
       РегистрСведений.ПараметрыЗакупкиНоменклатуры КАК ПараметрыЗакупкиНоменклатуры
   ГДЕ
       ПараметрыЗакупкиНоменклатуры.Номенклатура В ИЕРАРХИИ(&Номенклатура)
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       ТоварыНаСкладахОстатки.Номенклатура,
       ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
       0,
       ТоварыНаСкладахОстатки.КоличествоОстаток,
       0,
       NULL
   ИЗ
       РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&Период, ДЕНЬ), Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ТоварыНаСкладахОстатки
   
   ОБЪЕДИНИТЬ
   
   ВЫБРАТЬ
       ЗаказыПоставщикамОстатки.Номенклатура,
       ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры,
       0,
       0,
       ЗаказыПоставщикамОстатки.КоличествоОстаток,
       ЗаказыПоставщикамОстатки.ЗаказПоставщику
   ИЗ
       РегистрНакопления.ЗаказыПоставщикам.Остатки(КОНЕЦПЕРИОДА(&Период, ДЕНЬ), Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ЗаказыПоставщикамОстатки) КАК ВложенныйЗапрос
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки КАК ЗаказыПоставщикамОстатки
       ПО ВложенныйЗапрос.ЗаказПоставщику = ЗаказыПоставщикамОстатки.ЗаказПоставщику

В результате получается, что во вложенном запросе, при условии, что есть и заказ и остатки на складе по одной номенклатуре формируется две строки, где
1) ЗаказПоставщику - ссылка на доку
2) ЗаказПоставщику - Неопределено.
Пробовал делать вместо Неопределено ЗНАЧЕНИЕ(Документ.ЗаказПоставщику.ПустаяСсылка), не взлетает. С утра что-то туплю, не выспался... ПОдскажите плз, как сгруппировать объединение правильно :)
1 pessok
 
29.03.12
10:53
вместо NULL т.е.
2 Ненавижу 1С
 
гуру
29.03.12
10:54
что хотим то?
3 Kashemir
 
29.03.12
10:55
Объединение сначала сверни(сгруппируй), а потом присоединяй заказы
4 Kashemir
 
29.03.12
10:56
(3) А хотя в твоем случае не поможет.
5 cViper
 
29.03.12
10:56
(0) Зачем вот это " ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПоставщикам.Остатки КАК ЗаказыПоставщикамОстатки
       ПО ВложенныйЗапрос.ЗаказПоставщику = ЗаказыПоставщикамОстатки.ЗаказПоставщику"
6 cViper
 
29.03.12
10:57
У тебя в регистры неопределено пишется?
7 pessok
 
29.03.12
10:59
(2) хотим отчет, в котором в строку будет Заказ - Остаток на складе - Остаток по заказу ну и остальные поля
(3) не взлетит, угу
(5) да не нужно по идее это левое соединение, можно из вложенного выводить, разницы никакой
(6) в регистрах измерения ЗаказПоставщику нету (ТоварыНаСкладах, ПараметрыЗакупки)
8 cViper
 
29.03.12
11:01
(7) Поэтому и спрашиваю. Разница в том что это влияет на производительность, отрицательно влияет.
9 cViper
 
29.03.12
11:03
(7) Так а зачем ты делаешь объединить? Делай соединение по номенклатуре.
10 pessok
 
29.03.12
11:07
(8) да это я просто не убрал. Объединение надо, т.к. три разных регистра, и выводить надо если есть записи хотя бы в одном
11 Kashemir
 
29.03.12
11:07
(7) У тебя ресурсы вроде не пересекаются
Путь минимального вмешательства в твой запрос но довольно топорный по реализации:
сгруппировать объединение по Номенклатура и Характеристике, агрегация сумм по ресурсам и агрегация ЗаказПоставщику через максимум. Правда что такое ЦелевойУровень у тебя хз
12 cViper
 
29.03.12
11:09
(10) По хорошему, тебе бы еще товары в резерве надо учитывать.
13 cViper
 
29.03.12
11:12
ВЫБРАТЬ
   ЗаказыПоставщикамОстатки.ЗаказПоставщику КАК ЗаказПоставщику,
   ЗаказыПоставщикамОстатки.Номенклатура КАК Номенклатура,
   ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
   ЗаказыПоставщикамОстатки.КоличествоОстаток КАК КоличествоЗаказано,
   ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
   ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК КоличествоЗарезервировано
ИЗ
   РегистрНакопления.ЗаказыПоставщикам.Остатки(КОНЕЦПЕРИОДА(&Период, ДЕНЬ), Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ЗаказыПоставщикамОстатки
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&Период, ДЕНЬ), Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ТоварыНаСкладахОстатки
       ПО ЗаказыПоставщикамОстатки.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
           И ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(КОНЕЦПЕРИОДА(&Период, ДЕНЬ), Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ТоварыВРезервеНаСкладахОстатки
       ПО ЗаказыПоставщикамОстатки.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
           И ЗаказыПоставщикамОстатки.ХарактеристикаНоменклатуры = ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры
14 Kashemir
 
29.03.12
11:21
+(11) P.s. взлетит только если тебя интересует вывод 1 произвольный заказ и множества номенклатура+характеристика.

Вообще такие задачи проще всего соединением наборов с СКД решать. Где в одном наборе будет итог для множества (ресурсы первых двух таблиц) и присоединение уточняющего набора по заказам. Либо же значения ресурсов первых двух таблиц надо пропорционально раскидать по заказам (кинуть на пустой если нет ни одного)
15 pessok
 
29.03.12
11:25
(14) инетересуте вывод как раз наоборот. в общем вопрос отпал сам собой, будем оставлять две строки :)
но спасибо за участие. объединение наборов надо покурить, не использовал никогда
16 Kashemir
 
29.03.12
11:28
(15) Объединение наборов курить не надо, покури соединение :)
17 cViper
 
29.03.12
11:29
(15) Тебе в (14) написали то что тебе нужно. Проанализируй внимательно.
18 Kashemir
 
29.03.12
11:30
(15) Кстати строк будет не 2, а 1 + количество заказов
19 Kashemir
 
29.03.12
11:32
(17) И как будет выглядеть результат твоего запроса на примере ниже ?

остатки:
Номенклатура1 Характеристика1 Остаток=100

Заказы:
Номенклатура1 Характеристика1 Заказ1 КвоЗаказа=20
Номенклатура1 Характеристика1 Заказ2 КвоЗаказа=30
20 Kashemir
 
29.03.12
11:36
+(19) Вопрос к (15)  :)
21 pessok
 
29.03.12
11:39
не нужно мне соединения, я ж говорю. ОБЯЗАТЕЛЬНО надо выводить инфу по всем трем источникам данных, а не прицеплять одно к другому
(19) Уоряво будет выглядеть, согласен. В общем оставляю так, как есть сейчас. Так все выводится корректно.
22 cViper
 
29.03.12
11:48
(21) так тебе нужно выводить все остатки вне зависимости от того, были ли сделаны на них заказы?
23 pessok
 
29.03.12
12:27
(22) от именно :)
24 pessok
 
29.03.12
12:28
+(23) я как бы прекрасно понимаю разницу между соединением и объединением, и то, когда что надо использовать :)
затык был именно с группировками, но (19) убедил меня, что надо спать дольше :)
25 Kashemir
 
29.03.12
12:42
(24) Пример как вывести данные с разной детализацией и общими итогами

Набор 1: Изм: Субконто1, ресурс остаток
Набор 2: Изм: Субконто1, Субконто2, ресурс оборот.
соединение наборов по субконто1

http://s019.radikal.ru/i609/1203/d3/3136352c5e74.jpg
26 pessok
 
29.03.12
12:55
(25) вот за это спасибо отдельное!
27 Kashemir
 
29.03.12
12:56
(26) На здоровье :)
2 + 2 = 3.9999999999999999999999999999999...