Имя: Пароль:
1C
1С v8
УФ. Оптимизация запроса
,
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) нет отбора по объекту, а значит индексы идут в пень.
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.