Имя: Пароль:
1C
 
Полное соединение в запросе
0 Tzeentch
 
02.06.17
12:27
Всем привет! Написал вот такой запрос:

"ВЫБРАТЬ
                         |    ТаблицаБП.КодТовара,
                         |    ТаблицаБП.КоличествоБП,
                         |    ТаблицаБП.СебестоимостьБП
                         |ПОМЕСТИТЬ ДанныеБПВременная
                         |ИЗ
                         |    &ТаблицаБП КАК ТаблицаБП
                         |;
                         |
                         |////////////////////////////////////////////////////////////////////////////////
                         |ВЫБРАТЬ
                         |    ДанныеБПВременная.КодТовара,
                         |    СУММА(ДанныеБПВременная.КоличествоБП) КАК КоличествоБП,
                         |    СУММА(ДанныеБПВременная.СебестоимостьБП) КАК СебестоимостьБП
                         |ПОМЕСТИТЬ ДанныеБП
                         |ИЗ
                         |    ДанныеБПВременная КАК ДанныеБПВременная
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    ДанныеБПВременная.КодТовара
                         |;
                         |
                         |////////////////////////////////////////////////////////////////////////////////
                         |ВЫБРАТЬ
                         |    ХозрасчетныйОстатки.Субконто1 КАК Ссылка,
                         |    СУММА(ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0)) КАК КоличествоКА,
                         |    ХозрасчетныйОстатки.Субконто1.Артикул КАК КодТовара,
                         |    СУММА(ВЫБОР
                         |            КОГДА ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) > 0
                         |                ТОГДА ВЫРАЗИТЬ(ХозрасчетныйОстатки.СуммаОстаток / ХозрасчетныйОстатки.КоличествоОстаток КАК ЧИСЛО(10, 2))
                         |            ИНАЧЕ ХозрасчетныйОстатки.СуммаОстаток / 1
                         |        КОНЕЦ) КАК СебестоимостьКА,
                         |    СУММА(ЕСТЬNULL(ДанныеБП.КоличествоБП, 0)) КАК КоличествоБП,
                         |    СУММА(ЕСТЬNULL(ДанныеБП.СебестоимостьБП, 0)) КАК СебестоимостьБП,
                         |    СУММА(ВЫБОР
                         |            КОГДА ЕСТЬNULL(ДанныеБП.КоличествоБП, 0) > 0
                         |                ТОГДА ВЫРАЗИТЬ(ХозрасчетныйОстатки.КоличествоОстаток / ДанныеБП.КоличествоБП КАК ЧИСЛО(10, 2))
                         |            ИНАЧЕ 0
                         |        КОНЕЦ) КАК ОтклонениеПоКоличеству,
                         |    СУММА(ВЫБОР
                         |            КОГДА ЕСТЬNULL(ДанныеБП.СебестоимостьБП, 0) > 0
                         |                ТОГДА ВЫБОР
                         |                        КОГДА ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) > 0
                         |                            ТОГДА ВЫРАЗИТЬ(ХозрасчетныйОстатки.СуммаОстаток / ХозрасчетныйОстатки.КоличествоОстаток / ДанныеБП.СебестоимостьБП КАК ЧИСЛО(10, 2))
                         |                        ИНАЧЕ ВЫРАЗИТЬ(ХозрасчетныйОстатки.СуммаОстаток / 1 / ДанныеБП.СебестоимостьБП КАК ЧИСЛО(10, 2))
                         |                    КОНЕЦ
                         |            ИНАЧЕ 0
                         |        КОНЕЦ) КАК ОтклонениеПоСебестоимости
                         |ИЗ
                         |    РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОтчета, , , Организация = &Организация) КАК ХозрасчетныйОстатки
                         |        ПОЛНОЕ СОЕДИНЕНИЕ ДанныеБП КАК ДанныеБП
                         |        ПО ХозрасчетныйОстатки.Субконто1.Артикул = ДанныеБП.КодТовара
                         |ГДЕ
                         |    (ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТоварыНаСкладах)
                         |            ИЛИ ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы)
                         |                И ХозрасчетныйОстатки.Субконто1 ССЫЛКА Справочник.Номенклатура)
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    ХозрасчетныйОстатки.Субконто1,
                         |    ХозрасчетныйОстатки.Субконто1.Артикул"


В итоге он должен выдать мне все записи, совпавшие по полю КодТовара, а также все записи из обеих таблиц, для которых поля не совпали. Но выдает только совпашие и записи из первой таблицы (РегистрБухгалтерии.Хозрасчетный.Остатки). Что я делаю не так? Как мне получить все записи, совпавшие по полю КодТовара, а также все записи из обеих таблиц, для которых поля не совпали?
1 dezss
 
02.06.17
12:29
Вынеси в отдельную временную таблицу
РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОтчета, , , Организация = &Организация) КАК ХозрасчетныйОстатки

и туда же вынеси условия ГДЕ
2 dezss
 
02.06.17
12:30
из-за условий в ГДЕ твое полное стало левым
3 Tzeentch
 
02.06.17
13:57
(2) Спасибо, работает!

А почему так? Почему, если делать условие ГДЕ, полное соединение становится левым?
4 Михаил Козлов
 
02.06.17
14:04
Это ГДЕ отсекает все записи из ДанныеБП.
5 catena
 
02.06.17
14:07
(3)Записи, где твои значения NULL твоему условию ГДЕ не соответствуют.
6 dezss
 
02.06.17
14:31
(3) а если бы ты накладывал условия и на ДанныеБП, то вообще было бы внутрннее соединение.
7 dezss
 
02.06.17
14:35
(3) можно было бы, конечно, написать так
Выбор Когда ХозрасчетныйОстатки.Счет есть null
      Тогда Истина
      Иначе
        ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТоварыНаСкладах)
Конец

Но лучше так не делать, потому что тогда не будут использоваться индексы (если они есть). Да и для наглядности так сложнее.
8 Tzeentch
 
02.06.17
14:37
(4) (5) (6) Спасибо! Написал вот так:

