Имя: Пароль:
1C
1С v8
v8: Оптимизация запроса
0 Начинающий_13
 
08.08.12
15:54
Здраствуйте
Есть функция Контроль отрицательных остатков.
Запрос создан сейчас на основе ОБЪЕДИНЕНИЯ.
Содержаение каждого запроса одинаково . Разница только а Названии табличных частей документа
Как можно подменять название ТЧ документа
Функция КонтрольОтрицательныхОстатов()
   
//    ИмяТЧ = "Товары";

// Пробы
   Для каждого ТЧ Из Метаданные().ТабличныеЧасти Цикл
       //    Сообщить(ТЧ.Имя);
           ИмяТЧ = ТЧ.Имя;
   КонецЦикла;
       

   Запрос = Новый Запрос;
   Запрос.Текст =    
       "ВЫБРАТЬ
       |    МИНИМУМ(ДокТЧ.НомерСтроки) КАК НомерСтроки,
       |    ДокТЧ.ТМЦ,
       |    ДокТЧ.Партия,
       |    ДокТЧ.Характеристика,
       |    СУММА(ДокТЧ.Количество) КАК Количество,
       |    МАКСИМУМ(ЕСТЬNULL(Остатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
       |    МАКСИМУМ(ЕСТЬNULL(Остатки.СуммаОстаток, 0)) КАК СуммаОстаток,
       |    ДанныеЗакупки.Контрагент,
       |    ДанныеЗакупки.Цена1го,
       |    ДанныеЗакупки.Цена,
       |    ДанныеЗакупки.СтавкаНДС,
       |    ДанныеЗакупки.СтавкаНП,
       |    ДанныеЗакупки.СтатусТМЦ
       |ИЗ
   //  |    Документ.ТМЦ_ПоступлениеВозврат.Товары КАК ДокТЧ
       |    Документ.ТМЦ_ПоступлениеВозврат."+ ИмяТЧ +" КАК ДокТЧ   // ?????????

       |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РН_Остатки.Остатки(&МоментВремени, МХ = &МХ) КАК Остатки
       |            ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.РС_ЗакупочниеДанные.СрезПоследних КАК ДанныеЗакупки
       |            ПО Остатки.ТМЦ = ДанныеЗакупки.ТМЦ
       |                И Остатки.Партия = ДанныеЗакупки.Партия
       |                И Остатки.Характеристика = ДанныеЗакупки.Характеристика
       |        ПО ДокТЧ.ТМЦ = Остатки.ТМЦ
       |            И ДокТЧ.Партия = Остатки.Партия
       |            И ДокТЧ.Характеристика = Остатки.Характеристика
       |ГДЕ
       |    ДокТЧ.Ссылка = &Ссылка
       |
       |СГРУППИРОВАТЬ ПО
       |    ДокТЧ.ТМЦ,
       |    ДокТЧ.Партия,
       |    ДокТЧ.Характеристика,
       |    ДанныеЗакупки.Цена1го,
       |    ДанныеЗакупки.Цена,
       |    ДанныеЗакупки.Контрагент,
       |    ДанныеЗакупки.СтавкаНДС,
       |    ДанныеЗакупки.СтавкаНП,
       |    ДанныеЗакупки.СтатусТМЦ";
//    ЗапросТекст = СтрЗаменить(ЗапросТекст,"Товары",ИмяТЧ);    // ??????

   Запрос.УстановитьПараметр("МХ", МХоткуда);
   Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
   Запрос.УстановитьПараметр("Ссылка", Ссылка);
   
   Результат = Запрос.Выполнить();

   Возврат Результат;
   
КонецФункции
1 aleks-id
 
08.08.12
15:55
продолжайте наблюдение. нам это очень интересно
2 Maxus43
 
08.08.12
15:56
не работает чтоли?
3 Начинающий_13
 
08.08.12
15:57
ОБъединение все работает
Хочется сделать лучше
4 Начинающий_13
 
08.08.12
15:57
А подменить не могу пока
5 H A D G E H O G s
 
08.08.12
15:57
Нетленка штоле?
Нуеена.

Юзайте Временные таблицы и параметры ВТ
6 DrShad
 
08.08.12
15:58
для оптимизации предложу выкинуть все и написать заново
7 Начинающий_13
 
08.08.12
15:58
(5) Да Переделываю постеменно все в более хорошее состояние
8 Нуф-Нуф
 
08.08.12
15:59
ужаснах
9 Начинающий_13
 
08.08.12
15:59
Хорошо с ВТ попробую
10 DrShad
 
08.08.12
16:00
(9) ждем-с новый перл
11 Начинающий_13
 
08.08.12
16:01
Не так быстро
12 DrShad
 
08.08.12
16:03
да я подожду, ты не спеши
13 Начинающий_13
 
08.08.12
16:04
А что только больше нет других способов
14 Fragster
 
гуру
08.08.12
16:04
Лучше вместо
|    Документ.ТМЦ_ПоступлениеВозврат."+ ИмяТЧ +" КАК ДокТЧ
Написать
|    &_ИмяТЧ КАК ДокТЧ

И перед выполнением сделать Запрос.Текст = СтрЗаменить(Запрос.Текст, "&_ИмяТЧ", "Документ.ТМЦ_ПоступлениеВозврат."+ ИмяТЧ);
15 DrShad
 
08.08.12
16:05
(13) в (6) я предложил иной способ
16 Fragster
 
гуру
08.08.12
16:05
это к вопросу о рваных текстах запроса
17 France
 
08.08.12
16:05
как всегда, интересно, для чего сия функция нужна?? автор, может расскажешь =- а там и оптимизаторы подтянутся
18 Fragster
 
гуру
08.08.12
16:06
а вообще - сначала сделать соединение, а потом отбор, который 99,999% данных отбросит - это сильно
19 DrShad
 
08.08.12
16:06
(17) называется КонтрольОстатков, но по сути никуя не контролирует
20 Нуф-Нуф
 
08.08.12
16:06
(14) +1
а то потом эти рваные запросы заипешься переписывать
21 Fragster
 
гуру
08.08.12
16:06
в данном конкретнос случае - надо выгрузить ТЧ в ТЗ, запихать ее в запрос безо всяких определений и замен имен таблиц
22 Fragster
 
гуру
08.08.12
16:07
в смысл запроса - не смотрел
23 Начинающий_13
 
08.08.12
16:08
(21) Спасибо еще за совет попробую
(18) А что с соединением не так
24 DrShad
 
08.08.12
16:10
(23) так может все таки объяснишь что за контроль, который ничего не контролирует
25 Fragster
 
гуру
08.08.12
16:11
(23) там ВСЕ не так...
26 Fragster
 
гуру
08.08.12
16:12
если оно сейчас работает - я даже не представляю, насколько медленно. не говоря уже о (24)
27 Начинающий_13
 
08.08.12
16:12
Я давно когда писал все делал по урокам и книгам
28 Начинающий_13
 
08.08.12
16:13
сейчас напного больше понимаю потому и пытаюсь переделать
29 olegves
 
08.08.12
16:13
(0) а может лучше сделать регистр накопления и перепровести все документы?
там контроль остатков как 2 байта записать
30 DrShad
 
08.08.12
16:13
(28) спорное утверждение
31 Fragster
 
гуру
08.08.12
16:15
просто можно принять простые правила:
- никогда не делай соединение с виртуальными таблицами (если это возможно, например в произвольных запросах ДС - невозможно :()
- как можно раньше ограничивай данные
- ИСПОЛЬЗУЙ ПАРАМЕТРЫ ВИРТУАЛЬНЫХ ТАБЛИЦ (!!!)
32 Fragster
 
гуру
08.08.12
16:15
вообще, конечно, правил намного больше, да и главное в них - понимать, почему так, и как на самом деле это все работает, но вот эти три можешь просто запомнить
33 Начинающий_13
 
08.08.12
16:17
Потому и  задаю вопросы потому что иногда надо направить на пусть истинный и знания тогда быстрее приходят
34 Начинающий_13
 
08.08.12
16:17
Спасибо за советы.
35 zzhiraf
 
08.08.12
16:25
(18) Почему ты думаешь, что скл-сервер сначала сделает соединение, а потом отбор?
36 Fragster
 
гуру
08.08.12
16:28
(35) в данном случае я не уверен, что он настолько умный, тем более, что там 2 вложенных соединения, каждое из которых является сложным вложенным запросом с объединениями и соединениями