Имя: Пароль:
1C
1С v8
Найти характеристику по дополнительным реквизитам
,
0 Gera1t
 
01.08.20
08:54
Есть набор дополнительных реквизитов характеристики, нужно характеристику по дополнительным реквизитам, если искать вот так:

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

То ищет только по 1 допреквизиту.
А как искать сразу например по 5 или 6?
1 Gera1t
 
01.08.20
10:06
Если передать в &Свойство и &Значение список значений прокатит?
2 acht
 
01.08.20
10:17
(1) Придется еще написать "Свойство В (&Свойство)"
3 ReaLg
 
01.08.20
10:21
(0) Все несколько сложнее, как мне кажется. У разных характеристик могут быть повторяющиеся пары Свойство-Значение. Как бы ты ни выбирал - ты можешь получить много записей, среди которых есть разные характеристики. В общем случае могут быть даже ситуации, когда набор свойств и значений у разных характеристик вообще одинаковые. Надо придумать, как ты будешь из нескольких характеристик выбирать именно ту, что тебе нужна.
4 ReaLg
 
01.08.20
10:24
Лучше формировать запрос через или "(Свойство = &C1 И Значение = &З1) ИЛИ ((Свойство = &C2 И Значение = &З2))", иначе, если просто будешь писать В(&Список) можешь получить неправильные записи, когда значение относится к другому свойству.
5 acht
 
01.08.20
10:31
(4) зачем ты условие ИЛИ выдумал?
6 ReaLg
 
01.08.20
10:31
А еще лучше - через объединение нескольких запросов, если мне не изменяет павять, ИЛИ в ГДЕ работает медленно.
7 ReaLg
 
01.08.20
10:33
(5) Если просто Через 2 В() - то не факт, что значения будут относится к нужным свойствам.
8 ReaLg
 
01.08.20
10:35
Свойства Длина, Ширина, Высота
Нужно выбрать длина = 10 и ширина = 20 и высота = 30
В таблице

10 - 20 - 30
20 - 20 - 20
При двух В() вторая строка попадет в выборку, хотя не должна.
9 ReaLg
 
01.08.20
10:41
(8) Таблицу - то неправильно нарисовал :)) Но суть в том, что при длине =20 эта строка попадет, хотя имелась ввиду ширина.
10 ReaLg
 
01.08.20
10:44
Нужно выбрать длина = 10 и ширина = 20 и высота = 30
В таблице:
Х1 - Длина - 10
Х1 - Ширина - 20
Х1 - Высота - 30
Х2 - Длина - 20
Х2 - Ширина - 20
Х3 - Высота - 20
При запросе Свойство В(&С) И Значение В(&З) строки Х2 - Длина - 20 И Х2 - Высота - 20 попадут в выборку, хотя не должны.
11 RomanYS
 
01.08.20
10:44
(2) так ты будешь искать элементы, у которых хотя бы одно свойство совпадет, а (0) нужно чтобы все совпали
12 ReaLg
 
01.08.20
10:46
(11) Ну, это не оговорено точно в (0) :)) Но даже в этом случае может быть несколько характеристик, о чем я писал в (3) Если нужна именно какая-то конкретная, то нужны еще условия.
13 RomanYS
 
01.08.20
10:49
(0) Засунуть набор входящих свойств с значениями в ТЗ. ТЗ передать параметром в запрос, соединить с ТЧ справочника. Сгруппировать по ссылке: посчитать количество совпадений. Взять ИМЕЮЩИЕ количество совпадение равное количеству исходных свойств.
14 ReaLg
 
01.08.20
10:52
(13) Красиво, я навскидку думал, что постобработка нужна будет :)
15 RomanYS
 
01.08.20
10:58
Кстати тут снова вопрос может всплыть что лучше(быстрее):
соединение По ТЧ.Свойство = ТЗ.Свойство и ТЧ.Значение = ТЗ.Значение
или условие ГДЕ (ТЧ.Свойство, ТЧ.Значение) В (ВЫБРАТЬ ТЗ.Свойство, ТЗ.Значение ИЗ ТЗ)
16 Gera1t
 
02.08.20
13:43
У меня получилось только через временные таблицы, условия по очереди задавать.
Если передаю в условие СписокЗначений, некорректно отбирает
17 RomanYS
 
02.08.20
13:48
(16) список не прокатит. Или (13) или динамически формировать запрос с N соединениями