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

Запрос должен (по идее) выводить всю номенклатуру, которая есть на остатке и по которой был оборот за определённый период. Однако в таком виде запрос выводит только то, что есть на остатке;

Пиво этого года;Поставщик Пива;5;50;100
Продукт этого года;Поставщик продуктов;10;150;200
Водка этого года;Поставщик Алкоголя;5;100;200

Если же удалить последнюю строчку в запросе, то выводит всё как надо:

Водка с прошлого года;;0;80;160
Пиво с прошлого года;;0;40;80
Продукт с прошлого года;;0;70;90
Пиво этого года;Поставщик Пива;5;50;100
Продукт этого года;Поставщик продуктов;10;150;200
Водка этого года;Поставщик Алкоголя;5;100;200
1 VKS
 
30.09.20
22:35
левое соединение, основная таблица остатки, соответственно и будет показывать товар из этой таблице
2 Storm03
 
30.09.20
22:38
Делал и внутреннее. Толку нет(((
3 RomanYS
 
30.09.20
22:43
(2) Условия на правые таблицы перенести в условия соединения, а в данном случае в параметры виртуальных таблиц
4 RomanYS
 
30.09.20
22:44
В первом запросе добавить "различные" или использовать ВТ Обороты
5 Storm03
 
30.09.20
22:58
Что-то я не догоняю. При чем здесь соединение и первый запрос, если проблема в строке "И ОстаткиНоменклатурыОстатки.Склад = &Склад"?
Если её убрать, то выводит и то, чего нет на остатке, но по всем складам:
        Запрос.Текст = "ВЫБРАТЬ
                       |    ОстаткиНоменклатуры.Номенклатура.Ссылка КАК Товар
                       |ПОМЕСТИТЬ ТОВАРЫ
                       |ИЗ
                       |    РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры
                       |ГДЕ
                       |    ОстаткиНоменклатуры.Период > &Период
                       |    И ОстаткиНоменклатуры.Склад = &Склад
                       |;
                       |
                       |////////////////////////////////////////////////////////////////////////////////
                       |ВЫБРАТЬ
                       |    ТОВАРЫ.Товар.Ссылка КАК Товар,
                       |    ЕСТЬNULL(ЦеныКомпанииСрезПоследних_Розн.Цена, 0) КАК ЦенаРозн,
                       |    ЕСТЬNULL(ЦеныКомпанииСрезПоследних_Закуп.Цена, 0) КАК ЦенаЗакуп,
                       |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК Остаток,
                       |    ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Партия.Контрагент.Ссылка, """") КАК Контрагент
                       |ИЗ
                       |    ТОВАРЫ КАК ТОВАРЫ
                       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(, ТипЦен = &ТипРозн) КАК ЦеныКомпанииСрезПоследних_Розн
                       |        ПО ТОВАРЫ.Товар.Ссылка = ЦеныКомпанииСрезПоследних_Розн.Номенклатура.Ссылка
                       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныКомпании.СрезПоследних(, ТипЦен = &ТипЗакуп) КАК ЦеныКомпанииСрезПоследних_Закуп
                       |        ПО ТОВАРЫ.Товар.Ссылка = ЦеныКомпанииСрезПоследних_Закуп.Номенклатура.Ссылка
                       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
                       |        ПО ТОВАРЫ.Товар.Ссылка = ОстаткиНоменклатурыОстатки.Номенклатура
                       |ГДЕ
                       |    ЦеныКомпанииСрезПоследних_Розн.Склад = &Склад
                       |    И ЦеныКомпанииСрезПоследних_Закуп.Склад = &Склад";
6 RomanYS
 
30.09.20
23:02
(5) Проблема именно в этой строке: нет остатка - в нем нет склада - условие не выполнилось.
Разберись чем отличаются левое внутреннее и полное соединения и поймёшь, почему нельзя ставить условие на правую таблицу при левом соединении в разделе ГДЕ
7 Storm03
 
30.09.20
23:07
Всё. Понял. Если в виртуальной таблице записей нет, то и нефик там искать склад.)))
Всем спасибо. До свидания!