Имя: Пароль:
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).
Другой постановки Не было, были только обрывки условий. Можно фантазировать сколько угодно, "а что будет, если".
Нужно точно описывать, что нужно.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn