Имя: Пароль:
1C
1С v8
Поиск элемента справочника запросом
,
0 r1000
 
07.04.15
09:02
Есть таблица значений. В таблице одна колонка "Свойство". Количество строк в таблице может быть различным, сами свойства тоже могут быть различными.
Еще есть справочник с табличной частью, в табличной части один реквизит "Свойство".
Задача: найти элемент справочника, в котором табличная часть будет совпадать с таблицей значений. Как запросом сделать ?
1 Simod
 
07.04.15
09:04
"Стаж: 7 лет 5 месяцев 19 дней"

Ты серьезно?
2 1976vas
 
07.04.15
09:05
(0) ТЗ в ВТ и соединяй.
3 r1000
 
07.04.15
09:05
Ага)
4 r1000
 
07.04.15
09:06
(2)Так вот не получается соединять...
5 1976vas
 
07.04.15
09:08
(4) Если ты нарисуешь, то вероятность получения ответа увеличится )
6 1976vas
 
07.04.15
09:09
(5) + описание того, что не получается.
7 r1000
 
07.04.15
09:11
Вот таким запросом пытаюсь. ТЗ в ВТ и соединяю. Но тут запрос мне выдает таблицу, а мне нужен элемент
"ВЫБРАТЬ
                   |    ТаблПараметров.Значение КАК Значение1
                   |ПОМЕСТИТЬ ТаблПараметров
                   |ИЗ
                   |    &ТаблПараметров КАК ТаблПараметров
                   |;
                   |
                   |////////////////////////////////////////////////////////////////////////////////
                   |ВЫБРАТЬ
                   |    ТаблПараметров.Значение1,
                   |    ЭлементыНоменклатурыЗначенияСвойств.Значение
                   |ИЗ
                   |    ТаблПараметров КАК ТаблПараметров
                   |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЭлементыНоменклатуры.ЗначенияСвойств КАК ЭлементыНоменклатурыЗначенияСвойств
                   |        ПО ТаблПараметров.Значение1 = ЭлементыНоменклатурыЗначенияСвойств.Значение
8 r1000
 
07.04.15
09:12
+(7)Причем тот элемент у которого все значения по соединению совпадут.
9 r1000
 
07.04.15
09:12
Внутреннее соединение также, дает таблицу даже если не все значения совпадают.
10 1976vas
 
07.04.15
09:16
(9) Нарисуй таблички, что есть и что надо. Не очень понятно.
11 StaticUnsafe
 
07.04.15
09:16
(8) Если в ТЧ элемента справочника содержаться теже строки что и в таблице значений + еще несколько то соединение даст и этот элемент
12 r1000
 
07.04.15
09:19
(11)Вот. А мне нужно полное совпадение...
(10)Щас нарисую...
13 r1000
 
07.04.15
09:23
Вот моя ТЗ и элементы справочника. Мне нужно в запросе найти только элемент3, так как только в нем есть полное совпадение по значениям. Как сделать ?

ТЗ
Значение1
Значение2
Значение3

Элемент1
Значение1
Значение2
Значение3
Значение4

Элемент2
Значение1
Значение0
Значение3

Элемент3
Значение2
Значение1
Значение3
14 User_Agronom
 
07.04.15
09:25
Дарю, пользуйся: http://i.stack.imgur.com/sKS1u.jpg
15 Любопытная
 
07.04.15
09:28
Выбираешь все элементы, у которых есть значения из ТЗ, потом делаешь внутреннее соединение полученной таблицы и ТЗ и выбираешь только те, где всё совпало. По-моему так
16 r1000
 
07.04.15
09:29
(14)Спасибо!, но у меня количество ключей не известно, а собирать запрос муторно, наверняка есть более простой вариант...
17 r1000
 
07.04.15
09:32
(15)Это после запроса еще и перебор делать ? Некрасиво...
18 StaticUnsafe
 
07.04.15
09:36
А если одно свойство в ТЗ 1 раз, а в ТЧ 3 раза, они тоже не совпадают?

Короче хэшируй все ТЧ и ТЗ и по совпадению хэша ))
19 r1000
 
07.04.15
09:37
(18)Нет. Не совпадают. Строк и там и там должно быть одинаково, и значения строк должны быть одинаковыми, а порядок строк не важен.
20 crotnn
 
07.04.15
09:39
Давненько решал подобную задачу. Сразу предупреждаю, это была только наработка, в проект не вошла, но зато работает )))

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

СГРУППИРОВАТЬ ПО
    ЭлементыНоменклатурыЗначенияСвойств.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ЭлементыНоменклатурыЗначенияСвойств.Ссылка) = &КоличествоСвойств    
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ЭлементыНоменклатурыЗначенияСвойств.Ссылка
ИЗ
    ВТ_СоставИзСпискаСвойств КАК ВТ_СоставИзСпискаСвойств
        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЭлементыНоменклатуры.ЗначенияСвойств КАК ЭлементыНоменклатурыЗначенияСвойств
        ПО ВТ_СоставИзСпискаСвойств.Ссылка = ЭлементыНоменклатурыЗначенияСвойств.Ссылка

СГРУППИРОВАТЬ ПО
    ЭлементыНоменклатурыЗначенияСвойств.Ссылка

ИМЕЮЩИЕ
    КОЛИЧЕСТВО(ЭлементыНоменклатурыЗначенияСвойств.Ссылка) = &КоличествоСвойств

Где СписокСвойств - массив всех строк колонки твоей ТЗ, КоличествоСвойств - количество строк в ТЗ.
21 User_Agronom
 
07.04.15
09:41
(0) "...Как запросом сделать ?"
(16) "...а собирать запрос муторно, наверняка есть более простой вариант..."

У меня нет слов описать эту ситуацию.
22 crotnn
 
07.04.15
09:43
+(20)В первом запросе формируется ВТ из элементов справочника, у которого в ТЧ есть хотя бы одно свойство из искомого и количество свойств совпадает с искомым, во втором левое соединение ищет итоговый элемент по полному вхождению ТЗ в ТЧ и совпадению количества строк ТЗ и ТЧ
23 D_E_S_131
 
07.04.15
09:44
(7) "а мне нужен элемент" — если суть вопроса только в этом, то достаточно из ТЗ выгрузить значения из колонки в массив, массив передать как параметр. Из "Справочник.ЭлементыНоменклатуры.ЗначенияСвойств" выбирать поле "Ссылка", используя условие "В (..)" и конструкцию "ВЫБРАТЬ ПЕРВЫЕ 1".
24 r1000
 
07.04.15
09:45
(23)Но туда может попасть любой элемент, даже если у него будет больше строк в табл.части
25 crotnn
 
07.04.15
09:45
(23) Нет, он выберет все элементы, у которых совпадет хотя бы одно свойство ))) А ТС нужно полное совпадение.
26 r1000
 
07.04.15
09:46
(22)спасибо. Сейчас попробую, хотя код не выглядит 100% надежным.
27 crotnn
 
07.04.15
09:51
(26) Сам шоке, но реально работает))) Думаю, направление понятно.
28 Ёпрст
 
07.04.15
09:53
(20) это не совсем верное решение - привязка к количеству свойств.
Это будет работать только, если все значения свойства уникальны для каждого объекта. А это, далеко не всегда так.
29 r1000
 
07.04.15
09:56
(27)Работает, но сейчас проверю в свете (28)
30 Ёпрст
 
07.04.15
09:58
(29) а чего проверять очевидное ?
31 crotnn
 
07.04.15
10:05
(28) Да, изначально задача стояла записывать уникальный состав ТЧ для элемента справочника. По идее, если есть несколько элементов с одинаковым составом ТЧ, то запрос должен вернуть все эти элементы. Надеюсь r1000 проверит и напишет о результатах
32 Ёпрст
 
07.04.15
10:08
(31) тч может быть и уникальна, а вот значения свойств для элемента справочника - нет (и наоборот). И всё, привет котёнку.
33 r1000
 
07.04.15
10:11
Ну пока тесты дают правильную работу. У меня значения ТЗ ищутся в подчиненном ей справочнике. И задача, строго говоря, стоит только в том, чтобы узнать существует ли хоть один элемент с таким набором значений(если существует, то создавать его не нужно).
34 crotnn
 
07.04.15
10:13
(33) Ну вот именно эту задачу я и решал.
35 1976vas
 
07.04.15
10:15
(32) А как можно доработать? Или нельзя?
36 crotnn
 
07.04.15
10:18
(32) А что значит "значения не уникальны"? Допустим, есть справочник, в нем ТЧ "Цвета", у одно элемента в тч белый, зеленый, синий; у другого красный, зеленый, синий. Значения свойств для элемента уникальны или нет?
37 Ёпрст
 
07.04.15
10:20
(36)
Элемент вася, вид свойсва цвет, значения голубой, голубой, голубой..
38 r1000
 
07.04.15
10:23
(37)А, понятно. Нет, столько голубых быть не может. Может быть только один.
39 r1000
 
07.04.15
10:24
т.е. в тч все значения уникальны для данной тч.
40 Ёпрст
 
07.04.15
10:24
(38) где это написано "что не может" ? Как проверял ?
С чего такая уверенность ?
Это сплошь и рядом, особенно, если свойства задают групповыми обработками
41 Ёпрст
 
07.04.15
10:24
задвоенных свойсв.. вагон
42 1976vas
 
07.04.15
10:25
А свернуть нельзя сначала значения?
43 r1000
 
07.04.15
10:31
(40)Сам алгоритм создания элементов справочника не пропустит задвоения. Но сделаю еще дополнительные костыли для уверенности.
44 Ёпрст
 
07.04.15
10:31
(43) та ну ?
:)
45 D_E_S_131
 
07.04.15
10:47
(43) РС с измерениями "Номенклатура, Свойство" мог бы это гарантировать, а так...