|
УФ. Оптимизация запроса | ☑ | ||
---|---|---|---|---|
0
Rounder
28.03.13
✎
12:15
|
УФ
Справочник «Номенклатура». У нужного мне вида номенклатуры среди прочих есть три свойства «Вид приемки» (СправочникСсылка), «КалькуляционнаяГруппа» (СправочникСсылка) и «Номер в кальк.группе.» (Строка, 2, фикс., вновь создаваемые записи не могут иметь номер «00», но в старых он встречается, уникальный в разрезе «Вид приемки» + «КалькуляционнаяГруппа»). Свойства хранятся в ПВХ, значения свойств в РС. Стоит задача при определенных событиях (например при создании копированием, изменении вида приемки или кальк.группы и пр.) автоматически подставлять в поле ввода «номера» первый свободный из диапазона 01…99. Т.о. необходимо получить список свободных номеров. Вод код – но вероятно можно его оптимизировать и запрос и дальнейшую обработку результатов. Запрос отрабатывает быстро, но есть чувство что можно организовать все правильней. Прошу помощи в оптимизации (ну и какашками сильно не забрасывать :)). &НаСервереБезКонтекста Функция ПолучитьСписокНомеровНаСервере(ВидНоменклатуры, ВидПриемки, КалькГруппа) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ЗначенияСвойствОбъектов.Объект, | ЗначенияСвойствОбъектов.Свойство, | ЗначенияСвойствОбъектов.Значение КАК Номер |ИЗ | (ВЫБРАТЬ | ЗначенияСвойствОбъектов.Свойство КАК Свойство, | ЗначенияСвойствОбъектов.Значение КАК Значение, | ЗначенияСвойствОбъектов.Объект КАК Объект, | ЗначенияСвойствОбъектов1.Свойство КАК Свойство1, | ЗначенияСвойствОбъектов1.Значение КАК Значение1 | ИЗ | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов1 | ПО ЗначенияСвойствОбъектов.Объект = ЗначенияСвойствОбъектов1.Объект | ГДЕ | ЗначенияСвойствОбъектов.Свойство = &свКГ | И ЗначенияСвойствОбъектов.Значение = &знКГ | И ЗначенияСвойствОбъектов1.Свойство = &свВП | И ЗначенияСвойствОбъектов1.Значение = &знВП) КАК ВложенныйЗапрос | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов | ПО ВложенныйЗапрос.Объект = ЗначенияСвойствОбъектов.Объект |ГДЕ | ЗначенияСвойствОбъектов.Свойство = &свПН | |УПОРЯДОЧИТЬ ПО | Номер УБЫВ"; Запрос.УстановитьПараметр("свКГ", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Калькуляционная группа", Истина)); Запрос.УстановитьПараметр("свВП", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Вид приемки", Истина)); Запрос.УстановитьПараметр("свПН", ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоНаименованию("Порядковый номер в калькуляционной группе", Истина)); Запрос.УстановитьПараметр("знКГ", КалькГруппа); Запрос.УстановитьПараметр("знВП", ВидПриемки); ТЗРезультат = Запрос.Выполнить().Выгрузить(); ТЗЭталон = Новый ТаблицаЗначений; ТЗЭталон.Колонки.Добавить("Номер"); Для Сч = 0 По 99 Цикл НовЗап = ТЗЭталон.Добавить(); НовЗап.Номер = Прав("00" + Сч, 2); КонецЦикла; Для Сч = 0 По ТЗРезультат.Количество() - 1 Цикл ТЗЭталон.Удалить(Число(ТЗРезультат[Сч].Номер)); КонецЦикла; Если ТЗЭталон[0].Номер = "00" Тогда ТЗЭталон.Удалить(0); КонецЕсли; СписокНомеров = Новый СписокЗначений; СписокНомеров.ЗагрузитьЗначения(ТЗЭталон.ВыгрузитьКолонку("Номер")); Возврат СписокНомеров; КонецФункции |
|||
1
H A D G E H O G s
28.03.13
✎
12:17
|
||||
2
GANR
28.03.13
✎
12:25
|
||||
3
Rounder
28.03.13
✎
12:27
|
У объекта есть свойства Свойство1, Свойство2, Свойство3. Все это хранится в РС (Измерения: Объект (тип СправочникСсылка), Свойство (тип ПВХСсылка) Ресурс: Значение)
Нужно запросом выбрать все значения Свойство3, с отбором по известным нам значениям Свойство1 и Свойство2. Может так проще для восприятия. |
|||
4
GANR
28.03.13
✎
12:32
|
(3) В н и м а т е л ь н о читай (2) - это типичная ситуация , когда на уровне SQL 1С-овский запрос строит UNION ALL по всем возможным таблицам составного типа (их может там сотня, а ты все это ещё и ВС соединяешь), ВЫРАЗИТЬ и ССЫЛКА помогут ограничить просматриваемые таблицы РегистрСведений.ЗначенияСвойствОбъектов. Ну и во временную таблицу, возможно, стоит загнать (не факт, на создание ВТ уходит время).
|
|||
5
Rounder
28.03.13
✎
12:33
|
(2) И к чему статья? У меня есть лишние обращения через точку?
|
|||
6
GANR
28.03.13
✎
12:35
|
(5) Глянь профайлер и увидишь UNION ALL по всем возможным таблицам на SQL, Совйство - составной тип. Вот надо ограничить этот UNION ALL только нужными тебе таблицами.
|
|||
7
zladenuw
28.03.13
✎
12:38
|
(6) та да. через выразить. я так на db2 ловил ограничение на объем запроса.
|
|||
8
Rounder
28.03.13
✎
12:39
|
(6) Я написал что (3) Свойство (тип ПВХСсылка). Но да - виноват что не уточнил - ПланВидовХарактеристикСсылка.СвойстваОбъектов.
Т.е. тип не составной. |
|||
9
Rounder
28.03.13
✎
12:40
|
В запросе меня больше всего смущает количество соединений - но я не знаю как получить нужную мне информацию по-другому. Поэтому и попросил помощи.
|
|||
10
zladenuw
28.03.13
✎
12:42
|
(8) а у РС измерения свойств какой тип. ты же к этой табличке делаешь запрос. вот СКЛ и тупит тут.
|
|||
11
GANR
28.03.13
✎
12:45
|
(8) Пардон, я тоже ошибся, Значение имеет составной тип.
|
|||
12
GANR
28.03.13
✎
12:45
|
Запрос.Текст = "ВЫБРАТЬ
| ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер | КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Номер | КОНЕЦ ВЫБОРА КАК Номер, | ВЫБОР | КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата | КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказПокупателя | ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказПокупателя).Дата | КОНЕЦ ВЫБОРА КАК Дата, | Продажи.Контрагент, | Продажи.Количество, | Продажи.Стоимость |ИЗ | РегистрНакопления.Продажи КАК Продажи |ГДЕ | Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг | ИЛИ Продажи.Регистратор ССЫЛКА Документ.ЗаказыПокупателя"; |
|||
13
Rounder
28.03.13
✎
12:47
|
(10) либо я не понимаю, либо меня :)
РегистрСведений.ЗначенияСвойствОбъектов: Измерения: Объект (тип СправочникСсылка.Номенклатура) Свойство (тип ПланВидовХарактеристикСсылка.СвойстваОбъектов) Ресурсы: Значение (тип Характеристика.СвойстваОбъектов) |
|||
14
GANR
28.03.13
✎
12:47
|
ВЫРАЗИТЬ(ЗначенияСвойствОбъектов.Значение КАК Справочник.ТвойСправочник)
... ЗначенияСвойствОбъектов.Значение ССЫЛКА Справочник.ТвойСправочник |
|||
15
GANR
28.03.13
✎
12:47
|
(13)Ресурсы:
Значение (тип Характеристика.СвойстваОбъектов) - составное, надо (14) |
|||
16
Rounder
28.03.13
✎
12:47
|
(14) сейчас посмотрю.
|
|||
17
Rounder
28.03.13
✎
12:48
|
Процедура вместе с запросом и обработкой результатов отрабатывает в среднем за 0.015 с. Я чтобы разобраться в принципе - чтобы не допускать грубых ошибок.
|
|||
18
GANR
28.03.13
✎
12:55
|
(17) Значит платформа "научилась" правильно строить запрос, или SQL хороший план запроса построил, или данных мало.
|
|||
19
Rounder
28.03.13
✎
12:57
|
(18) Спасибо за разъяснения. Буду пробовать делать с Выразить.
|
|||
20
H A D G E H O G s
28.03.13
✎
13:01
|
(18) pffff. Кэш же!
|
|||
21
Зойч
28.03.13
✎
13:03
|
(0) нет отбора по объекту, а значит индексы идут в пень.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |