Имя: Пароль:
1C
1С v8
Помогите оптимизировать запрос
0 oslokot
 
23.08.13
14:10
Простой запрос к регистру значений свойств.
Выбираю все значения по указанному свойству, объекты которых не помечены на удаление и соответствуют некоторому наименованию.

    Запрос = Новый Запрос;
    Запрос.Текст=
    "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Объект КАК Объект
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Свойство = &ВыбСвойство
    |    И ЗначенияСвойствОбъектов.Значение В(&ВыбСписокЗначенийСвойств)
    |    И НЕ ЗначенияСвойствОбъектов.Объект.ПометкаУдаления
    |    И ЗначенияСвойствОбъектов.Объект.Наименование ПОДОБНО &ВыбНаименование
    |АВТОУПОРЯДОЧИВАНИЕ";
    
    Запрос.УстановитьПараметр("ВыбСвойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Тип ТПА"));
    Запрос.УстановитьПараметр("ВыбСписокЗначенийСвойств", ВыбСписокЗначенийСвойств);
    Запрос.УстановитьПараметр("ВыбНаименование", "шпилька%");

С двумя последними условиями, запрос работает на порядок дольше чем без них.
Как написать правильно?
Прошу простить, недавно начал изучать запросы.
68 z01
 
23.08.13
16:09
(66)(60)так вот и тут о том что лучше его склонить к левому внешнему
69 genosse
 
23.08.13
16:09
"как пирамида подзапросов" - ребята, что тут за бред???
70 genosse
 
23.08.13
16:09
антинаучный флуд чтоли пошел
71 z01
 
23.08.13
16:10
(67)в первую очередь скорее всего будет исполнен самый нижний и т.д. наверх
72 Полотенчик
 
23.08.13
16:10
(31) вместо оптимизации запроса увеличиваешь время записи и потерю места лишними индексами?
73 Bober
 
23.08.13
16:11
(69) пирамида маслоу
74 z01
 
23.08.13
16:11
(69) "ВЫБРАТЬ
|    Валюты.Ссылка
|ИЗ
|    Справочник.Валюты КАК Валюты
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|            Валюты.Ссылка КАК Ссылка
|        ИЗ
|            Справочник.Валюты КАК Валюты
|                ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
|                    Валюты.Ссылка КАК Ссылка
|                ИЗ
|                    Справочник.Валюты КАК Валюты) КАК ВложенныйЗапрос
|                ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос
|        ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка"
75 z01
 
23.08.13
16:12
точнее так

ВЫБРАТЬ
           |    Валюты.Ссылка
           |ИЗ
           |    Справочник.Валюты КАК Валюты
           |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           |            Валюты.Ссылка КАК Ссылка
           |        ИЗ
           |            Справочник.Валюты КАК Валюты
           |                ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
           |                    Валюты.Ссылка КАК Ссылка
           |                ИЗ
           |                    Справочник.Валюты КАК Валюты) КАК ВложенныйЗапрос
           |                ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос
           |        ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка
76 Bober
 
23.08.13
16:12
Zed's dead baby, Zed's dead
77 z01
 
23.08.13
16:13
сорри спешу )))
вот правильный вариант

ВЫБРАТЬ
           |    Валюты.Ссылка
           |ИЗ
           |    (ВЫБРАТЬ
           |        Валюты.Ссылка КАК Ссылка
           |    ИЗ
           |        (ВЫБРАТЬ
           |            Валюты.Ссылка КАК Ссылка
           |        ИЗ
           |            Справочник.Валюты КАК Валюты) КАК ВложенныйЗапрос
           |            ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Валюты
           |            ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка) КАК ВложенныйЗапрос
           |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Валюты КАК Валюты
           |        ПО Валюты.Ссылка = ВложенныйЗапрос.Ссылка

)))
78 Bober
 
23.08.13
16:13
(74)(75)(77) нет времени объяснять, расстрелять
79 z01
 
23.08.13
16:17
(78)это пример пирамиды только справочник там один просто для примера, внизу должен был быть отбор по запросу сабжа возращающий минимум строк и т.д. т.е. задача так компонуется чтобы все условия соблюсти но левыми внешними сделать результат на каждом этапе возвращающающий  минимум строк, если ларечникам не понятно то это печалька, удачки вам )))
80 viktor_vv
 
