Имя: Пароль:
1C
1С v8
Сложный поиск номенклатуры по нескольким доп. реквизитам
0 wms
 
10.03.20
12:05
Типовая УТ 11.
В справочнике номенклатура добавлено 7 доп. реквизитов разных типов.
Нужно найти номенклатуру по этим 7 доп. реквизитам + артикул номенклатуры который может повторяться.- так давно сделано и работает.Понимаю что плохо.

Интересует техническое решение.
Создаю таблицу ТЗСвВаНом в которой колонки свойство и значение (типизировано характеристикой ПВХ)
И запрос используя временную таблицу:
    МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
    Запрос.УстановитьПараметр("ВнешнийИсточник",ТЗСвВаНом);
    
    Запрос.Текст = "Выбрать
    |    ВнешнийИсточник.Свойство,
    |    ВнешнийИсточник.Значение
    |    Поместить ТЗСвВаНом
    |    ИЗ &ВнешнийИсточник КАК ВнешнийИсточник";
    Запрос.Выполнить();    
    
    Запрос.Текст = "ВЫБРАТЬ
                   |    Реквизиты.Ссылка КАК Ссылка
                   |ИЗ
                   |    Справочник.Номенклатура.ДополнительныеРеквизиты КАК Реквизиты
                   |ГДЕ
                   |    ИСТИНА
                   |    И НЕ Реквизиты.Ссылка.ПометкаУдаления
                   |    И Реквизиты.Ссылка.Артикул = &Артикул
                   |    И (Реквизиты.Свойство, Реквизиты.Значение) в (выбрать т.Свойство, Т.Значение из ТЗСвВаНом как Т)
                   |
                   |СГРУППИРОВАТЬ ПО
                   |    Реквизиты.Ссылка";
    Запрос.УстановитьПараметр("Артикул",Стр.Артикул);
    Результат = Запрос.Выполнить();

но, вхожнение ВТ не отрабатывеет. возвращает 7 номенклатур по артикулу игнорируя значения свойств.
1 Cyberhawk
 
10.03.20
12:07
За такое имя переменной лучи добра в тебя точно не полетят)
2 wms
 
10.03.20
12:08
(1) поправлю:-)
3 Cyberhawk
 
10.03.20
12:10
Проверь на более простом запросе, где таблица из двух колонок с примитивными типами, ну и таблица-фильтр тоже с ними.
4 catena
 
10.03.20
12:14
(0)Этот запрос вернет каждую номенклатуру, у которой хоть одна пара свойство/значение имеет в отборе, а не по всем семи.
5 Garykom
 
гуру
10.03.20
12:17
(0) Там разве нет при добавлении/редактировании доп.реквизита снизу "Для разработчиков" и там "Имя"?

УТ11.4 ПВХ ДополнительныеРеквизитыИСведения
6 wms
 
10.03.20
12:18
(3) попробовал см.ниже
(4) да. так и работает
7 wms
 
10.03.20
12:26
а надо по всем семи + артикул.простого запроса не могу придумать только сильно навороченный получается
8 wms
 
10.03.20
12:30
Придется видимо программно составлять текст запроса и используя выбор формировать реквизиты Свойство1.... Свойство7
и по значениям уже отбор.
Всем спасибо!
9 catena
 
10.03.20
12:30
(7)Реквизитов жестко 7 или планируется в будущем изменение состава?
10 FIXXXL
 
10.03.20
12:30
(7) дык соединяй по всем полям
11 wms
 
10.03.20
12:37
(9) не жестко. 7 это пока максимально, но часть из них уже не обязательные
12 pechkin
 
10.03.20
12:38
нужно 7 левых/внутренних соединений
13 catena
 
10.03.20
12:42
(12)И каждый раз переписывать, когда состав будет меняться? Просто, но не красиво же.
14 Cyberhawk
 
10.03.20
13:05
15 Cyberhawk
 
10.03.20
14:14
Ну что, получилось способом из (14)?
16 wms
 
11.03.20
09:21
(15)нет, не отрабатывает внутреннее соединение, если ЗначениеСвойства имеет владельца, а у меня 2 таких свойства
  ВТ_Дано КАК ВТ_Дано
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_Фильтры КАК ВТ_Фильтры
        ПО ВТ_Дано.ВидСвойства = ВТ_Фильтры.ВидСвойства
            И ВТ_Дано.ЗначениеСвойства = ВТ_Фильтры.ЗначениеСвойства
или глюк платформы или такая фича.
17 wms
 
11.03.20
09:22
Пока сделал такой программно формируемый запрос, возможно еще оптимизирую:
ВЫБРАТЬ РАЗЛИЧНЫЕ
    НоменклатураДополнительныеРеквизиты.Ссылка.Ссылка КАК Ссылка
ИЗ
    Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты
ГДЕ
    НЕ НоменклатураДополнительныеРеквизиты.Ссылка.ПометкаУдаления
    И НоменклатураДополнительныеРеквизиты.Ссылка.Артикул = &Артикул
    И НоменклатураДополнительныеРеквизиты.Свойство в (&МассивСвойств)

    И ВЫБОР
            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Свойство1
                    И НоменклатураДополнительныеРеквизиты.Значение = &Значение1
                ТОГДА ИСТИНА

            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Свойство2
                    И НоменклатураДополнительныеРеквизиты.Значение = &Значение2
                ТОГДА ИСТИНА

            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Свойство3
                    И НоменклатураДополнительныеРеквизиты.Значение = &Значение3
                ТОГДА ИСТИНА

            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Свойство4
                    И НоменклатураДополнительныеРеквизиты.Значение = &Значение4
                ТОГДА ИСТИНА

            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Свойство5
                    И НоменклатураДополнительныеРеквизиты.Значение = &Значение5
                ТОГДА ИСТИНА

            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Свойство6
                    И НоменклатураДополнительныеРеквизиты.Значение = &Значение6
                ТОГДА ИСТИНА

            КОГДА НоменклатураДополнительныеРеквизиты.Свойство = &Свойство7
                    И НоменклатураДополнительныеРеквизиты.Значение = &Значение7
                ТОГДА ИСТИНА

            ИНАЧЕ ЛОЖЬ
        КОНЕЦ
18 Cyberhawk
 
11.03.20
11:49
(16) Ну а демо-пример-то ведет себя как нужно?
19 Ёпрст
 
11.03.20
11:54
(17) который не работает.. ибо проверяется одно свойство , а не 7 сразу.