Имя: Пароль:
1C
1С v8
Запрос к свойствам
0 organizm
 
26.03.13
14:59
Есть запрос:
ВЫБРАТЬ
   |    ХарактеристикиНоменклатуры.Ссылка КАК Ссылка
   |ИЗ
   |    Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК СвойствоИзготовитель
   |        ПО ХарактеристикиНоменклатуры.Ссылка = СвойствоИзготовитель.Объект
   |            И (СвойствоИзготовитель.Свойство = &сввоИзготовитель)
   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК СвойствоЗаход
   |        ПО ХарактеристикиНоменклатуры.Ссылка = СвойствоЗаход.Объект
   |            И (СвойствоЗаход.Свойство = &сввоЗаход)
   |ГДЕ
   |    ХарактеристикиНоменклатуры.Владелец.Код = &Код
   |    И СвойствоИзготовитель.Значение.Код = &Изготовитель
   |    И СвойствоЗаход.Значение = &Заход
   |    И ХарактеристикиНоменклатуры.Активная = ИСТИНА
Ищется характеристика по связке 2-х свойств.
Как оптимальней его переделать, чтобы не было 2-х соединений?
1 H A D G E H O G s
 
26.03.13
15:01
Максимум!

И вот эту херню убрать

|    ХарактеристикиНоменклатуры.Владелец.Код = &Код
   |    И СвойствоИзготовитель.Значение.Код = &Изготовитель
2 organizm
 
26.03.13
15:03
при загрузке из внешнего источника (не 1С) даются строковые коды, приходится обходиться этой "херней"
3 organizm
 
26.03.13
15:04
лажево как-то с двумя соединениями...
4 H A D G E H O G s
 
26.03.13
15:13
ВЫБРАТЬ
   ХарактеристикиНоменклатуры.Ссылка КАК Ссылка
ИЗ
   Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК Свойства
       ПО ХарактеристикиНоменклатуры.Ссылка = Свойства.Объект
           И (Свойства.Свойство В (&сввоЗаход, &сввоИзготовитель))
ГДЕ
   ХарактеристикиНоменклатуры.Владелец.Код = &Код
   И ВЫБОР
           КОГДА Свойства.Свойство = &сввоЗаход
               ТОГДА Свойства.Значение = &Заход
           ИНАЧЕ ИСТИНА
       КОНЕЦ
   И ХарактеристикиНоменклатуры.Активная = ИСТИНА
   И ВЫБОР
           КОГДА Свойства.Свойство = &сввоИзготовитель
               ТОГДА ВЫРАЗИТЬ(Свойства.Значение КАК Справочник.Контрагенты).Код = &Изготовитель
           ИНАЧЕ ИСТИНА
       КОНЕЦ
5 H A D G E H O G s
 
26.03.13
15:13
Обрати на
ВЫРАЗИТЬ(Свойства.Значение КАК Справочник.Контрагенты)

и удостоверься, что это твой справочник.
6 organizm
 
26.03.13
15:19
супер! щас протестю
7 AndOne
 
26.03.13
15:24
(3) не вижу причин, почему "лажево", все логично.

Можно, конечно, переписать на временные таблицы для более удобного чтения, но увеличения производительности не будет особого.

ВЫБРАТЬ
   ХарактеристикиНоменклатуры.Ссылка КАК Ссылка
ПОМЕСТИТЬ ХарактеристикиНоменклатурыКОбработке
ИЗ
   Справочник.хлХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ГДЕ
   ХарактеристикиНоменклатуры.Владелец.Код = &Код

ИНДЕКСИРОВАТЬ ПО
   Ссылка
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ХарактеристикиНоменклатуры.Ссылка КАК Ссылка
ИЗ
   ХарактеристикиНоменклатурыКОбработке КАК ХарактеристикиНоменклатуры
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хлЗначенияСвойствОбъектов КАК СвойстваИзготовитель
       ПО ХарактеристикиНоменклатуры.Ссылка = СвойстваИзготовитель.Объект
           И (СвойстваИзготовитель.Свойство = &сввоИзготовитель)
           И (ВЫРАЗИТЬ(СвойстваИзготовитель.Значение КАК Справочник.Контрагенты).Код = &Изготовитель)
       ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.хлЗначенияСвойствОбъектов КАК СвойстваЗаход
       ПО ХарактеристикиНоменклатуры.Ссылка = СвойстваЗаход.Объект
           И (СвойстваЗаход.Свойство = &сввоЗаход)
           И (СвойстваЗаход.Значение = &Заход)
ГДЕ
   ВЫБОР
           КОГДА НЕ СвойстваЗаход.Значение ЕСТЬ NULL
                   И НЕ СвойстваИзготовитель.Значение ЕСТЬ NULL
               ТОГДА ИСТИНА
           ИНАЧЕ ЛОЖЬ
       КОНЕЦ
8 H A D G E H O G s
 
26.03.13
15:27
(7) Советую тебе почитать про Индексы побольше
9 organizm
 
26.03.13
15:33
по мне так чем меньше строк, тем лучше
10 organizm
 
26.03.13
15:33
или "все гениальное - просто!"
11 hhhh
 
26.03.13
15:48
(10) но вообще-то надо сразу ко всему списку запрос сделать, а не по каждой номенклатуре фигачить отдельный запрос в цикле.
12 organizm
 
26.03.13
15:51
а если в цикле добавляется характеристика нужная? в первичной выборке ее уже не будет, а для случая характеристика эта понадобится.
13 hhhh
 
26.03.13
15:54
(12) не появится. У каждой номенклатуры свои отдельные характеристики.
14 organizm
 
26.03.13
16:02
ты не понял. алгоритм: 1) выбираем все характеристики номенклатуры 2) идем по циклу строк данных внешнего документа 3) не находим в выборке для номенклатуры характеристику, добавляем в базу 4) в следующей строке по этой же номенклатуре не находим характеристику в выборке... опять добавляем в базу - дублирование.
Конечно по уму надо либо выборку обновлять, либо туда подпихивать новую характеристику. А это "хрен редьки не слаще" чем постоянный запрос к ИБ.
15 organizm
 
26.03.13
16:06
тем более если запрос простой, почему бы его в цикл не пихнуть.
16 hhhh
 
26.03.13
16:14
(15) 10000 запросов выполнятся у тебя в 10000 раз дольше по времени, чем один запрос по всей номенклатуре. Хочешь ночами сидеть со свечкой, ожидая, пока характеристики сравнятся?
17 ДенисЧ
 
26.03.13
16:16
(16) Да пусть сидит, тебе что, свеку жалко?
18 organizm
 
26.03.13
16:16
(16) да это верно в идеале.
в (14) не понятно написал?
19 organizm
 
26.03.13
16:17
(16) это все верно, когда характеристики не меняются
20 hhhh
 
26.03.13
16:27
(18) ну просто выкинуть из исходного файла одинаковые строчки. У которых код, изготовитель и заход одинаковые. Тогда характеристики не повторятся. И можно так: не нашли в выборке 260 характеристик, ну их и добавили.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.