23.08.13
16:17
(78)+1 . Особенно (74) (75). Че-то мне имхается эти многоуровневые подзапросы свернут башку оптимизатору скуля влегкую.
81 z01
 
23.08.13
16:17
(79) и скуль будет летать
82 z01
 
23.08.13
16:18
(80)концепт в (77) остальное потереть нужно
83 viktor_vv
 
23.08.13
16:19
(79) Я таки настаиваю, что порядок написания подзапросов и их вложенность никак не повлияет на план выполнения, а только усугубит проюлему скулю с построением плана.
84 Bober
 
23.08.13
16:20
(83) +1
85 genosse
 
23.08.13
16:23
ветка пятничного ламерского бреда )))
86 z01
 
23.08.13
16:25
(83)(84)и правильно, представьте что у вас записей во всех задействованных таблицах от сотен тысяч до миллионов хотя бы. и скуль админы не дают а индексы ларечник шеф вместе с конфой держит. и что вы будете делать? делать так чтобы промежуточные результаты содержали бы минимум строк, последний раз повторяю подумайте как скуль работает, он работает с таблицами а не по волшебству и если у вас в промежуточных результатах миллион записей это и подтормозит всё а я выложил метод который почти 100% сработает как директива построителю.
87 z01
 
23.08.13
16:26
(85)да. достали уже. вместо того чтобы пояснить человеку как запрос переписать они ему хвастаются как доказали практически торможение составных данных, а толку то что с того, запрос от этих рассуждений быстрее не сработает
88 Bober
 
23.08.13
16:28
давно я так не ржал
89 z01
 
23.08.13
16:28
просто мой подход более универсален чем метод обхода проблемы указанный в
http://infostart.ru/public/184361/
вот и бесятся
90 z01
 
23.08.13
16:29
короче последний раз пишу:
чем искать как отобрать по составному типу лучше отобрать части составного типа и к ним приджойнить таблицу из которй нужно отобрать
91 oslokot
 
23.08.13
16:30
Итак. Запрос (17) и запрос (30), выполняются абсолютно одинаково по времени, судя по замеру производительности. Что подтверждает (23)
Ура) Думаю вот, какой оставить, внутреннее или левое соединение
92 viktor_vv
 
23.08.13
16:30
(86) Вот тебе задача. Какой запрос будет быстрее

1.

Select
sub1.id
From
(Select id from t1 Where a =p) as sub1
Left join t2 as t2 on t2.id = sub1.id

или
2.

Select
sub1.id
From
t1 as t1
Left join t2 as t2 on t2.id = t1.id
where t1.a = p
93 oslokot
 
23.08.13
16:31
(91) * (30)>(55)
94 Bober
 
23.08.13
16:32
"скуль админы не дают а индексы ларечник шеф вместе с конфой держит" и наш герой, который подсказывает построителю отчета как оптимизатор скля должен работать. ипанись. вы там наверное не учетом занимаетесь, а соревнуетесь, кто больше всех удивит.
95 viktor_vv
 
23.08.13
16:32
* во втором sub1.id ->> t1.id

и количество записей в t1 в 100 раз больше чем в t2.
96 Bober
 
23.08.13
16:32
(95) как ты жесток.
97 oslokot
 
23.08.13
16:33
(91) + тьфу ты тяпница!) все перепутал.
Кароче (17) и (20) выполняются по времени одинаково. Все ништяк
98 viktor_vv
 
23.08.13
16:34
(96) А то :).
99 Bober
 
23.08.13
16:34
(97) а мы тут уже сменили темы разговора
100 viktor_vv
 
23.08.13
16:36
(99) Это типа жених и невеста на свадьбе нужны первые 10 минут, в качестве повода побухать :).
101 oslokot
 
23.08.13
16:36
100 )
102 oslokot
 
23.08.13
16:36
(99) (100) ха, я заметил )
103 z01
 
23.08.13
16:36
(95)да хватит уже разводить ))) я же писал что допустим индексы есть, а если нет и поиск значителен то при построении запроса подзапросы следует строить с учетом размера таблиц )))(94)а вы ларечники наверное и никогда не писали запросы под большие базы где реально видно что если его компоновать не так как я рекомендую то он вообще ничего никогда не выдаст за приемлемое время
104 Bober
 
23.08.13
16:38
(103) я на латочника работаю, он файловую базу на флешке носит .
105 z01
 
23.08.13
16:38
(100)просто наверное он один раз на выполнение запустил, а со второго пошло и сабжа нет )))
106 viktor_vv
 
23.08.13
16:39
(103) Так ответ будет на (92) ?

Учитывая твое
"выложил метод который почти 100% сработает как директива построителю"
для тебя ответ должен быть как бы очевиден.
107 Bober
 
23.08.13
16:39
(106) ответа он не знает, админы не дают доступа к скл серверу.
108 z01
 
23.08.13
16:42
(104)да не важно на кого ты работаешь, ларечник это диагноз иногда даже на большие базы люди попадают и всё равно предлагают вместо того чтобы индекс добавить купить сервер в 10 раз дороже
(106) ответ в (103) и у тебя там не совсем наш случай, и я утверждаю что моя метода работает как директива, но имхо это помогает и в частности обойти проблему составных типов даже не думая о них
109 z01
 
23.08.13
16:45
(106)джойнить нужно к результату подзапроса ))) умники. а у тебя везде левое к sub1 ))
110 viktor_vv
 
23.08.13
16:45
(108) Ну так номер варианта назови из (92) 1. или 2. ?
Я привел илюстрацию для твоего утверждения насчет директив планировщику запросов.
111 z01
 
23.08.13
16:46
(110)джойнить нужно к результату подзапроса , а у тебя везде левое к sub1
112 Bober
 
23.08.13
16:48
чет скучно здесь стало, зедик уже не веселит.
113 z01
 
23.08.13
16:49
(111)(110)или нет?
114 viktor_vv
 
23.08.13
16:49
Ну а sub1 это разве не результат подзапроса. Мне нужны там все записи из таблицы t1 удовлетворяющие условию a=@p в соединении с таблицей t2.
115 oslokot
 
23.08.13
16:59
Подождите Гуру, не расходитесь.
Еще маленький вопрос.
как написать по-правильному вот такую кучу условий:
...
    |    И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить1
    |    И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить2
    |    И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить3
    |    И НЕ Наименование ПОДОБНО &ВыбПодСтрокаИсключить4
...
    Запрос.УстановитьПараметр("ВыбПодстрокаИсключить1", "яя%");
    Запрос.УстановитьПараметр("ВыбПодстрокаИсключить2", "%шайба-гровер%");
    Запрос.УстановитьПараметр("ВыбПодстрокаИсключить3", "%шпилька в комплекте%");
    Запрос.УстановитьПараметр("ВыбПодстрокаИсключить4", "% простой%");
116 Bober
 
23.08.13
17:01
(115) Может лучше полнотекстовый поиск включить
117 z01
 
23.08.13
17:04
(114)Select
sub1.id
From
t1 as t1 это не ошибка?
118 Bober
 
23.08.13
17:05
(115) если запрос вида ВЫБРАТЬ Ссылка ИЗ --- ГДЕ то никак, это и есть нормальная версия. если что-то сложнее, то нужно смотреть запрос.
119 viktor_vv
 
23.08.13
17:05
(117) Ошибка. В (95) поправил и дополнительную вводную дал.
120 viktor_vv
 
23.08.13
17:07
(118) Он наверное это к соединению со свойствами прилепить хочет.
Наверное лучше сначала по справочнику в пакете загнать во временную таблицу по условию и дальше ее уже использовать со свойствами.
121 z01
 
23.08.13
17:14
(119)ты там к таблице один джойниш таблицу два и отбираешь по условию по полю таблицы 1 во втором случае и отбираешь по условию таблицы 1 и джойнишь к результату таблицу 2 в первом.

первый быстрее так как записей на первом этапе первого (выборка по условию) меньше чем на первом этапе второго (соединение)
122 viktor_vv
 
23.08.13
17:17
(121) Ну что и требовалось доказать. Таки на самом деле в 99.5% случаев для обоих запросов из (92) скуль построит абсолютно идентичные планы запроса, соотвественно и время выполнения будет одинаково.
Полпроцента оставил на совесть скуля и статистики, а то мало ли :).
123 z01
 
23.08.13
17:27
(122)в запросе как в сабже всё уже не так может быть как нам хотелось бы, иначе не было бы сабжа
124 viktor_vv
 
23.08.13
17:31
Где-то я могу согласится, что подзапросами как-то может быть можно повлият на составление плана запроса, но это очень не очевидно.

Пример в (92) приведен, чтобы ты не увлекался идеей
директив построителю через порядок написания подзапросов
" сработает как директива построителю".
125 oslokot
 
23.08.13
17:47
(120) да, прикрутить к своему запросу. Хорошо, пока оставлю так.
126 Bober
 
23.08.13
17:58
(125) сделать забор данных в отдельном запросе с времянкой
127 Bober
 
23.08.13
17:58
(125) как посоветовали в (120)
128 Bober
 
23.08.13
18:00
(125) вообще такие вещи уже хорошо делать через СКД с использованием расширения запроса для СКД
129 oslokot
 
27.08.13
10:51
Всем привет! Помогите усложнить запрос.
На данном этапе он выглядит так:
    Запрос = Новый Запрос;
    Запрос.Текст =     
    
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Объект,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
    |            И (ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура)
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Свойство = &ВыбСвойство
    |    И ЗначенияСвойствОбъектов.Значение = &ВыбЗначение
    |    И НЕ Номенклатура.ПометкаУдаления
    |    И НЕ Номенклатура.ЭтоГруппа
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура.Наименование";
    
    Запрос.УстановитьПараметр("ВыбСвойство", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Тип ТПА"));
    Запрос.УстановитьПараметр("ВыбЗначение", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Фланец"));

Этот простой запрос выбирает номенклатуру по единственному значению свойства "Фланец"
Результат: получил всю номенклатуру со свойством "Фланец"
А что делать, когда нужно отобрать эти фланцы еще по нескольким свойствам, например  "Диаметр", "Давление", "Марка"
То есть хочу выбрать фланцы с заданным давлением, диаметром и маркой. Как бы уточненный отбор по свойствам.
130 ptiz
 
27.08.13
10:57
(129)
Способ 1: добавлять еще соединения

Способ 2: получить РС "ЗначенияСвойствОбъектов" во временную таблицу с отбором: Свойство В (&СписокНужныхСвойств), и дальше - как способ 1, но соединять уже с этой ВТ (тоже несколько соединений).

Способ 3: получить РС "ЗначенияСвойствОбъектов" во временную таблицу с отбором: Свойство В (&СписокНужныхСвойств), но сразу делать разные поля с группировкой по полю "Объект".
Например:
ВЫБОР
Объект,
МАКСИМУМ(ВЫБОР КОГДА Свойство - &СвойствоФланец ТОГДА Значение ИНАЧЕ NULL КОНЕЦ) КАК Фланец,
МАКСИМУМ(ВЫБОР КОГДА Свойство - &СвойствоДиаметр ТОГДА Значение ИНАЧЕ NULL КОНЕЦ) КАК Диаметр
..
и потом обойтись одним соединением.

Тут можно делать без ВТ, вложенным запросом.
131 oslokot
 
27.08.13
11:05
(130) а можно поподробнее про получение РС в ВТ? как это пишется?
132 ptiz
 
27.08.13
11:07
ВЫБРАТЬ
Поле1, Поле2
ПОМЕСТИТЬ ВТ1
ИЗ Регистр.НашРегистр
;
ВЫБРАТЬ
Поле1, Поле2
ИЗ ВТ1
133 oslokot
 
27.08.13
11:15
(132) угу, спасиб. сейчас попробую
134 oslokot
 
27.08.13
11:58
нифига непойму
    "ВЫБРАТЬ
    |    ЗначенияСвойствОбъектов.Объект КАК Объект,
    |    ЗначенияСвойствОбъектов.Свойство КАК Свойство
    |ПОМЕСТИТЬ ВТ
    |ИЗ
    |    РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |ГДЕ
    |    ЗначенияСвойствОбъектов.Свойство В(&СписокСвойств)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |    ВТ.Свойство,
    |    ВТ.Объект
    |ИЗ
    |    ВТ КАК ВТ";

пустой запрос
135 oslokot
 
27.08.13
12:03
И еще непонятно, как все это мне поможет?
Ведь выбирать надо значения из разных видов свойств.

Свойство | Значение

Тип      | "Фланец"
Диаметр  | "50"
Давление | "16"
Марка    | "нж"

Нужно выбрать фланцы с диаметром 50, давлением 16 и маркой нж
Как все это соединять, каша какая то в голове (
136 ptiz
 
27.08.13
12:08
Решение в лоб (способ 1): делать столько соединений, сколько свойств в условиях.

В каждом соединении будет условие вида:

ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Фланец

ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Фланец.Объект
И ЗначенияСвойствОбъектов_Фланец.Свойство = &СвойствоФланец
137 Bober
 
27.08.13
12:21
(129) попробуй поработать с СКД
138 oslokot
 
27.08.13
13:52
(137) рано пока для меня (
(136) вот так получилось (способ 1), работает хорошо:
    Запрос = Новый Запрос;
    Запрос.Текст =     
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Объект,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_ТипТПА
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_ТипТПА.Объект
    |            И (ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА)
    |            И (ЗначенияСвойствОбъектов_ТипТПА.Объект ССЫЛКА Справочник.Номенклатура)
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Диаметр
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Диаметр.Объект
    |            И (ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр)
    |            И (ЗначенияСвойствОбъектов_Диаметр.Объект ССЫЛКА Справочник.Номенклатура)
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Давление
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Давление.Объект
    |            И (ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление)
    |            И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура)
    |ГДЕ
    |    ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА
    |    И ЗначенияСвойствОбъектов_ТипТПА.Значение = &Значение_ТипТПА
    |    И ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр
    |    И ЗначенияСвойствОбъектов_Диаметр.Значение = &Значение_Диаметр
    |    И ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление
    |    И ЗначенияСвойствОбъектов_Давление.Значение = &Значение_Давление
    |    И НЕ Номенклатура.ПометкаУдаления
    |    И НЕ Номенклатура.ЭтоГруппа
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура.Наименование";
    
    Запрос.УстановитьПараметр("Свойство_ТипТПА", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Тип ТПА"));
    Запрос.УстановитьПараметр("Значение_ТипТПА", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Фланец"));
    Запрос.УстановитьПараметр("Свойство_Диаметр", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Диаметр"));
    Запрос.УстановитьПараметр("Значение_Диаметр", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Ду__50"));
    Запрос.УстановитьПараметр("Свойство_Давление", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Давление"));
    Запрос.УстановитьПараметр("Значение_Давление", Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию("Ру_16"));

Вроде так? ничего лишнего я не наколбасил?
Время выполнения составляет примерно 0.068 сек., как и в (129)
Оставить так? Или это смотрится как быдло-код?
139 Ёпрст
 
27.08.13
13:57
(138) выкинуть ГДЕ и все соедеиения.
Оставить только одно внутреннее соедиение.
140 Ёпрст
 
27.08.13
13:58
, ну максимум, условие на Где НЕ Номенклатура.ПометкаУдаления
оставить.
141 oslokot
 
27.08.13
14:06
(139) как это выкинуть.. А как же я в одном соединении укажу все условия разношерстных видов? не понимаю...
@Епрст покажи примерчик, пожалуйста
142 oslokot
 
27.08.13
14:06
+ ну проверку ЭтоГруппа выкину, согласен. она не нужна
143 oslokot
 
27.08.13
14:18
(139) По типу такого чтоли?
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Объект,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
    |            И (ЗначенияСвойствОбъектов.Свойство = &Свойство_ТипТПА)
    |            И (ЗначенияСвойствОбъектов.Свойство = &Свойство_Диаметр)
    |            И (ЗначенияСвойствОбъектов.Свойство = &Свойство_Давление)
    |            И (ЗначенияСвойствОбъектов.Значение = &Значение_ТипТПА)
    |            И (ЗначенияСвойствОбъектов.Значение = &Значение_Диаметр)
    |            И (ЗначенияСвойствОбъектов.Значение = &Значение_Давление)
    |            И (ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура)
    |ГДЕ
    |    НЕ Номенклатура.ПометкаУдаления
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура.Наименование";

Только это естественно не работает
144 oslokot
 
27.08.13
14:55
Итак. Выкинул все что можно, получилось так:
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Объект,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_ТипТПА
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_ТипТПА.Объект
    |            И (ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА)
    |            И (ЗначенияСвойствОбъектов_ТипТПА.Объект ССЫЛКА Справочник.Номенклатура)
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Диаметр
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Диаметр.Объект
    |            И (ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр)
    |            И (ЗначенияСвойствОбъектов_Диаметр.Объект ССЫЛКА Справочник.Номенклатура)
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Давление
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Давление.Объект
    |            И (ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление)
    |            И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура)
    |ГДЕ
    |    ЗначенияСвойствОбъектов_ТипТПА.Значение = &Значение_ТипТПА
    |    И ЗначенияСвойствОбъектов_Диаметр.Значение = &Значение_Диаметр
    |    И ЗначенияСвойствОбъектов_Давление.Значение = &Значение_Давление
    |    И НЕ Номенклатура.ПометкаУдаления
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура.Наименование";

Вопрос, как выкинуть все соединения и оставить одно?
145 ptiz
 
27.08.13
15:04
(144) Использовать "способ 3" :)
146 oslokot
 
27.08.13
15:08
(145) :) буду пробовать
Только вот еще одна неотложная проблема образовалась:
Хочу выбирать, например, диаметр=50,60...80 и пусто!
Загнал В список, все хорошо. Выбираются диаметры все, кроме пустых значений. А очень надо пустое. Как быть?
147 oslokot
 
27.08.13
15:09
+ Понимаю, что в РС пустой записи с диаметром нет.
148 viktor_vv
 
27.08.13
15:09
(144)

    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов.Объект
    |            И (ЗначенияСвойствОбъектов.Объект ССЫЛКА Справочник.Номенклатура)
    |            И ((ЗначенияСвойствОбъектов.Свойство = &Свойство_ТипТПА)
    |            ИЛИ (ЗначенияСвойствОбъектов.Свойство = &Свойство_Диаметр)
    |            ИЛИ (ЗначенияСвойствОбъектов.Свойство = &Свойство_Давление)
    |            ИЛИ (ЗначенияСвойствОбъектов.Значение = &Значение_ТипТПА)
    |            ИЛИ (ЗначенияСвойствОбъектов.Значение = &Значение_Диаметр)
    |            ИЛИ (ЗначенияСвойствОбъектов.Значение = &Значение_Давление))
149 viktor_vv
 
27.08.13
15:10
(148)+ Это в (143) изменить.
150 viktor_vv
 
27.08.13
15:13
(146) То есть тебе надо и незаполненные значения для назначенных свойств ? В этом случае в регистре записи не будет.
Это надо еще лепить туда назначение свойств.
151 oslokot
 
27.08.13
15:18
(150) Да, незаполненные значения нужны тоже.
152 Bober
 
27.08.13
15:24
(151) ВНУТРЕННЕЕ СОЕДИНЕНИЕ замени на левое соединение и делай проверку на null, неопределено и пустое значение типа свойства
153 ptiz
 
27.08.13
15:26
(146) Тогда тебе нужно левое соединение, а условия вида
  ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр
переместить в секцию ГДЕ таким образом:
ГДЕ
(ЗначенияСвойствОбъектов_Диаметр.Значение В(&СписокСвойства_Диаметр)
  ИЛИ ЗначенияСвойствОбъектов_Диаметр.Значение ЕСТЬ NULL)
И
...другие отборы
154 oslokot
 
27.08.13
15:27
(152) (153) Спасибо ребят, пробую...
155 oslokot
 
27.08.13
15:58
(153) Ура. Вот так взлетело:
    "ВЫБРАТЬ
    |    Номенклатура.Ссылка КАК Объект,
    |    Номенклатура.Наименование КАК Наименование
    |ИЗ
    |    Справочник.Номенклатура КАК Номенклатура
    |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_ТипТПА
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_ТипТПА.Объект
    |            И (ЗначенияСвойствОбъектов_ТипТПА.Свойство = &Свойство_ТипТПА)
    |            И (ЗначенияСвойствОбъектов_ТипТПА.Объект ССЫЛКА Справочник.Номенклатура)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Диаметр
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Диаметр.Объект
    |            И (ЗначенияСвойствОбъектов_Диаметр.Свойство = &Свойство_Диаметр)
    |            И (ЗначенияСвойствОбъектов_Диаметр.Объект ССЫЛКА Справочник.Номенклатура)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Давление
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Давление.Объект
    |            И (ЗначенияСвойствОбъектов_Давление.Свойство = &Свойство_Давление)
    |            И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура)
    |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов_Марка
    |        ПО Номенклатура.Ссылка = ЗначенияСвойствОбъектов_Марка.Объект
    |            И (ЗначенияСвойствОбъектов_Марка.Свойство = &Свойство_Марка)
    |            И (ЗначенияСвойствОбъектов_Давление.Объект ССЫЛКА Справочник.Номенклатура)
    |ГДЕ
    |    ЗначенияСвойствОбъектов_ТипТПА.Значение = &Значение_ТипТПА
    |    И (ЗначенияСвойствОбъектов_Диаметр.Значение = &Значение_Диаметр
    |            ИЛИ ЗначенияСвойствОбъектов_Диаметр.Значение ЕСТЬ NULL )
    |    И (ЗначенияСвойствОбъектов_Давление.Значение = &Значение_Давление
    |            ИЛИ ЗначенияСвойствОбъектов_Давление.Значение ЕСТЬ NULL )
    |    И (ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка)
    |            ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL )
    |
    |УПОРЯДОЧИТЬ ПО
    |    Номенклатура.Наименование";

То есть "Тип ТПА" оставил ВНУТРЕННИМ соединением, так как это свойство заполнено всегда,
а "Диаметр", "Давление" и "Марка" сделал ЛЕВЫМ соединением с проверкой на NULL
Работает.
Всё правильно написано?
156 oslokot
 
27.08.13
16:12
(155) + А еще, как в запросе включить/выключить условие на NULL? Просто нужно иногда выводить пустые, а иногда нет. Ту должна быть наверное конструкция типа
КОГДА &ВыводитьПустые ТОГДА ИНАЧЕ ИСТИНА...
Так?
157 oslokot
 
27.08.13
16:36
(156) + Или в восьмерке делается так же как в семерке?

Если ВыводитьПустые Тогда
    Запрос.Текст = Запрос.Текст + "...";
КонецЕсли;
158 ptiz
 
27.08.13
16:43
(156) Да, лучше так.
159 oslokot
 
27.08.13
16:56
(158) да вот что-то с синтаксисом не так, или с моей ДНК :)
как эта конструкция применяется?
Вот она:
    ВЫБОР
    КОГДА &ВыбранныйМноюПризнак = ИСТИНА
        ТОГДА Истина
    ИНАЧЕ <Текст условия запроса>
    КОНЕЦ
Как ее применить например сюда:
    |    И (ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка)
    |            ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL )
160 oslokot
 
27.08.13
17:06
(159) + а, всё, кажется догнал )
161 Ёпрст
 
27.08.13
17:11
можешь проще

внутреннее соединение по
значение в список/массив значений
и свойство в список/массив свойств

усё.
162 Ёпрст
 
27.08.13
17:15
ежели значения свойств могут совпадать у разного вида свойст, тогда через пары + или

По  (свойство = свойство1 и значение = значение1)
ИЛИ (свойство = свойство2 и значение = значение2)
...
ИЛИ (свойство = свойствоN и значение = значениеN)
163 Ёпрст
 
27.08.13
17:16
в итоге имеешь одно внутреннее соединение
164 oslokot
 
27.08.13
17:26
(163) Спасибо, это чуть позже попробую.
(159) Вот типа так сделал условие, работает вроде

    |    И ВЫБОР
    |            КОГДА &ВыводитьПустые
    |                ТОГДА (ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка)
    |                        ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL )
    |            ИНАЧЕ ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка)
    |        КОНЕЦ

Или что-то я опять перемудрил?
165 Bober
 
27.08.13
17:37
ВЫБОР
   КОГДА &ВыводитьПустые ТОГДА ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL
   Иначе
Истина
   Конец
Или
(ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка)
166 oslokot
 
27.08.13
18:01
(165) Спасибо!
Получилось так:
ВЫБОР
    КОГДА &ВыводитьПустые
        ТОГДА ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка)
                ИЛИ ЗначенияСвойствОбъектов_Марка.Значение ЕСТЬ NULL
    ИНАЧЕ ЗначенияСвойствОбъектов_Марка.Значение В (&Значение_Марка)
КОНЕЦ

Потому что мне нужно выводить при ВыводитьПустые=Истина не только пустые но и со значениями.
167 Bober
 
27.08.13
18:12
(166) угу, неправильно написал кусок запроса в (165)
Закон Брукера: Даже маленькая практика стоит большой теории.