Имя: Пароль:
1C
1С v8
Подскажите по запросу.
0 Повелитель
 
17.03.14
08:53
Пишу отчет по номенклатуре. Типовая УТ.
Надо чтобы была возможность выбирать 2 типа любых цен + остаток.

Проблема в том, что если не задать Тип цен, то остатки начинают умножаться на количество заведенных цен в справочнике.
по идее если я хочу видеть только номенклатуру + остаток, без цен, то регистр цен заключенный в {} должен уходить из построителя, а он остается, вопрос почему?

Вот запрос:

ВЫБРАТЬ
    Н.Ссылка КАК Номенклатура,
    Н.НоменклатурнаяГруппа,
    Остатки.Склад,
    Остатки.КоличествоОстаток КАК Остаток,
    Цены1.Цена КАК Цена1,
    Цены1.ТипЦен КАК ТипЦен1
{ВЫБРАТЬ
    Номенклатура.*,
    НоменклатурнаяГруппа.*,
    Склад.*,
    Остаток,
    Цена1,
    ТипЦен1.*}
ИЗ
    Справочник.Номенклатура КАК Н
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКонца, {(Склад) КАК Склад, (Номенклатура) КАК Номенклатура}) КАК Остатки
        ПО Н.Ссылка = Остатки.Номенклатура}
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, {(ТипЦен) КАК ТипЦен1, (Номенклатура) КАК Номенклатура}) КАК Цены1
        ПО Н.Ссылка = Цены1.Номенклатура}
{ГДЕ
    Н.Ссылка.* КАК Номенклатура,
    Н.НоменклатурнаяГруппа.*,
    Остатки.Склад.*,
    Остатки.КоличествоОстаток КАК Остаток,
    Цены1.Цена КАК Цена1,
    Цены1.ТипЦен.* КАК ТипЦен1}
{УПОРЯДОЧИТЬ ПО
    Номенклатура.*,
    НоменклатурнаяГруппа.*,
    Склад.*,
    Остаток,
    Цена1,
    ТипЦен1.*}
ИТОГИ
    СУММА(Остаток),
    МАКСИМУМ(Цена1)
ПО
    ОБЩИЕ
{ИТОГИ ПО
    Номенклатура.*,
    НоменклатурнаяГруппа.*,
    Склад.*}

Имею на выход:
УниверсальныйОтчет.ПостроительОтчета.ПолучитьЗапрос().Текст

ВЫБРАТЬ
    Н.Ссылка КАК Номенклатура
ИЗ
    Справочник.Номенклатура КАК Н
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКонца, Номенклатура В ИЕРАРХИИ(&Параметр1)) КАК Остатки
        ПО Н.Ссылка = Остатки.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, (Номенклатура В ИЕРАРХИИ(&Параметр2)) И ТипЦен = &Параметр7) КАК Цены1
        ПО Н.Ссылка = Цены1.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, (Номенклатура В ИЕРАРХИИ(&Параметр3)) И ТипЦен = &Параметр9) КАК Цены2
        ПО Н.Ссылка = Цены2.Номенклатура
ГДЕ
    Н.Ссылка В ИЕРАРХИИ (&Параметр6)
    И Цены1.ТипЦен = &Параметр8
    И Цены2.ТипЦен = &Параметр10
ИТОГИ ПО
    ОБЩИЕ,
    Номенклатура ИЕРАРХИЯ КАК Номенклатура
АВТОУПОРЯДОЧИВАНИЕ
1 Повелитель
 
17.03.14
08:56
(0) В первом запросе, неправильно выложил, нечайно удалил связку

{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, {(ТипЦен) КАК ТипЦен2, (Номенклатура) КАК Номенклатура}) КАК Цены2
        ПО Н.Ссылка = Цены2.Номенклатура}
2 Повелитель
 
17.03.14
09:25
(0)
Реально ли получить на выходе построителя, вот такой запрос?

ВЫБРАТЬ
    Н.Ссылка КАК Номенклатура
ИЗ
    Справочник.Номенклатура КАК Н
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКонца, Номенклатура В ИЕРАРХИИ(&Параметр1)) КАК Остатки
        ПО Н.Ссылка = Остатки.Номенклатура
ГДЕ
    Н.Ссылка В ИЕРАРХИИ (&Параметр6)
    И Цены1.ТипЦен = &Параметр8
    И Цены2.ТипЦен = &Параметр10
ИТОГИ ПО
    ОБЩИЕ,
    Номенклатура ИЕРАРХИЯ КАК Номенклатура
АВТОУПОРЯДОЧИВАНИЕ
3 Maxus43
 
17.03.14
09:53
ну дак в ГДЕ у тебя что? Цены2, парвильно... значит обязательный.
Всё в скобки завёртывай
4 Maxus43
 
17.03.14
09:54
это как ты на фейскотроле запретиш одному из сиамских близнецов зайти, а второго пропустишь. Они не разделяются, если что
5 Maxus43
 
17.03.14
09:55
(3) + точнее из Где это тупо убирай, параметры вирт таблицы же есть
6 Повелитель
 
17.03.14
10:02
(5) Спасибо, но не помогло.
Вроде все завернуто.
Вот запрос сейчас:

ВЫБРАТЬ
    Н.Ссылка КАК Номенклатура,
    Остатки.Склад,
    Остатки.КоличествоОстаток КАК Остаток,
    Цены1.Цена КАК Цена1,
    Цены1.ТипЦен КАК ТипЦен1,
    Цены2.Цена КАК Цена2,
    Цены2.ТипЦен КАК ТипЦен2
{ВЫБРАТЬ
    Номенклатура.*,
    Склад.*,
    Остаток,
    Цена1,
    Цена2,
    ТипЦен1.*,
    ТипЦен2.*}
ИЗ
    Справочник.Номенклатура КАК Н
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКонца, {(Склад) КАК Склад, (Номенклатура) КАК Номенклатура}) КАК Остатки
        ПО Н.Ссылка = Остатки.Номенклатура}
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, {(ТипЦен) КАК ТипЦен1, (Номенклатура) КАК Номенклатура}) КАК Цены1
        ПО Н.Ссылка = Цены1.Номенклатура}
        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, {(ТипЦен) КАК ТипЦен2, (Номенклатура) КАК Номенклатура}) КАК Цены2
        ПО Н.Ссылка = Цены2.Номенклатура}
{ГДЕ
    Н.Ссылка.* КАК Номенклатура,
    Н.НоменклатурнаяГруппа.*,
    Остатки.Склад.*,
    Остатки.КоличествоОстаток КАК Остаток}
{УПОРЯДОЧИТЬ ПО
    Номенклатура.*,
    Склад.*,
    Остаток,
    Цена1,
    Цена2,
    ТипЦен1.*,
    ТипЦен2.*}
ИТОГИ
    СУММА(Остаток)
ПО
    ОБЩИЕ
{ИТОГИ ПО
    Номенклатура.*,
    Склад.*}
7 Maxus43
 
17.03.14
10:16
что значит всё? сейчас в Выбор у тебя что-то не то... выбираешь ЦенЫ, а в скобках ЦенА.
8 Maxus43
 
17.03.14
10:17
из выбрать впринципе убери Цены1/2, оставь только в кв. скобках, на закладке построителя короче указывай необязательные, у убедись что галка "Обязательная" на таблицах не стоит
9 Maxus43
 
17.03.14
10:18
для тестирования юзай ПолучитьЗапрос
10 Повелитель
 
17.03.14
10:33
(9) Спасибо сейчас буду пробовать
11 Повелитель
 
17.03.14
12:07
Так и не получилось.
Вот запрос:

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


Вот результат:
ВЫБРАТЬ
    Н.Ссылка КАК Номенклатура
ИЗ
    Справочник.Номенклатура КАК Н
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКонца, Номенклатура = &Параметр1) КАК Остатки
        ПО Н.Ссылка = Остатки.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, Номенклатура = &Параметр2) КАК Цены1
        ПО Н.Ссылка = Цены1.Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, Номенклатура = &Параметр3) КАК Цены2
        ПО Н.Ссылка = Цены2.Номенклатура
ГДЕ
    Н.Ссылка = &Параметр4
ИТОГИ ПО
    ОБЩИЕ,
    Номенклатура КАК Номенклатура
АВТОУПОРЯДОЧИВАНИЕ


А должно быть:
ВЫБРАТЬ
    Н.Ссылка КАК Номенклатура
ИЗ
    Справочник.Номенклатура КАК Н
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаКонца, Номенклатура = &Параметр1) КАК Остатки
        ПО Н.Ссылка = Остатки.Номенклатура
ГДЕ
    Н.Ссылка = &Параметр4
ИТОГИ ПО
    ОБЩИЕ,
    Номенклатура КАК Номенклатура
АВТОУПОРЯДОЧИВАНИЕ
12 Повелитель
 
17.03.14
12:54
Вопрос актуальный, как убрать лишние соединения из построителя?
13 Crush
 
17.03.14
13:20
Прокрути это в консоли запросов. И добавь цены в основную выборку.
14 Повелитель
 
17.03.14
13:35
Все наконец то нашел причину.

Все нормально работает если убрать параметр Номенклатура в левом соединении.
Вот так:
|        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, {(ТипЦен) КАК ТипЦен1})
Вместо так:
|        {ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаКонца, {(ТипЦен) КАК ТипЦен1, (Номенклатура) КАК Номенклатура})

Отчет конечно строиться теперь медленно, но лишние соединения удаляет.
Сейчас еще попробую как то вернуть параметр Номенклатуру.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший