Имя: Пароль:
1C
1C 7.7
v7: Посоветуйте, что оптимизировать в запросе, долго выполняется
,
0 Joshim
 
11.12.14
12:36
Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с НачПериода по КонПериода;
    |ОбрабатыватьДокументы все;
    |ТекущийДокумент = Документ.Заказ.ТекущийДокумент;    
    |Номенклатура = Документ.Заказ.Номенклатура;
    |Группировка ТекущийДокумент;
    |Группировка СтрокаДокумента;
    |Условие(ТекущийДокумент в СписокЗаказов);
    |"//}}ЗАПРОС
    ;
1 butterbean
 
11.12.14
12:37
группируй по номенклатуре, нафига строка?
2 Vladal
 
11.12.14
12:37
В файловой 7.7 часто выборка работает быстрее запроса.
Убери группировку строки
3 Vladal
 
11.12.14
12:39
Группировка СтрокаДокумента замени на Группировка Номенклатура
4 dk
 
11.12.14
12:48
в списке заказов скока элементов?
5 Joshim
 
11.12.14
12:48
(1)(2)(3) поменял на группировка номенклатура запрос работает с той же скоростью (46 секунд)
(2) выборка сжирает под 1,5 Гб памяти
6 Joshim
 
11.12.14
12:49
(4) 11 элементов
и запрос 46 секунд делается
7 Vladal
 
11.12.14
12:50
(6) Выбирай документы, потом в цикле выборки запроса делай выборку по ТЧ документа. Должно работать быстрее.
8 Vladal
 
11.12.14
12:52
запрос сокати до

    |Период с НачПериода по КонПериода;
    |ОбрабатыватьДокументы все;
    |ТекущийДокумент = Документ.Заказ.ТекущийДокумент;    
    |Группировка ТекущийДокумент;
    |Условие(ТекущийДокумент в СписокЗаказов);
    |"//}}ЗАПРОС


потом, зачем обработывать документы ВСЕ? И проведенные и не проведенные?
9 Локи-13
 
11.12.14
12:52
разве в 7ке не нужно подключаться к SQL и тянуть данные прямыми запросами, когда штатные перестают работать?
10 dk
 
11.12.14
12:53

Период с НачПериода по КонПериода;
ОбрабатыватьДокументы все;
ТекущийДокумент = Документ.Заказ.ТекущийДокумент;    
Номенклатура = Документ.Заказ.Номенклатура;
Условие(ТекущийДокумент в СписокЗаказов);
Без итогов;

попробуй без итогов добавить и без группировок
11 Joshim
 
11.12.14
12:57
(10) это дбф, а прямой запрос к дбф табличке можно сделать?
12 Joshim
 
11.12.14
13:00
(10) попробовал, быстрее не стало
13 Ёпрст
 
11.12.14
13:00
(11) никакой разницы нет какой формат базы при написании прямого запроса
14 dk
 
11.12.14
13:01
значит дело не в запросе
15 Мигало
 
11.12.14
13:02
(0) Номенклатуру убери из запроса - получишь ее перебором строк документа при обходе результата выборки
16 Андрей_Андреич
 
naïve
11.12.14
13:04
(15) У него и так выборка есть - "Условие(ТекущийДокумент в СписокЗаказов)"
17 Joshim
 
11.12.14
13:07
(15) выборка память жрет, после например 20 выборок упирается в предел 2 Гб и появляется ошибка
18 Joshim
 
11.12.14
13:08
(15) поэтому переделал на запрос.
19 kortun
 
11.12.14
13:14
переделай не регистр

типа

Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)

    |Период с НачПериода по КонПериода;
    |ТекущийДокумент = Регистр.Резервы.ТекущийДокумент;    
    |Номенклатура = Регистр.Резервы.Номенклатура;
    |Количество = Регистр.Резервы.Количество;
    |Группировка ТекущийДокумент;
    |Группировка СтрокаДокумента;
    |Условие(ТекущийДокумент в СписокЗаказов);
    |Заказано = Приход(Количество);
    |"//}}ЗАПРОС

    ;
20 Ёпрст
 
11.12.14
13:14
(17) куда всё это потом выгружается ?
В моксель, в ТЗ ?
21 Ёпрст
 
11.12.14
13:15
(19) не поможет, вообще , никак
22 Vladal
 
11.12.14
13:15
(19) В регистре будут только проведенные документы.
А ТС надо обработать ВСЕ документы (так в запросе написано)
23 Бубка Гоп
 
11.12.14
13:20
(22) а что если по регистру обработать проведенные доки, а к запросу из (0) прилепить Документ.проведен=Ложь? т.е. разбить на 2 запроса
24 Vladal
 
11.12.14
13:26
(23) Я думаю, надо дождаться ответ автора на (8)
25 Ёпрст
 
11.12.14
14:02
На вот, занимайся

Перем база;

//======================================================================
Процедура ПриОткрытии()
    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    база.Открыть(":memory:");
КонецПроцедуры // ПриОткрытии

//*******************************************
Процедура Сформировать()
    
    ТекстЗапроса="
    |Период с НачПериода по КонПериода;
    |ОбрабатыватьДокументы все;
    |ТекущийДокумент = Документ.Заказ.ТекущийДокумент;    
    |Номенклатура = Документ.Заказ.Номенклатура;
    |Группировка ТекущийДокумент;
    |Группировка СтрокаДокумента;
    |Условие(ТекущийДокумент в СписокЗаказов);
    |";
    
    запрос = база.НовыйЗапрос();    
    ТекстЗапроса = "
    |select
    |  Журнал.iddoc [ТекущийДокумент :Документ.Заказ]
    | ,Док.Номенклатура [Номенклатура :Справочник.Номенклатура]
    |  from [ДокументСтроки.Заказ] Док
    |  Inner join [Журнал] Журнал on Журнал.iddoc=Док.iddoc
    |   and  Журнал.iddocdef=:ВидДокумента.Заказ
    |   and  Журнал.date between :НачДата and :КонДата
    |
    |
    |";
    
    Запрос.Подставлять("НачДата",НачДата);
    Запрос.Подставлять("КонДата",КонДата);

    Начало = _GetPerformanceCounter();
    ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
    Сообщить("Запрос выполнялся:"+(_GetPerformanceCounter()-Начало)+" мс");
    ТЗ.ВыбратьСтроку();
КонецПроцедуры

скачай 1sqlite отседыва и помести в каталог BIN\, там, где 1с-ина развернута.
http://www.1cpp.ru/forumfiles/Attachments/1sqlite_1026_37170.zip
26 Joshim
 
11.12.14
16:18
(25) как задать отбор по номеру документа?
сделал так:
select
  Журнал.iddoc [ТекущийДокумент :Документ.Заказ]
,Док.Номенклатура [Номенклатура :Справочник.Номенклатура]
  from [ДокументСтроки.Заказ] Док
  Inner join [Журнал] Журнал on Журнал.iddoc=Док.iddoc
   and  Журнал.iddocdef=:ВидДокумента.Заказ
   and  Журнал.date between :НачДата and :КонДата
   and  ((Журнал.DOCNO = :420865417) OR (Журнал.DOCNO = :421953777) OR (Журнал.DOCNO = :422558121) OR (Журнал.DOCNO = :423111089) OR (Журнал.DOCNO = :423711377) OR (Журнал.DOCNO = :424304905) OR (Журнал.DOCNO = :424452273) OR (Журнал.DOCNO = :424457681) OR (Журнал.DOCNO = :424705097) OR (Журнал.DOCNO = :424943049) OR (Журнал.DOCNO = :425118809))
не работает..
27 palpetrovich
 
11.12.14
16:41
(26) а как этот СписокЗаказов формируется, может проще в самом sqlite-запросе это в условии порешать?
28 Joshim
 
11.12.14
16:43
(27) как вариант)
29 Ёпрст
 
11.12.14
16:44
(26) без нелепого фильтра по докам работает ?
Результат удовлетворяет ?
30 Joshim
 
11.12.14
16:44
(29) без нелепого фильтра работает но табличка оччень большая
31 Ёпрст
 
11.12.14
16:45
если че, писать надо так:

and Жур.iddoc in (select val from :СписокДокументов)
32 ДенисЧ
 
11.12.14
16:45
"Журнал.DOCNO = :420865417"

Интересно, что бы это значило...
33 Ёпрст
 
11.12.14
16:47
(32) :))
34 Joshim
 
11.12.14
16:48
(32) это я попробовал отобрать в запросе строки по номеру документа
35 Ёпрст
 
11.12.14
16:49
Короче,


Список = СоздатьОбъект("СписокЗначений");//ну или это объект формы
//далее пихаешь в список свои документы, далее

база.УложитьОбъекты(Список,"СписокДокументов",0);

далее в тексте запроса

and Жур.iddoc in (select val from СписокДокументов)
36 Ёпрст
 
11.12.14
16:49
(34)

по номеру, это хотя бы так:

and Журнал.DOCNO like '%420865417%'
37 Ёпрст
 
11.12.14
16:52
И... если есть список конкретных документов, твой запрос будет выглядеть так:


  ТекстЗапроса = "
    |select
    |  Док.iddoc [ТекущийДокумент :Документ.Заказ]
    | ,Док.Номенклатура [Номенклатура :Справочник.Номенклатура]
    |  from [ДокументСтроки.Заказ] Док
    | where Док.iddoc in (select val from СписокДокументов)
    |";
38 Ёпрст
 
11.12.14
16:53
это если тебе не надо получать реквизиты типа ДатаДок,НомерДок.. общие реквизиты с галкой отбор.. и т.д.
39 Joshim
 
11.12.14
16:57
(37) не понимаю СписокДокументов это что?
Запрос.Подставлять("СписокДокументов", ???);
40 Ёпрст
 
11.12.14
17:09
(39) см (35)
41 Ёпрст
 
11.12.14
17:09
подставлять ничего не надо
42 Ёпрст
 
11.12.14
17:10
надо уложить список в временную табличку в 1sqlite
43 Garykom
 
гуру
11.12.14
17:17
(0) Цель запроса можно словами описать?

А то ничего не понял что хочешь...
44 Joshim
 
11.12.14
17:30
(42) сделал как в (35) - работает
45 Garykom
 
гуру
11.12.14
17:36
ЭЭЭ используем "прямые/быстрые" запросы чтобы выбрать товары из нескольких заказов?

Мдяя я тоже хочу ездить на PEUGEOT 2008 DKR вместо LADA KALINA на работу...
Независимо от того, куда вы едете — это в гору и против ветра!