Имя: Пароль:
1C
1С v8
Запрос поиска товара по свойствам
0 api_vlad
 
02.08.11
10:41
Добрый день. Помогите новичку в запросах составить такой запрос: нужно найти объект в регистре сведений "ЗначенияСвойствОбъектов" (УТ 10.3) по набору значений измерения "Свойство" и ресурса "Значение". Другими словами нам известно несколько пар Свойство-ЗначениеСвойства и надо отобрать те объекты которые соответсвтуют этому набору. Заранее большое спасибо.
1 Grusswelle
 
02.08.11
10:42
Хммм... Откуда данные брать (из какой таблицы) знаешь?
2 vicof
 
02.08.11
10:43
ВЫБРАТЬ
                             |    ДоговорыКонтрагентов.Владелец КАК Контрагент,
                             |    ДоговорыКонтрагентов.Ссылка КАК Договор,
                             |    
                             |ИЗ
                             |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                             |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
                             |        ПО (ЗначенияСвойствОбъектов.Объект = ДоговорыКонтрагентов.Ссылка)
                             |ГДЕ
                             |    ЗначенияСвойствОбъектов.Свойство = &Свойство
                             |    И ЗначенияСвойствОбъектов.Значение = &Значение
                             |    И ДоговорыКонтрагентов.Организация = &Организация

дарю, тока договор на номенклатуру поменяй
3 Axel2009
 
02.08.11
10:43
т.е. найти все номенклатуры по которым несколько пар сходятся?
4 Reset
 
02.08.11
11:21
(0)
Если пар немного, можно несколько раз выполнить (в цикле ;P ) простой запрос типа

   Выбрать ЗначенияСвойств.Объект
   Из РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
   Где ЗначенияСвойств.Свойство = &Свойство
       И ЗначенияСвойств.Значение = &Значение


Либо вытащить по всем парам одним запросом типа (приведение типов нужно заменить на твои типы свойств и ресурсов)


ВЫБРАТЬ
   ВЫРАЗИТЬ(Таб.Свойство КАК СТРОКА(15)) КАК Свойство,
   ВЫРАЗИТЬ(Таб.Значение КАК Число) КАК Значение
ПОМЕСТИТЬ ТаблицаОтборов
ИЗ
   &Таб КАК Таб
;
ВЫБРАТЬ
   ЗначенияСвойств.Объект
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
ГДЕ
   (ЗначенияСвойств.Свойство, ЗначенияСвойств.Значение) В
           (ВЫБРАТЬ Т.Свойство,Т.Значение
           ИЗ ТаблицаОтборов КАК Т)

       
В &Таб передать таблицу с типизованными колонками и значениями пар
5 api_vlad
 
03.08.11
09:01
У меня такая ситуация:
Регистр "ЗначенияСвойствОбъектов":
Объект /Свойство /ЗначениеСвойства
Данные:
Товар1 /Цвет /Белый
Товар1 /Размер /36
Товар2 /Цвет /Белый
Товар2 /Размер /38
Товар3 /Цвет /Серый

Параметры фильтра: Цвет:Белый, Размер:36. Найтись должен объект "Товар1" и только.
(1) Поправьте если ошибаюсь...
Я передам в параметрах только одно значение пары Свойство-ЗначениеСвойства, разве нет? В примере мне нужны две пары...
6 hhhh
 
03.08.11
09:15
(5) ну передай две пары, чего ты паришься?
7 api_vlad
 
03.08.11
10:10
(6) да рад бы... да не знаю как это сделать. в &Свойство и &Значение массивы передавать что ли?
8 Reset
 
03.08.11
10:14
(7) Не думал что все так плохо.

Для частного случая в (5):

Выбрать различные ЗначенияСвойств.Объект
Из РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
Где ЗначенияСвойств.Свойство = &Свойство1
И ЗначенияСвойств.Значение = &Значение1
ИЛИ
ЗначенияСвойств.Свойство2 = &Свойство2
И ЗначенияСвойств.Значение2 = &Значение2


Это частный случай, а какой общий, я понятия не имею. Ты ж молчишь как партизан. Задача сверсекретная поди и разглашать нельзя.
9 Reset
 
03.08.11
10:15
ЗначенияСвойств.Свойство2 = &Свойство2
И ЗначенияСвойств.Значение2 = &Значение2

===>

ЗначенияСвойств.Свойство = &Свойство2
И ЗначенияСвойств.Значение = &Значение2
10 hhhh
 
03.08.11
10:16
(8) не, не так

ВЫБРАТЬ
                             |    ДоговорыКонтрагентов.Владелец КАК Контрагент,
                             |    ДоговорыКонтрагентов.Ссылка КАК Договор,
                             |    
                             |ИЗ
                             |    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
                                                          |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов1
                             |        ПО (ЗначенияСвойствОбъектов1.Объект = ДоговорыКонтрагентов.Ссылка)
                             |ГДЕ
                             |    ЗначенияСвойствОбъектов1.Свойство = &Свойство1
                             |    И ЗначенияСвойствОбъектов1.Значение = &Значение1
                             |    И ДоговорыКонтрагентов.Организация = &Организация
                             |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов2
                             |        ПО (ЗначенияСвойствОбъектов2.Объект = ДоговорыКонтрагентов.Ссылка)
                             |ГДЕ
                             |    ЗначенияСвойствОбъектов2.Свойство = &Свойство2
                             |    И ЗначенияСвойствОбъектов2.Значение = &Значение2
                             |    И ДоговорыКонтрагентов.Организация = &Организация
11 Axel2009
 
03.08.11
10:16
(8) это или выведет товар1 и товар2
12 Axel2009
 
03.08.11
10:16
(10) и счас будет вопрос, а если 3 пары =)
13 Reset
 
03.08.11
10:16
(11) Поторопился, виноват
14 Axel2009
 
03.08.11
10:20
ВЫБРАТЬ Свойство, Значение
ПОМЕСТИТЬ НаборыПар
ИЗ &ТЗ КАК ТЗ
;
ВЫБРАТЬ ЗначенияСвойствОбъектов.Объект
ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
ВНУТРЕННЕЕ СОЕДИНЕНИЕ НаборыПар
ПО ЗначенияСвойствОбъектов.Свойство = НаборыПар.Свойство
И ЗначенияСвойствОбъектов.Значение = НаборыПар.Значение
СГРУППИРОВАТЬ ПО ЗначенияСвойствОбъектов.Объект
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) = &КоличествоПар
15 Reset
 
03.08.11
10:28
(7) (8)


Выбрать
   ЗначенияСвойств.Объект КАК Объект
Поместить т1
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
ГДЕ
   ЗначенияСвойств.Свойство = &Свойство1
   И ЗначенияСвойств.Значение = &Значение1
;
Выбрать
   ЗначенияСвойств.Объект КАК Объект
Поместить т2
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств
ГДЕ
   ЗначенияСвойств.Свойство = &Свойство2
   И ЗначенияСвойств.Значение = &Значение2
;
Выбрать
   т1.Объект
ИЗ
   т1 КАК т1
       Внутреннее соединение т2 КАК т2
       ПО т1.Объект = т2.Объект
16 Reset
 
03.08.11
10:38
(14) &КоличествоПар - Количество различных (одновременно накладываемых на условие)свойств? (цвет и размер в данном случае)

Решение мне нравится)
17 Axel2009
 
03.08.11
10:41
(16) да, в скуле я бы написал
КОЛИЧЕСТВО(*) = (ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ НаборыПар)
тут не знаю прокатит али нет
18 Ненавижу 1С
 
гуру
03.08.11
10:42
как вариант:

ВЫБРАТЬ
   ТЗ.Свойство,
   ТЗ.Значение
ПОМЕСТИТЬ ТЗ
ИЗ
   &ТЗ КАК ТЗ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЗначенияСвойствОбъектов.Объект
ИЗ
   РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
       ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТЗ КАК ТЗ
       ПО ЗначенияСвойствОбъектов.Свойство = ТЗ.Свойство
           И ЗначенияСвойствОбъектов.Значение = ТЗ.Значение
ГДЕ
   ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура

СГРУППИРОВАТЬ ПО
   ЗначенияСвойствОбъектов.Объект

ИМЕЮЩИЕ
   КОЛИЧЕСТВО(ЗначенияСвойствОбъектов.Объект) = &КоличествоУсловий
19 api_vlad
 
03.08.11
10:42
(15) Этот запрос мне понятен :-), но в тему к (12) - сколько пар, столько и соединений, так? Иными словами, при заранее неизвестном количестве пар будем строить динамический запрос. (почему бы и нет...)
20 Reset
 
03.08.11
10:44
(17) Не, не нужно. В таком виде(14) (с доп параметром) решение позволяет задать несколько условий сразу
ну типа
Цвет:Белый, Размер:36
И
Цвет:Серый, Размер:38
И
Цвет:Малиновый, Размер:45

С результатом
Товар1,Товар5,Товар7
21 api_vlad
 
03.08.11
10:44
(18)(14)Надо попробовать. Спасибо.
22 Reset
 
03.08.11
10:48
(19) Запрос из (15) отвечает на постановку в (5).
Другой постановки Не было, были только обрывки условий. Можно фантазировать сколько угодно, "а что будет, если".
Нужно точно описывать, что нужно.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.