Имя: Пароль:
1C
1С v8
v8: Помогите разобраться с соединениями в запросе
,
0 sashka2009
 
01.07.13
10:47
ЗАдача следующая - Получить остатки по оптовому складу, и, если по этим позициям есть остаток на Розничном складе, вывести остаток. Отборы: склад оптовый, склад розничный, остаток на розничном складе... остаток на розничном складе - это фильтр , который работает по принципу: на розничном остаток больше Дельты - выводим в отчет данные. Склады оптовые и розничные могут меняться фильтрами. Отчет нужен чтобы во время с оптового склада переместить товар, который закончился на розничном складе. Запрос написал, но проблема в том, что он работает по принципу если есть остаток на оптовом складе, то он выведет остаток на розничном. НО, если на розничном остатка нет - он этот товар и по оптовому складу не покажет!
1 sashka2009
 
01.07.13
10:48
ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
                  |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
                  |    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
                  |    ТоварыНаСкладахОстатки.СерияНоменклатуры,
                  |    ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0) КАК Остаток,
                  |    ЕСТЬNULL(ВложенныйЗапрос.ОстатокРезерв, 0) КАК ОстатокРезерв,
                  |    ТоварыНаСкладахОстатки.Склад,
                  |    ВложенныйЗапрос.СкладРозница
                  |{ВЫБРАТЬ
                  |    Номенклатура.*,
                  |    ХарактеристикаНоменклатуры.*,
                  |    СерияНоменклатуры.*,
                  |    Остаток,
                  |    ОстатокРезерв,
                  |    Склад.*,
                  |    СкладРозница.*}
                  |ИЗ
                  |    РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКон, ) КАК ТоварыНаСкладахОстатки
                  |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                  |            ТоварыВРезервеНаСкладахОстатки.Номенклатура КАК Номенклатура,
                  |            ТоварыВРезервеНаСкладахОстатки.Склад КАК СкладРозница,
                  |            ТоварыВРезервеНаСкладахОстатки.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
                  |            ТоварыВРезервеНаСкладахОстатки.СерияНоменклатуры КАК СерияНоменклатуры,
                  |            ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, 0) КАК ОстатокРезерв
                  |        ИЗ
                  |            РегистрНакопления.ТоварыВРознице.Остатки(&ДатаКон, ) КАК ТоварыВРезервеНаСкладахОстатки) КАК ВложенныйЗапрос
                  |        ПО ТоварыНаСкладахОстатки.Номенклатура = ВложенныйЗапрос.Номенклатура
                  |{ГДЕ
                  |    ТоварыНаСкладахОстатки.Склад.*,
                  |    ТоварыНаСкладахОстатки.Номенклатура.*,
                  |    ВложенныйЗапрос.СкладРозница.*,
                  |    (ЕСТЬNULL(ВложенныйЗапрос.ОстатокРезерв, 0)) КАК ОстатокРезерв}
                  |{УПОРЯДОЧИТЬ ПО
                  |    Номенклатура.*}
                  |ИТОГИ
                  |    СУММА(Остаток),
                  |    СУММА(ОстатокРезерв)
                  |ПО
                  |    ОБЩИЕ
                  |{ИТОГИ ПО
                  |    Номенклатура.*}
                  |АВТОУПОРЯДОЧИВАНИЕ";
2 Mitriy
 
01.07.13
10:49
левое соединение и условия в соединении, а не в где...
3 Mitriy
 
01.07.13
10:49
(2)+ про левое соединение можно не читать...
4 Галахад
 
гуру
01.07.13
10:51
Это чо?
ПО ТоварыНаСкладахОстатки.Номенклатура = ВложенныйЗапрос.Номенклатура
5 sashka2009
 
01.07.13
10:51
В "ГДЕ" условия помещены, т.к. запрос находится в процедуре Процедура УстановитьНачальныеНастройки(ДополнительныеПараметры = Неопределено) Экспорт
чтобы потом пользоваться Универсальным отчетом
6 Галахад
 
гуру
01.07.13
10:52
Тфу. Нфига вложенный запрос вообще?
7 sashka2009
 
01.07.13
10:54
у меня до этого было и невложенным.... работают одинаково неправильно ((((...
8 Bober
 
01.07.13
10:57
(0)
" Получить остатки по оптовому складу, и, если по этим позициям есть остаток на Розничном складе, вывести остаток."
...
"Отчет нужен чтобы во время с оптового склада переместить товар, который закончился на розничном складе. "

все правильно?
9 Галахад
 
гуру
01.07.13
10:57
(7) Смотри (2)

Убери
                  |    ВложенныйЗапрос.СкладРозница.*,
                  |    (ЕСТЬNULL(ВложенныйЗапрос.ОстатокРезерв, 0)) КАК ОстатокРезерв}
10 Bober
 
01.07.13
10:58
(0) в этой ситуации нужно делать запросы через объединение

ВЫБРАТЬ ...
(
ВЫБРАТЬ ...
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ ...) КАК Данные
СГРУППИРОВАТЬ ПО
11 sashka2009
 
01.07.13
11:00
А через ОБЪЕДИНИТЬ ВСЕ будет универсальный отчет работать?
12 Bober
 
01.07.13
11:01
(11) будет, (лучше конечнео на записать в СКД) только не забудь выставить управляющие конструкции
13 sashka2009
 
01.07.13
11:02
через СКД пользователям не удобно
14 Bober
 
01.07.13
11:03
(1) из выборок выкинуть склады, оставить только в параметров внурт таблиц.

Делается это так:
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКон, {Склад.* КАК ОптовыйСклад})
15 sashka2009
 
01.07.13
11:04
Убери
                  |    ВложенныйЗапрос.СкладРозница.*,
                  |    (ЕСТЬNULL(ВложенныйЗапрос.ОстатокРезерв, 0)) КАК ОстатокРезерв}   если я это уберу - то отбор по Розничному складу работать не будет
16 Bober
 
01.07.13
11:07
(15) если сделать через объединение, то такие конструкции не потребуются
17 sashka2009
 
01.07.13
11:08
сделал через РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКон, {Склад.* КАК ОптовыйСклад}) , вроде работает, щас тестирую
18 sashka2009
 
01.07.13
11:13
Спасибо! Пока все круто )
19 Bober
 
01.07.13
11:14
(18) сделал через объединение?
20 sashka2009
 
01.07.13
11:15
Нет, оставил вложенный запрос, только убрал склады из "ГДЕ" и вставил в РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКон, {Склад.* КАК ОптовыйСклад})
21 Bober
 
01.07.13
11:49
(20) не айс.
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан