Имя: Пароль:
1C
1C 7.7
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) Видать код писал стЮдент