Имя: Пароль:
1C
1С v8
Преобразовать запрос с двумя условиями в рабочий вариант
0 saradip
 
21.03.23
14:09
Добрый день, задача следующая:
Выбрать номенклатуру из документа, и связать ее с дополнительным реквизитом предприятия.

ВЫБРАТЬ
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение
ИЗ
    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка)
ГДЕ
    ПеремещениеТоваровТовары.Ссылка = &Ссылка
    И НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита

Суть какая, выше - неправильное решение, так как отрабатывают два условия "И", и выбираются только те строки, где первое и второе условие отработало.
Если нет доп реквизита = нет строки.
У меня решение в голове одно:
1) виртуальная таблица "ВТНоменклатура" выбирающая номенклатуру из документа, где указан параметр ССЫЛКА
2) виртуальная таблица "ВТЗначения" выборка доп. реквизитов, где ССЫЛКА В ссылках на номенклатуру из "ВТНоменклатура"
3) А после выбор полей из двух ВТ и связь по ссылке.
Как наиболее просто оптимизировать запрос, чтобы получать все строки, даже те, где нет доп. реквизита?
1 lubitelxml
 
21.03.23
14:12
ВЫБРАТЬ
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение
ИЗ
    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита)



и вот здесь можно не писать ссылка:
(ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка)
а писать
(ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка)
2 Волшебник
 
21.03.23
14:12
ВЫБРАТЬ Ссылка
ИЗ справочник.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Спр.Доп ПО Номенклатура И ИмяДопРекв
ГДЕ ссылка В (ВЫБРАТЬ Номенклатура ИЗ документ.Перемещение.Товары ГДЕ Док = &Док)
3 saradip
 
21.03.23
14:16
(1) Спасибо, но здесь нет условия на документ
4 lubitelxml
 
21.03.23
14:19
ВЫБРАТЬ
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение
ИЗ
    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (ПеремещениеТоваровТовары.Номенклатура= НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита)
ГДЕ
    ПеремещениеТоваровТовары.Ссылка = &Ссылка

Ну так сам бы добавил
5 Donkey_hot
 
21.03.23
14:21
(0) Сначала выберите товары документа в таблицу (чтобы не связывать то, что потом будет отсечено), потом свяжите с доп.реквизитами по условиям ссылки и имени.
6 saradip
 
21.03.23
14:21
(4) Да, я добавил, проверял. Все отлично отрабатывает!
ВЫБРАТЬ
    ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура,
    ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение
ИЗ
    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка)
            И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита)
ГДЕ
    ПеремещениеТоваровТовары.Ссылка = &Ссылка
7 Donkey_hot
 
21.03.23
14:22
(6) Да нет, не отлично. Связываете строки всех документов в базе (например, несколько сотен тысяч), чтобы потом выбрать строки одного документа.
8 azernot
 
21.03.23
14:23
(6) > ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка
кровь из глаз пошла.
Перечитайте конец поста (1)
9 Fish
 
21.03.23
14:24
(6) Только я бы ещё от двух точек избавился.
Вместо ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка
пойдёт
ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка

Ну и НоменклатураДополнительныеРеквизиты.Свойство.Имя я бы заменил на НоменклатураДополнительныеРеквизиты.Свойство
10 lubitelxml
 
21.03.23
14:26
(7) да, согласен, можно либо как в (2), либо сначала во временныую собрать товары с условием по документу, и потом уже левое с доп. реквизитами
11 saradip
 
21.03.23
14:27
(9) Во втором случае отбор идет именно по имени реквизита, если точку убрать, то будет сравниваться не имя, а ссылка свойства
12 saradip
 
21.03.23
14:28
(7) Понял
13 Fish
 
21.03.23
14:28
(11) Правильно. По ссылке сравнивать лучше, чем по имени, да ещё доставая его через 2 точки.
14 Fish
 
21.03.23
14:30
+(13) Ну и защита от того, что кто-нибудь поменяет имя допреквизита.
15 saradip
 
21.03.23
14:42
(13) Погоди, их может быть несколько, а мне нужен конкретный доп. реквизит с именем СерийныйНомер_85cc11c39f3f43a0986a190ba09130ec
16 saradip
 
21.03.23
14:44
(2) Или я не так понял, или разницы нет. В результат выводит строки, только когда указан доп. реквизит
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
        ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита)
ГДЕ
    Номенклатура.Ссылка В
            (ВЫБРАТЬ
                ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура
            ИЗ
                Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
            ГДЕ
                ПеремещениеТоваровТовары.Ссылка = &Док)
17 Волшебник
 
21.03.23
14:47
(16) Вы не оттуда выбираете. Гляньте внимательно (2)
18 Fish
 
21.03.23
14:49
(16) Основную таблицу перепутал
19 Fish
 
21.03.23
14:51
(15) Ну так и передавай в запрос конкретное свойство с именем СерийныйНомер_85cc11c39f3f43a0986a190ba09130ec. Но передавай ссылкой.
20 Donkey_hot
 
21.03.23
14:56
(16) Чот вообще странное. Вам нужна уникальная номенклатура или состав строк как в документе (с возможными дублями)? Первым шагом в любом случае выбираете номенклатуру документа в ВТ (если нужна только уникальная - то ВЫБРАТЬ РАЗЛИЧНЫЕ), вторым шагом соединяете эту ВТ левым соединением с табличной частью ДополнительныеРеквизиты по двум условиям: Номенклатура = ДопРеквизиты.Ссылка и ДопРеквизиты.Свойство = &Свойство. В параметр "свойство" помещаете ПВХ.ДопРеквизитыИСведения.НайтиПоРеквизиту("Имя", "....")
21 saradip
 
21.03.23
15:16
(17) Извиняюсь, не проверил текст!
Спасибо, так отлично:
ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка,
    НоменклатураДополнительныеРеквизиты.Значение КАК Значение
ИЗ
    Справочник.Номенклатура КАК Номенклатура
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка)
            И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита)
ГДЕ
    Номенклатура.Ссылка В
            (ВЫБРАТЬ
                ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура
            ИЗ
                Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
            ГДЕ
                ПеремещениеТоваровТовары.Ссылка = &Док)
22 saradip
 
21.03.23
15:16
(20) Нужно номенклатура из документа и рядом ее доп реквизит.
Мне в печатной форме нужен будет этот самый доп реквизит, вместо артикула
23 saradip
 
21.03.23
15:18
(19) Мысль не уловил. Сперва найти ссылку по имени реквизита? Чтобы в запросе использовать ссылку?
24 saradip
 
21.03.23
15:47
Если подвести итоги и сделать выводы, то чтобы избежать ошибочной ситуации, при двойном условии, необходимо условие задавать в связи:

/////// - ошибка

        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка)
ГДЕ
    НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита

/////// - верное действие

        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
        ПО (ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка)
            И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита)

///////
25 Волшебник
 
21.03.23
16:30
(24) молодец
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший