|
v7: Как можно ускорить отчет? | ☑ | ||
---|---|---|---|---|
0
Ночной Эльф
20.07.12
✎
13:58
|
Всем доброго времени суток.
Собственно вопрос. Есть отчет в результате которого получается таблица ТзТаб типа ТзТаб=СоздатьОбъект("ТаблицаЗначений"); если период отчета брать 1 месяц то записей в таблице 2000 если 12 месяцев больше 15000 тысяч. Затем производятся операции с этой таблицей где элемент таблицы выбирает как ТзТаб.ПолучитьСтрокуПоНомеру(Ст); В итоге отчет выполняется за месяц 5 минут а за 12 месяцев пол часа. замер произоводительности показывает что самое долгое время как раз таки в это строке ТзТаб.ПолучитьСтрокуПоНомеру(Ст); Можно ли заменить это строку кодом который будет выполняться быстрее? |
|||
1
Джордж1
20.07.12
✎
13:59
|
Проблема в скорости явно не в этой строке
|
|||
2
viktor_vv
20.07.12
✎
14:00
|
Тяжело сказать, не видя кода и не понимая, почему используете именно ПолучитьСтрокуПоНомеру(). Наверное используете НайтиЗначение().
|
|||
3
viktor_vv
20.07.12
✎
14:02
|
Если в лоб решать, то можно использовать Индексированную таблицу из 1СPP. Она побыстрее будет.
|
|||
4
1Сергей
20.07.12
✎
14:03
|
мышкой води по экрану - быстрее будет :)
|
|||
5
Надсмотрщик
20.07.12
✎
14:03
|
(0) А нужны все 15000 значений?
|
|||
6
Ночной Эльф
20.07.12
✎
14:13
|
вот код
ДокПодч1=СоздатьОбъект("Документ"); ТзТаб.Сортировать("Контрагент,ВремяСуток,РекламноеМесто,КонДата"); ТзТаб.ВыбратьСтроки(); Для Ит = 2 По ТзТаб.КоличествоСтрок() Цикл //В полученной таблице удаляем старые размещения, у которых Кондаты < последующих размещений ТзТаб.ПолучитьСтрокуПоНомеру(Ит); ТекКонтр = ТзТаб.Контрагент;ТекНДата = ТзТаб.НачДата;ТекКДата = ТзТаб.КонДата;ТекВремяСуток = ТзТаб.ВремяСуток;ТекТипУслуги=ТзТаб.ТипУслуги;ТекРм = ТзТаб.РекламноеМесто; Для Ит1=1 По Ит-1 Цикл ТзТаб.ПолучитьСтрокуПоНомеру(Ит1); Если ТзТаб.Удалить = 1 Тогда Продолжить;КонецЕсли; Если (ТекРм = ТзТаб.РекламноеМесто)и(ТекТипУслуги = ТзТаб.ТипУслуги)и(ТекВремяСуток = ТзТаб.ВремяСуток)и(ТекКонтр = ТзТаб.Контрагент)и((ТекНДата >= ТзТаб.НачДата)или(ТекКДата >= ТзТаб.КонДата)) Тогда ТзТаб.Удалить = 1; КонецЕсли; КонецЦикла; КонецЦикла; |
|||
7
Ночной Эльф
20.07.12
✎
14:14
|
т.е. из полученной таблицы нужно выбрать однотипные документы по одному критерии последней датой
|
|||
8
Guk
20.07.12
✎
14:14
|
жесть какая-то...
|
|||
9
Джордж1
20.07.12
✎
14:15
|
Со вложенным циклом что-то не так, не с 1 записи он должен быть
|
|||
10
1Сергей
20.07.12
✎
14:15
|
(7) выгрузить+свернуть не предлагать?
|
|||
11
Ночной Эльф
20.07.12
✎
14:16
|
свернуть для чего? и куда выгружать (просто не особо силен в 7.7)
|
|||
12
Надсмотрщик
20.07.12
✎
14:16
|
А запрос правильно переписать не предлагать?
|
|||
13
Ночной Эльф
20.07.12
✎
14:17
|
(10) и это как вобще делается ?
|
|||
14
1Сергей
20.07.12
✎
14:17
|
(11) а в чём силён?
(13) руками |
|||
15
Ночной Эльф
20.07.12
✎
14:17
|
ооо запросом тут просто уже до меня кто то наху?вертил если переделывать запросом так столько работы будет
|
|||
16
Надсмотрщик
20.07.12
✎
14:18
|
(15) А как ТЗ заполняешь?
|
|||
17
1Сергей
20.07.12
✎
14:19
|
(15) если работать не хочется, так попей пивка пока он эту табличку двумя циклами лопатит
|
|||
18
Надсмотрщик
20.07.12
✎
14:20
|
(17) Похоже в ПУБе ковыряется :-))
|
|||
19
Ночной Эльф
20.07.12
✎
14:22
|
(16) по условия как мог ее минимизировал
(17) вот смотри должны быть одинаковы следующие параметры в таблице (ТекРм = ТзТаб.РекламноеМесто)и(ТекТипУслуги = ТзТаб.ТипУслуги)и(ТекВремяСуток = ТзТаб.ВремяСуток)и(ТекКонтр = ТзТаб.Контрагент) но в другой момент должно выполняться условие (ТекНДата >= ТзТаб.НачДата)или(ТекКДата >= ТзТаб.КонДата) как это функцией ТзТаб.Свернуть(""); выполнить то ? |
|||
20
akaBrr
20.07.12
✎
14:23
|
Сортируешь по дате табличку, по убыванию, используешь первую строку. Если я конечно правильно понял что делает алгоритм в (6)
|
|||
21
Ёпрст
20.07.12
✎
14:24
|
(0) нахрена при ВыбратьСтроки делать ПолучитьСтрокуПоНомеру() ?
|
|||
22
akaBrr
20.07.12
✎
14:25
|
(21) ага, ВыбратьСтроки лишнее
|
|||
23
Ночной Эльф
20.07.12
✎
14:25
|
(21) да я откуда знаю до меня это все было, я даже и не заметил этого )))
|
|||
24
Надсмотрщик
20.07.12
✎
14:25
|
(21) Еще годик, и клюшечники будут на вес золота.
|
|||
25
Ёпрст
20.07.12
✎
14:25
|
Ну и еще бредятина - для каждой строки обходить всю ТЗ целиком в цикле.
|
|||
26
Ночной Эльф
20.07.12
✎
14:26
|
мне кажется можно реализовать функцией свернуть но вот как только выполнить условие чтобы после свертки остались самые большие даты ?
|
|||
27
akaBrr
20.07.12
✎
14:26
|
(25) всю тз он обойдет только для последней строки, точнее не всю, а без одной
|
|||
28
Ночной Эльф
20.07.12
✎
14:27
|
как тут уже предлогали сделать сортировку по дате по убываю, получается свертка оставит строки с самым большим числом ? правильно я понимаю что так проканает
|
|||
29
akaBrr
20.07.12
✎
14:29
|
(ТекРм = ТзТаб.РекламноеМесто)и(ТекТипУслуги = ТзТаб.ТипУслуги)и(ТекВремяСуток = ТзТаб.ВремяСуток)и(ТекКонтр = ТзТаб.Контрагент) - заменить хэшем, сортировать таблицу по хешу и дате, сразу позиционироваться на нужной строке по хэшу, будет максимальная дата...
|
|||
30
Ночной Эльф
20.07.12
✎
14:30
|
заменить хэшем - это как ? и что это такое ?
|
|||
31
akaBrr
20.07.12
✎
14:31
|
тзТаб.НоваяКолонка("Хэш","Строка");
тзТаб.ВыбратьСтроки(); Пока тзТаб.ПолучитьСтроку() = 1 Цикл тзТаб.Хэш = Строка(ТзТаб.РекламноеМесто)+ТзТаб.ТипУслуги+тзТаб.ВремяСуток+ТзТаб.Контрагент; КонецЦикла; |
|||
32
FN
20.07.12
✎
14:33
|
Если я правильно понял что должен делать код из (6), то меняй алгоритм:
во первых будет быстрее не удалять строки из текущий ТЗ, а перекидывать подходящие строки в новую ТЗ аналогичной структуры во вторых внутренний цикл не нужен - достаточно одного прохода, так как данные отсортированы уже в нужном порядке. Просто при считывании первой строки запоминай типУслуги, контрагента и тп и перебирай строки (нужную по условию пихай в новую ТЗ), пока не появится строка с новым контрагентом. и тд. |
|||
33
Ночной Эльф
20.07.12
✎
14:33
|
дело в том что все эти данные нужны для последующего использования в отчет раздельно
|
|||
34
akaBrr
20.07.12
✎
14:34
|
(32) в коде он не удаляет, а ставит флаг на удаление
|
|||
35
akaBrr
20.07.12
✎
14:34
|
(33) а мы данные не трогаем
|
|||
36
Ночной Эльф
20.07.12
✎
14:34
|
(34) там и удаление потом есть
|
|||
37
FN
20.07.12
✎
14:35
|
(34) - (36) :))))))
|
|||
38
akaBrr
20.07.12
✎
14:36
|
(36) в предоставленном коде нету, а телепатия у меня не развита :(
|
|||
39
Ёпрст
20.07.12
✎
14:38
|
(0) получай ТЗ из запроса нужной структуры и с нужными данными.
|
|||
40
akaBrr
20.07.12
✎
14:39
|
тзТаб.Сортировать("Хэш,КонДата-");
тзТаб.ВыбратьСтроки(); ТекХэш = ""; Пока тзТаб.ПолучитьСтроку() = 1 Цикл Если ТекХэш <> тзТаб.Хэш Тогда ТекХэш = тзТаб.Хэш; Иначе тзТаб.Удалить = 1; КонецЕсли; КонецЦикла; |
|||
41
akaBrr
20.07.12
✎
14:42
|
гхм, те же яйца вид сбоку
|
|||
42
akaBrr
20.07.12
✎
14:45
|
правильный ответ в (39), текст запроса в студию
|
|||
43
Злой Бобр
20.07.12
✎
15:04
|
(39) Наконец-то.
|
|||
44
FN
20.07.12
✎
15:05
|
(39),(42),(43) готов спорить - исходные данные ТС берет не из запроса, а перебором документов
|
|||
45
Надсмотрщик
20.07.12
✎
15:06
|
(44) Видать код писал стЮдент
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |