Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Найти характеристику по дополнительным реквизитам

Найти характеристику по дополнительным реквизитам
Я
   Gera1t
 
01.08.20 - 08:54
Есть набор дополнительных реквизитов характеристики, нужно характеристику по дополнительным реквизитам, если искать вот так:

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.