|
Запрос на выборку характеристик по условиям | ☑ | ||
---|---|---|---|---|
0
trialex3
20.03.23
✎
16:15
|
Уважаемые знатоки, прошу помочь. Есть 2 процедуры. Обе делают одно и тоже - ищут характеристики по набору свойств и значений. Одна "Красивая" и выдернутая из обработки, которую делал хороший специалист. А 2ая неизвестно кем написана и выглядит намного хуже. Тем не менее 1ая работает в 2-3 раза медленнее. Мне нужно выбрать между ними какую использовать. Объясните почему 1ая такая медленная и можно ли ее как то ускорить?
1-ая процедура -------------------- Процедура ПодобратьХарактеристики() Экспорт Запрос = Новый Запрос; ТекстЗапроса = "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ | ЗначенияСвойств1.Объект КАК ХарактеристикаНоменклатуры, | ЗначенияСвойств1.Объект.Наименование КАК ХарактеристикаНаименованиеДо, | ЗначенияСвойств1.Объект.Активная КАК Активная |ИЗ | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств1"; Блок_ИЗ = ""; Блок_ГДЕ = ""; Если ОтборАктивность = 1 Тогда //Только активные характеристики Блок_ГДЕ = Символы.ПС + " ГДЕ" + Символы.ПС + Символы.Таб + "ЗначенияСвойств1.Объект.Активная"; ИначеЕсли ОтборАктивность = 2 Тогда //Только неактивные характеристики Блок_ГДЕ = Символы.ПС + " ГДЕ" + Символы.ПС + Символы.Таб + "НЕ ЗначенияСвойств1.Объект.Активная"; Иначе //Все характеристики Блок_ГДЕ = Символы.ПС + " ГДЕ" + Символы.ПС + Символы.Таб + "ИСТИНА"; КонецЕсли; Если РежимПодбораПоСтроке > 0 И ЗначениеЗаполнено(ОтборПоСтроке) Тогда Если РежимПодбораПоСтроке = 1 Тогда Блок_ГДЕ = Блок_ГДЕ + Символы.ПС + Символы.Таб + "И ЗначенияСвойств1.Объект.Наименование ПОДОБНО &ОтборПоСтроке"; ИначеЕсли РежимПодбораПоСтроке = 2 Тогда Блок_ГДЕ = Блок_ГДЕ + Символы.ПС + Символы.Таб + "И НЕ ЗначенияСвойств1.Объект.Наименование ПОДОБНО &ОтборПоСтроке"; КонецЕсли; Запрос.Параметры.Вставить("ОтборПоСтроке","%" + ОтборПоСтроке + "%"); КонецЕсли; Счетчик = 0; Для каждого СтрокаОтбора Из Свойства Цикл Если СтрокаОтбора.Режим = "Добавить" ИЛИ НЕ ЗначениеЗаполнено(СтрокаОтбора.ЗначениеСвойства) Тогда Продолжить; КонецЕсли; Счетчик = Счетчик + 1; Блок_ГДЕ = Блок_ГДЕ + Символы.ПС + Символы.Таб + "И ЗначенияСвойств" + Счетчик + ".Свойство = &Свойство" + Счетчик + Символы.ПС + Символы.Таб + "И ЗначенияСвойств" + Счетчик + ".Значение = &Значение" + Счетчик; Если Счетчик > 1 Тогда Блок_ИЗ = Блок_ИЗ + Символы.ПС + Символы.Таб + "ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств" + Счетчик + Символы.ПС + Символы.Таб + "ПО ЗначенияСвойств" + Счетчик + ".Объект = ЗначенияСвойств" + (Счетчик - 1) + ".Объект "; КонецЕсли; Запрос.УстановитьПараметр("Свойство" + Счетчик, СтрокаОтбора.Свойство); Запрос.УстановитьПараметр("Значение" + Счетчик, СтрокаОтбора.ЗначениеСвойства); КонецЦикла; Запрос.Текст = ТекстЗапроса + Блок_ИЗ + Блок_ГДЕ; РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл НоваяСтрока = ОтобранныеХарактеристики.Добавить(); НоваяСтрока.Изменить = Истина; ЗаполнитьЗначенияСвойств(НоваяСтрока,ВыборкаДетальныеЗаписи); КонецЦикла; КонецПроцедуры -------------------- 2-ая процедура -------------------- Процедура ОтборНажатие(Элемент) // Вставить содержимое обработчика. //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! перем Счетчик; перем ТекстЗапросаОкончание; Счетчик=1; ТабличноеПоле2.Очистить(); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ХарактеристикиНоменклатуры.Владелец как Номенклатура, | ХарактеристикиНоменклатуры.Ссылка как Характеристика |ИЗ | Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры "; //СКЛЕиВАЕМ УСЛОВИЯ ЧЕРЕЗ ВНУТРЕННИЕ СОЕДИНЕНИЯ Счетчик=1; ТекстЗапросаОкончание=""; Для каждого Условие Из ТабличноеПоле1 Цикл Счетчик=Счетчик+1; Если Условие.Пусто Тогда Запрос.Текст=Запрос.Текст+ " левое соединение |(ВЫБРАТЬ ЗначенияСвойствОбъектов.Объект КАК Объект1, ЗначенияСвойствОбъектов.Значение КАК Значение ИЗ |РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ ЗначенияСвойствОбъектов.Свойство.Ссылка =&Свойство" +строка(Счетчик)+") как Запрос"+строка(Счетчик) + " ПО Запрос"+строка(Счетчик)+".Объект1 = ХарактеристикиНоменклатуры.Ссылка"; ТекстЗапросаОкончание=ТекстЗапросаОкончание+ " и Запрос"+ строка(Счетчик)+".Значение is null" Иначе Запрос.Текст=Запрос.Текст+ " внутреннее соединение |(ВЫБРАТЬ ЗначенияСвойствОбъектов.Объект КАК Объект1 ИЗ |РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов |ГДЕ ЗначенияСвойствОбъектов.Свойство.Ссылка =&Свойство" +строка(Счетчик)+" и ЗначенияСвойствОбъектов.Значение=&Значение"+строка(Счетчик)+") как Запрос"+строка(Счетчик) + " ПО Запрос"+строка(Счетчик)+".Объект1 = ХарактеристикиНоменклатуры.Ссылка"; КонецЕсли; ПараметрУсловия = Неопределено; Если ЗначениеЗаполнено(Условие.Колонка2) Тогда //Либо ссылка на условие либо просто число ПараметрУсловия = Условие.Колонка2; ИначеЕсли ЗначениеЗаполнено(Условие.ЧисловоеЗначение) Тогда ПараметрУсловия = Условие.ЧисловоеЗначение; КонецЕсли; Запрос.УстановитьПараметр("Свойство"+строка(Счетчик), Условие.Колонка1); Запрос.УстановитьПараметр("Значение"+строка(Счетчик), ПараметрУсловия); КонецЦикла; Запрос.Текст=Запрос.Текст+ " Где ХарактеристикиНоменклатуры.Активная=&Активные "+ТекстЗапросаОкончание; Запрос.УстановитьПараметр("Активные", ЭлементыФормы.Флажок1.Значение); // сообщить(Запрос.Текст); Результат = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл // Вставить обработку выборки ВыборкаДетальныеЗаписи НоваяСтрока=ТабличноеПоле2.Добавить(); НоваяСтрока.Номенклатура=ВыборкаДетальныеЗаписи.Номенклатура; НоваяСтрока.Характеристика=ВыборкаДетальныеЗаписи.Характеристика; КонецЦикла; //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА КонецПроцедуры -------------------- |
|||
1
trialex3
20.03.23
✎
16:16
|
Для удобства вот примеры запросов которые они формируют
1ая ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ЗначенияСвойств1.Объект КАК ХарактеристикаНоменклатуры, ЗначенияСвойств1.Объект.Наименование КАК ХарактеристикаНаименованиеДо, ЗначенияСвойств1.Объект.Активная КАК Активная ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств2 ПО ЗначенияСвойств2.Объект = ЗначенияСвойств1.Объект ГДЕ ЗначенияСвойств1.Объект.Активная И ЗначенияСвойств1.Свойство = &Свойство1 И ЗначенияСвойств1.Значение = &Значение1 И ЗначенияСвойств2.Свойство = &Свойство2 И ЗначенияСвойств2.Значение = &Значение2 2ая ВЫБРАТЬ ХарактеристикиНоменклатуры.Владелец КАК Номенклатура, ХарактеристикиНоменклатуры.Ссылка КАК Характеристика ИЗ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ЗначенияСвойствОбъектов.Объект КАК Объект1 ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ГДЕ ЗначенияСвойствОбъектов.Свойство.Ссылка = &Свойство2 И ЗначенияСвойствОбъектов.Значение = &Значение2) КАК Запрос2 ПО (Запрос2.Объект1 = ХарактеристикиНоменклатуры.Ссылка) ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ЗначенияСвойствОбъектов.Объект КАК Объект1 ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов ГДЕ ЗначенияСвойствОбъектов.Свойство.Ссылка = &Свойство3 И ЗначенияСвойствОбъектов.Значение = &Значение3) КАК Запрос3 ПО (Запрос3.Объект1 = ХарактеристикиНоменклатуры.Ссылка) ГДЕ ХарактеристикиНоменклатуры.Активная = &Активные |
|||
2
vicof
20.03.23
✎
16:20
|
(1) Условия из ГДЕ можно перенести в ПО. Возможно, время сократится.
Плюс в первом случае два свойства отбираются во втором три. |
|||
3
trialex3
20.03.23
✎
16:21
|
(2) и там и там одинаковое количество свойств - там проблема в коде видимо. по факту свойств 2 везде точно.
|
|||
4
vicof
20.03.23
✎
16:21
|
(3) Хотя не, это цифры в названиях меня смутили
|
|||
5
trialex3
20.03.23
✎
16:22
|
(2) И самое для меня загадочное что 1ый (красивый) запрос работает медленнее чем 2ой
|
|||
6
vicof
20.03.23
✎
16:23
|
А если эти поля не выбирать?
ЗначенияСвойств1.Объект.Наименование КАК ХарактеристикаНаименованиеДо, ЗначенияСвойств1.Объект.Активная КАК Активная |
|||
7
trialex3
20.03.23
✎
16:28
|
(6) Хм ну да. Вроде как проблема в разыменовании...Попробую наименование тоже через соединения вытащить - мб быстрее будет
|
|||
8
trialex3
20.03.23
✎
16:30
|
(6) Тогда сразу в догонку второй вопрос. Можно ли к первому запросу добавить по аналогии со вторым условие на невхождение свойства? Типа если свойства в характеристике должно не быть?
|
|||
9
trialex3
20.03.23
✎
16:31
|
(6) И еще. На ваш взгляд - какой лучше запрос использовать? Который из них сделан правильнее?
|
|||
10
vicof
20.03.23
✎
16:39
|
(7) Не будет. Оно уже через соединение сделано. Типы свойств надо выражать.
(8) Можно. (9) Первый красивше. |
|||
11
trialex3
20.03.23
✎
16:49
|
(10) По поводу невхождения - если можно то как, не подскажите?)
Я добавляю по аналогии с вторым и получается пустой запрос ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ЗначенияСвойств1.Объект КАК ХарактеристикаНоменклатуры, ХарактеристикиНоменклатуры.Наименование КАК ХарактеристикаНаименованиеДо, ЗначенияСвойств1.Объект.Активная КАК Активная ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО ЗначенияСвойств1.Объект = ХарактеристикиНоменклатуры.Ссылка ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств2 ПО ЗначенияСвойств2.Объект = ЗначенияСвойств1.Объект ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств3 ПО ЗначенияСвойств3.Объект = ЗначенияСвойств2.Объект ГДЕ ЗначенияСвойств1.Объект.Активная И ЗначенияСвойств1.Свойство = &Свойство1 И ЗначенияСвойств1.Значение = &Значение1 И ЗначенияСвойств2.Свойство = &Свойство2 И ЗначенияСвойств2.Значение = &Значение2 И ЗначенияСвойств3.Свойство = &Свойство3 И ЗначенияСвойств3.Значение = ЕСТЬ NULL |
|||
12
trialex3
20.03.23
✎
16:50
|
ЛЕВОЕ соединение у последнего условия. Ошибся
ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ЗначенияСвойств1.Объект КАК ХарактеристикаНоменклатуры, ХарактеристикиНоменклатуры.Наименование КАК ХарактеристикаНаименованиеДо, ЗначенияСвойств1.Объект.Активная КАК Активная ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО ЗначенияСвойств1.Объект = ХарактеристикиНоменклатуры.Ссылка ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств2 ПО ЗначенияСвойств2.Объект = ЗначенияСвойств1.Объект ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств3 ПО ЗначенияСвойств3.Объект = ЗначенияСвойств2.Объект ГДЕ ЗначенияСвойств1.Объект.Активная И ЗначенияСвойств1.Свойство = &Свойство1 И ЗначенияСвойств1.Значение = &Значение1 И ЗначенияСвойств2.Свойство = &Свойство2 И ЗначенияСвойств2.Значение = &Значение2 И ЗначенияСвойств3.Свойство = &Свойство3 И ЗначенияСвойств3.Значение = ЕСТЬ NULL |
|||
13
trialex3
20.03.23
✎
16:51
|
Жаль тут сообщения нельзя править - финальный результат)
всеравно не работает правда... ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ЗначенияСвойств1.Объект КАК ХарактеристикаНоменклатуры, ХарактеристикиНоменклатуры.Наименование КАК ХарактеристикаНаименованиеДо, ЗначенияСвойств1.Объект.Активная КАК Активная ИЗ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры ПО ЗначенияСвойств1.Объект = ХарактеристикиНоменклатуры.Ссылка ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств2 ПО ЗначенияСвойств2.Объект = ЗначенияСвойств1.Объект ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойств3 ПО ЗначенияСвойств1.Объект = ЗначенияСвойств3.Объект ГДЕ ЗначенияСвойств1.Объект.Активная И ЗначенияСвойств1.Свойство = &Свойство1 И ЗначенияСвойств1.Значение = &Значение1 И ЗначенияСвойств2.Свойство = &Свойство2 И ЗначенияСвойств2.Значение = &Значение2 И ЗначенияСвойств3.Свойство = &Свойство3 И ЗначенияСвойств3.Значение = ЕСТЬ NULL |
|||
14
vicof
20.03.23
✎
16:54
|
"И ЗначенияСвойств3.Значение = ЕСТЬ NULL"
может быть сначала книжки по запросам почитать? И все равно сделал из двух запросов какашку |
|||
15
trialex3
20.03.23
✎
16:56
|
(14) Да это я тоже поправил. Просто у меня тестовый запрос длинный на 5 свойств и пока правил его для форума - что бы поменьше был кучу ошибок допустил)
|
|||
16
Смотрящий
20.03.23
✎
17:10
|
(0) Все в топку.
Сделай через объединить все с калькуляцией количества объектов |
|||
17
trialex3
20.03.23
✎
17:15
|
(16) Не очень понял это как? Получится же неверно.
Если я объединю все характеристики с свойством 1 + все характеристики с свойством 2, то разве это будет корректно? Свойств в характеристике много и надо найти все характеристики у которых есть все свойства из списка. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |