|
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 - УТ..
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |