Имя: Пароль:
1C
 
1c7 - оптимизация запроса
0 lamme
 
16.05.22
10:12
Приветствую.
1С7,7
УТ

Совсем забыл все что по 1С7 ..
сделал запрос на выборку документов за месяц
Работает .. ну просто капец как долго ..
В строке состояния висит -
"Обработка документов за : 01-01-18-31-01-18"
Часа 4 висит .. и потом отваливается с ошибкой - ошибка CDX

Вопрос ..
Что с запросом не так ?
Что я такого сделал - что оно простенький запрос - формирует так долго




    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(СформироватьЗаказы)
    |Период с ВыбНачПериода1 по ВыбКонПериода1;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |РасходнаяНакладная = Документ.РасходнаяНакладная.ТекущийДокумент;
    |Номенклатура = Документ.РасходнаяНакладная.Номенклатура;
    |Количество = Документ.РасходнаяНакладная.Количество;
    |Подразделение = Документ.РасходнаяНакладная.Подразделение;
    |Цена = Документ.РасходнаяНакладная.Цена;
    |Сумма = Документ.РасходнаяНакладная.Сумма;
    |Контрагент = Документ.РасходнаяНакладная.Контрагент;
    |Телефоны = Документ.РасходнаяНакладная.Контрагент.ОсновноеКонтактноеЛицо.Телефоны;
    |Группировка РасходнаяНакладная;
    |Группировка Номенклатура;
    |Группировка Количество;
    |Группировка Подразделение;
    |Группировка Цена;
    |Группировка Сумма;
    |Группировка Контрагент;
    |Группировка Телефоны;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
1 Андрей_Андреич
 
naïve
16.05.22
10:14
Группировка цена сумма количество - зачем?
2 Андрей_Андреич
 
naïve
16.05.22
10:15
ну и порядок группировок - он хоть что-то отражает кроме каши в голове? :)
3 lamme
 
16.05.22
10:16
в итоговых данных нужны количество, цена , сумма

если группировку не ставить - то там вроде нет это информации
или я не прав?
4 lamme
 
16.05.22
10:16
Порядок группировки тот - в котором надо эту информацию дальше выгрузить
5 Андрей_Андреич
 
naïve
16.05.22
10:17
считать суммы и количество надо функциями
6 lamme
 
16.05.22
10:17
мне не надо считать суммы
мне надо взять то - что идет в документе
7 Андрей_Андреич
 
naïve
16.05.22
10:18
а если надо просто распечатать все строчки всех документов - проще перебором документов и перебором строк
8 ChMikle
 
16.05.22
10:18
группировки контрагентов и телефоны тоже лишние имхо ... эти данные можно выводить уже в отчет как реквизит накладной .
9 lamme
 
16.05.22
10:19
те оставить просто группировка по

    |Группировка РасходнаяНакладная;

и потом перебор строк ?
хм ... попробую
10 Андрей_Андреич
 
naïve
16.05.22
10:19
и даже можно тупо взять универсальные отчет печать документов и настроить
11 johnnik
 
16.05.22
10:28
Восемь группировок это много. Равно как и в самом запросе лезть "вглубь" реквизитов (как вы до телефонов). Если реквизит - это строка неограниченной длины (пару раз видел такие реквизиты), она тоже сильно засирает память в запросе.

Сделайте запрос за день или неделю, запустите замер производительности. Естественно, он покажет 99,99% времени на строку "ВыполнитьЗапрос", но нас интересует время, а не процентовка. Например, вам выдаст 1000 секунд на выполнение, дальше комментируете группировку и переменную) телефон и замеряете заново. Затем меняете группировки цена и сумма на функции (как советовали). И так далее. Время выполнения будет уменьшаться и вы сможете сделать вывод, кто больше всего виноват
12 lamme
 
16.05.22
10:28
//Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(СформироватьЗаказы)
    |Период с ВыбНачПериода1 по ВыбКонПериода1;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Без итогов;
    |РасходнаяНакладная = Документ.РасходнаяНакладная.ТекущийДокумент;
    //|Номенклатура = Документ.РасходнаяНакладная.Номенклатура;
    //|Количество = Документ.РасходнаяНакладная.Количество;
    //|Подразделение = Документ.РасходнаяНакладная.Подразделение;
    //|Цена = Документ.РасходнаяНакладная.Цена;
    //|Сумма = Документ.РасходнаяНакладная.Сумма;
    //|Контрагент = Документ.РасходнаяНакладная.Контрагент;
    //|Телефоны = Документ.РасходнаяНакладная.Контрагент.ОсновноеКонтактноеЛицо.Телефоны;
    |Группировка РасходнаяНакладная;
    //|Группировка Номенклатура;
    //|Группировка Количество;
    //|Группировка Подразделение;
    //|Группировка Цена;
    //|Группировка Сумма;
    //|Группировка Контрагент;
    //|Группировка Телефоны;
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;  

вот так выполняется влет
дальше тормозит на переборе строк документа
13 Builder
 
16.05.22
10:34
(12) Что надо в итоге получить  то?
Если строки (номенклатуру), то проще сразу добавить.

|Группировка РасходнаяНакладная;
|Группировка Номенклатура без групп;
14 lamme
 
16.05.22
10:35
выгрузить в файл ксв определенной структуры по документ-номенклатура-количество-... и тд
15 Chai Nic
 
16.05.22
10:37
Не пользуйтесь черным запросом, он кривой и неудобный. Лучше просто пробежаться по документам, ну или прямой запрос задействовать, если нужно высокое быстродействие.
16 Builder
 
16.05.22
10:38
(14) ну тогда как то так, навскидку. С Функцией не помню только.

|Период с ВыбНачПериода1 по ВыбКонПериода1;
    |Обрабатывать НеПомеченныеНаУдаление;
    |РасходнаяНакладная = Документ.РасходнаяНакладная.ТекущийДокумент;
    |Номенклатура = Документ.РасходнаяНакладная.Номенклатура;
    |Количество = Документ.РасходнаяНакладная.Количество;
    |Подразделение = Документ.РасходнаяНакладная.Подразделение;
    |Цена = Документ.РасходнаяНакладная.Цена;
    |Сумма = Документ.РасходнаяНакладная.Сумма;
    |Контрагент = Документ.РасходнаяНакладная.Контрагент;
    |Функция СуммаОбщая = Сумма(Сумма);
    |Группировка РасходнаяНакладная;
    |Группировка Номенклатура без групп;
17 Андрей_Андреич
 
naïve
16.05.22
10:39
(16) Сумму по количеству забыл
18 Builder
 
16.05.22
10:40
(17) Ну я думаю ТС добавит сам что надо :)
19 ChMikle
 
16.05.22
10:43
(16) >> |Подразделение = Документ.РасходнаяНакладная.Подразделение;
        |Цена = Документ.РасходнаяНакладная.Цена;
Зачем ?
20 Builder
 
16.05.22
10:44
(19) Это у автора спросить зачем. Вроде как ему цена нужна, его запрос же.
21 lamme
 
16.05.22
10:48
Коллеги
спасибо
вопрос закрыт.

помогла идея
что в запросе не надо делать много группировок
достаточно одной - по документам
и дальше - просто перебор строк документа из выборки.
22 lamme
 
16.05.22
10:49
+ запись в файл ксв идет через объект

fso=СоздатьОбъект ("Scripting.FileSystemObject");
23 Ёпрст
 
16.05.22
10:56
(0)
На вот, занимайся

Процедура Сформировать()
    Попытка
        база = СоздатьОбъект("SQLiteBase");
    Исключение
        ЗагрузитьВнешнююКомпоненту("1sqlite.dll");
        база = СоздатьОбъект("SQLiteBase");
    КонецПопытки;
    база.Открыть(":memory:");
    запрос = база.НовыйЗапрос();    
    запрос = база.НовыйЗапрос();
    ТекстЗапроса = "
    |SELECT
    |     Шапка.iddoc [Документ :Документ.Реализация]
    |    ,Шапка.Контрагент [Контрагент :Справочник.Контрагенты]
    |    ,Строки.Номенклатура [Номенклатура :Справочник.Номенклатура]
    |    ,Строки.Сумма Сумма
    |    ,Строки.Количество Количество
    |
    |FROM [Документ.Реализация] Шапка
    |      left join [ДокументСтроки.Реализация] Строки on Шапка.iddoc = Строки.iddoc
    |";
    
    ТЗ = запрос.ВыполнитьЗапрос(ТекстЗапроса);
    ТЗ.ВыбратьСтроку();
КонецПроцедуры
24 Злопчинский
 
16.05.22
14:09
Группировки вообще вызывают вопросы.
я сомневаюсь что в однйо расходной накладной несколько Контрагентов...
25 Злопчинский
 
16.05.22
14:10
хотя.. хз  что за конфига на 77 - УТ..