"ВЫБРАТЬ
                         |    ТаблицаБП.КодТовара,
                         |    ТаблицаБП.КоличествоБП,
                         |    ТаблицаБП.СебестоимостьБП,
                         |    ТаблицаБП.СебестоимостьБПОбщая
                         |ПОМЕСТИТЬ ДанныеБПВременная
                         |ИЗ
                         |    &ТаблицаБП КАК ТаблицаБП
                         |;
                         |
                         |////////////////////////////////////////////////////////////////////////////////
                         |ВЫБРАТЬ
                         |    ДанныеБПВременная.КодТовара,
                         |    СУММА(ДанныеБПВременная.КоличествоБП) КАК КоличествоБП,
                         |    СУММА(ДанныеБПВременная.СебестоимостьБП) КАК СебестоимостьБП,
                         |    СУММА(ДанныеБПВременная.СебестоимостьБПОбщая) КАК СебестоимостьБПОбщая
                         |ПОМЕСТИТЬ ДанныеБП
                         |ИЗ
                         |    ДанныеБПВременная КАК ДанныеБПВременная
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    ДанныеБПВременная.КодТовара
                         |;
                         |
                         |////////////////////////////////////////////////////////////////////////////////
                         |ВЫБРАТЬ
                         |    СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоКА,
                         |    ХозрасчетныйОстатки.Субконто1.Артикул КАК КодТовара,
                         |    СУММА(ВЫБОР
                         |            КОГДА ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0) > 0
                         |                ТОГДА ВЫРАЗИТЬ(ХозрасчетныйОстатки.СуммаОстаток / ХозрасчетныйОстатки.КоличествоОстаток КАК ЧИСЛО(10, 2))
                         |            ИНАЧЕ ХозрасчетныйОстатки.СуммаОстаток / 1
                         |        КОНЕЦ) КАК СебестоимостьКА,
                         |    СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК СебестомисотьКАОбщая
                         |ПОМЕСТИТЬ ДанныеКА
                         |ИЗ
                         |    РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОтчета, , , Организация = &Организация) КАК ХозрасчетныйОстатки
                         |ГДЕ
                         |    (ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТоварыНаСкладах)
                         |            ИЛИ ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Материалы)
                         |                И ХозрасчетныйОстатки.Субконто1 ССЫЛКА Справочник.Номенклатура)
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    ХозрасчетныйОстатки.Субконто1.Артикул
                         |;
                         |
                         |////////////////////////////////////////////////////////////////////////////////
                         |ВЫБРАТЬ
                         |    ДанныеКА.КодТовара КАК КодТовараКА,
                         |    СУММА(ЕСТЬNULL(ДанныеКА.КоличествоКА, 0)) КАК КоличествоКА,
                         |    СУММА(ЕСТЬNULL(ДанныеКА.СебестоимостьКА, 0)) КАК СебестоимостьКА,
                         |    СУММА(ЕСТЬNULL(ДанныеКА.СебестомисотьКАОбщая, 0)) КАК СебестоимостьКАОБщая,
                         |    СУММА(ЕСТЬNULL(ДанныеБП.КоличествоБП, 0)) КАК КоличествоБП,
                         |    СУММА(ЕСТЬNULL(ДанныеБП.СебестоимостьБП, 0)) КАК СебестоимостьБП,
                         |    СУММА(ЕСТЬNULL(ДанныеБП.СебестоимостьБПОбщая, 0)) КАК СебестоимостьБПОбщая,
                         |    СУММА(ВЫБОР
                         |            КОГДА ЕСТЬNULL(ДанныеКА.КоличествоКА, 0) <> 0
                         |                    И ЕСТЬNULL(ДанныеБП.КоличествоБП, 0) <> 0
                         |                ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ДанныеКА.КоличествоКА, 0) / ЕСТЬNULL(ДанныеБП.КоличествоБП, 0) КАК ЧИСЛО(10, 2))
                         |            ИНАЧЕ 0
                         |        КОНЕЦ) КАК ОтклонениеПоКоличеству,
                         |    СУММА(ВЫБОР
                         |            КОГДА ЕСТЬNULL(ЕСТЬNULL(ДанныеКА.СебестоимостьКА, 0), 0) <> 0
                         |                    И ЕСТЬNULL(ЕСТЬNULL(ДанныеБП.СебестоимостьБП, 0), 0) <> 0
                         |                ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ДанныеКА.СебестоимостьКА, 0), 0) / ЕСТЬNULL(ЕСТЬNULL(ДанныеБП.СебестоимостьБП, 0), 0) КАК ЧИСЛО(10, 2))
                         |            ИНАЧЕ 0
                         |        КОНЕЦ) КАК ОтклонениеПоСебестоимости,
                         |    СУММА(ВЫБОР
                         |            КОГДА ЕСТЬNULL(ЕСТЬNULL(ДанныеКА.СебестомисотьКАОбщая, 0), 0) <> 0
                         |                    И ЕСТЬNULL(ЕСТЬNULL(ДанныеБП.СебестоимостьБПОбщая, 0), 0) <> 0
                         |                ТОГДА ВЫРАЗИТЬ(ЕСТЬNULL(ЕСТЬNULL(ДанныеКА.СебестомисотьКАОбщая, 0), 0) / ЕСТЬNULL(ЕСТЬNULL(ДанныеБП.СебестоимостьБПОбщая, 0), 0) КАК ЧИСЛО(10, 2))
                         |            ИНАЧЕ 0
                         |        КОНЕЦ) КАК ОтклонениеПоОбщейСебестоимости,
                         |    ДанныеБП.КодТовара КАК КодТовараБП
                         |ИЗ
                         |    ДанныеКА КАК ДанныеКА
                         |        ПОЛНОЕ СОЕДИНЕНИЕ ДанныеБП КАК ДанныеБП
                         |        ПО ДанныеКА.КодТовара = ДанныеБП.КодТовара
                         |
                         |СГРУППИРОВАТЬ ПО
                         |    ДанныеКА.КодТовара,
                         |    ДанныеБП.КодТовара"


Показывает то, что нужно. Теперь задача ко всему этому вывести колонку со ссылкой на номенклатуру, у которой Артикул = КодТовара. Нужно вывести номенклатуру для кодов товара из обоих таблиц.(в базе, где делаю запрос эта вся эта номенклатура есть). Делаю связи справочника Номенклатура с каждой таблицей, пишет - Противоречивая связь. Как правильно сделать?
9 dezss
 
02.06.17
14:40
(8)во временных присоединяй сразу номенклатуру.
10 dezss
 
02.06.17
14:42
(9) + если не хочешь получать 2 столбика со ссылками на номенклатуру (поКА и поБП), то тебе надо объединять эти 2 временные таблицы, а потом уже связывать с номенклатурой.