Имя: Пароль:
1C
 
Соединение в запросе по двум признакам
,
0 kalisto
 
16.09.15
00:36
Доброго времени суток, всем.
Есть запрос, который выбирает данные из двух регистров:
ВЫБРАТЬ
    ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ПартииТоваровНаСкладах.ДокументДвижения <> НЕОПРЕДЕЛЕНО
            ТОГДА ПартииТоваровНаСкладах.ДокументДвижения
        ИНАЧЕ ПартииТоваровНаСкладах.Регистратор
    КОНЕЦ КАК Регистратор,
    СУММА(ВЫБОР
            КОГДА НЕ ПартииТоваровНаСкладах.ДокументОприходования ССЫЛКА Документ.ОприходованиеТоваров
                ТОГДА ВЫБОР
                        КОГДА ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                            ТОГДА ПартииТоваровНаСкладах.Стоимость * -1
                        ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
                    КОНЕЦ
            ИНАЧЕ ВЫБОР
                    КОГДА НЕ ПартииТоваровНаСкладахУценка.ДокументОприходования.Уценка
                        ТОГДА ВЫБОР
                                КОГДА ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                                    ТОГДА ПартииТоваровНаСкладах.Стоимость * -1
                                ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
                            КОНЕЦ
                    ИНАЧЕ ПартииТоваровНаСкладахУценка.Стоимость
                КОНЕЦ
        КОНЕЦ) КАК СтоимостьОборот
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладахУценка КАК ПартииТоваровНаСкладахУценка
        ПО ПартииТоваровНаСкладах.Номенклатура = ПартииТоваровНаСкладахУценка.Номенклатура
            И ПартииТоваровНаСкладах.Регистратор = ПартииТоваровНаСкладахУценка.ДокументДвижения
ГДЕ
    ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    И ПартииТоваровНаСкладахУценка.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    И ПартииТоваровНаСкладах.Номенклатура = &НоменклатураСсылка
    И ПартииТоваровНаСкладахУценка.Номенклатура = &НоменклатураСсылка
{ГДЕ
    ПартииТоваровНаСкладах.Номенклатура.* КАК Номенклатура,
    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры}

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладах.Номенклатура,
    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
    ВЫБОР
        КОГДА ПартииТоваровНаСкладах.ДокументДвижения <> НЕОПРЕДЕЛЕНО
            ТОГДА ПартииТоваровНаСкладах.ДокументДвижения
        ИНАЧЕ ПартииТоваровНаСкладах.Регистратор
    КОНЕЦ
Но в результат попадают не все докумменты из Регистра ПартииТоваровНаСкладах. Оказалось все просто. Если в документе нет движений по регистру ПартииТоваровНаСкладахУценка, то документ не попадпет в список. Т.е. если закомментировать строку ПартииТоваровНаСкладах.Регистратор = ПартииТоваровНаСкладахУценка.ДокументДвижения, то документ в список попадает, но получается полная ерунда. Вопрос в том, как отобрать в том числе и те документы, у которых нет движений по регистру ПартииТоваровНаСкладахУценка.
1 Aleksandr N
 
16.09.15
00:42
(0) Думаю, что условия:
И ПартииТоваровНаСкладахУценка.Период МЕЖДУ &ДатаНачала И &ДатаКонца
   И ПартииТоваровНаСкладахУценка.Номенклатура = &НоменклатураСсылка
в вашем случае лучше поставить в условия соединения, т.к. в противном случае у вас получается не совсем левое соединение.
2 Сияющий в темноте
 
16.09.15
00:46
У него тпи вообще соединения нет,так как он отбирает по номенклатуре,и логичнее просто сделать выборку по документам в отдельную таблицу а потом из этой таблицы вытянуть дпныве с соединением с регистрами,т будет null,если какого то регистра нет
3 Aleksandr N
 
16.09.15
00:48
(2) Согласен. Предполагаю, что это лучше сделать через временную таблицу.
4 kalisto
 
16.09.15
01:16
Подскажите, как будет выглядеть запрос с использованием временной таблицы. С запросами только начала разбираться, поэтому с построением текстов запросов еще не очень...
5 hhhh
 
16.09.15
10:54
(4) просто  ПартииТоваровНаСкладахУценка перенеси из ГДЕ в ПО. Не надо никаких таблиц
6 bootini
 
16.09.15
11:14
(5) Все таки лучше конечно виртуальные таблицы оборот регистров накопления использовать, а не физические ну и условия в ГДЕ по регистру уценки лишние, у него связи и так стоят.
7 kalisto
 
16.09.15
11:18
Условия в ГДЕ я убрала уже. И просьба, может кто дать ссылку на хорошую статью по виртуальным таблицам. Доделать бы уже этот отчет и забыть. Может кто еще приблизительно код подскажет, будут благодарна.
8 olegves
 
16.09.15
11:19
(5) +100 все условия по уценке убрать из ГДЕ в соедиинение
9 kalisto
 
16.09.15
11:50
(8) Убрала уже.
10 bootini
 
16.09.15
12:23
(7)
Много статей по виртуальным таблицам, вот например:

http://www.develplatform.com/2013/06/1_23.html
11 Aleksandr N
 
17.09.15
02:40
(9) Не получилось?
12 Aleksandr N
 
17.09.15
02:56
(9) Попробуйте так:
ВЫБРАТЬ
    ПартииТоваровНаСкладах.Номенклатура КАК Номенклатура,
    ВЫБОР
        КОГДА ПартииТоваровНаСкладах.ДокументДвижения <> НЕОПРЕДЕЛЕНО
            ТОГДА ПартииТоваровНаСкладах.ДокументДвижения
        ИНАЧЕ ПартииТоваровНаСкладах.Регистратор
    КОНЕЦ КАК Регистратор,
    СУММА(ВЫБОР
            КОГДА НЕ ПартииТоваровНаСкладах.ДокументОприходования ССЫЛКА Документ.ОприходованиеТоваров
                ТОГДА ВЫБОР
                        КОГДА ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                            ТОГДА ПартииТоваровНаСкладах.Стоимость * -1
                        ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
                    КОНЕЦ
            ИНАЧЕ ВЫБОР
                    КОГДА НЕ ПартииТоваровНаСкладахУценка.ДокументОприходования.Уценка
                        ТОГДА ВЫБОР
                                КОГДА ПартииТоваровНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
                                    ТОГДА ПартииТоваровНаСкладах.Стоимость * -1
                                ИНАЧЕ ПартииТоваровНаСкладах.Стоимость
                            КОНЕЦ
                    ИНАЧЕ ПартииТоваровНаСкладахУценка.Стоимость
                КОНЕЦ
        КОНЕЦ) КАК СтоимостьОборот
ИЗ
    РегистрНакопления.ПартииТоваровНаСкладах КАК ПартииТоваровНаСкладах
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваровНаСкладахУценка КАК ПартииТоваровНаСкладахУценка
        ПО ПартииТоваровНаСкладах.Номенклатура = ПартииТоваровНаСкладахУценка.Номенклатура
            И ПартииТоваровНаСкладах.Регистратор = ПартииТоваровНаСкладахУценка.ДокументДвижения
            И ПартииТоваровНаСкладахУценка.Период МЕЖДУ &ДатаНачала И &ДатаКонца
            И ПартииТоваровНаСкладахУценка.Номенклатура = &НоменклатураСсылка
ГДЕ
    ПартииТоваровНаСкладах.Период МЕЖДУ &ДатаНачала И &ДатаКонца
    И ПартииТоваровНаСкладах.Номенклатура = &НоменклатураСсылка
    
{ГДЕ
    ПартииТоваровНаСкладах.Номенклатура.* КАК Номенклатура,
    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры.* КАК ХарактеристикаНоменклатуры}

СГРУППИРОВАТЬ ПО
    ПартииТоваровНаСкладах.Номенклатура,
    ПартииТоваровНаСкладах.ХарактеристикаНоменклатуры,
    ВЫБОР
        КОГДА ПартииТоваровНаСкладах.ДокументДвижения <> НЕОПРЕДЕЛЕНО
            ТОГДА ПартииТоваровНаСкладах.ДокументДвижения
        ИНАЧЕ ПартииТоваровНаСкладах.Регистратор