Имя: Пароль:
1C
1С v8
Можно ли ускорить выполнение процедуры
,
0 DeMi4
 
24.11.11
15:15
ДБФ=Новый ("XBase");
   ДБФ.ОткрытьФайл(НовоеИмяФайла);
   Если ДБФ.Открыта()=Ложь Тогда
       Сообщить("Файл не открыт");
   КонецЕсли;        
   НЗ=1;
   Пока НЗ<=ДБФ.КоличествоЗаписей() Цикл
       ДБФ.Перейти(НЗ);
       Для Каждого Строка Из Объект.Строки Цикл
           Если СокрЛП(ДБФ.code)=Строка.Код Тогда
               Если ДБФ.sum<0 Тогда
               Строка.Сумма=(-1)*ДБФ.sum;
               Иначе
               Строка.Сумма=ДБФ.sum;
               КонецЕсли;
               Если Лев(ДБФ.code,1)="1" ИЛИ Лев(ДБФ.code,1)="5" Тогда
                   Строка.Сумма=ДБФ.sum;
               КонецЕсли;
               Строка.Количество=ДБФ.cnt;
           КонецЕсли;
       КонецЦикла;
       НЗ=НЗ+1;
   КонецЦикла;
   ДБФ.ЗакрытьФайл();


На 7 аналогичный код летает в разы быстрее. Выполнение происходит на сервере.
1 aleks-id
 
24.11.11
15:16
ипическая сила. руки бы отломать
2 DeMi4
 
24.11.11
15:16
Ну вместо обламывания рук. Подскажите как надо.
3 ДенисЧ
 
24.11.11
15:16
А зачем делать Перейти() вместо Следующая()?
4 aleks-id
 
24.11.11
15:17
(3) не оттуда начал. зачем цикл в цикле?
5 aleks-id
 
24.11.11
15:17
(2) запросом!
6 Ненавижу 1С
 
гуру
24.11.11
15:18
вместо

Для Каждого Строка Из Объект.Строки Цикл
           Если СокрЛП(ДБФ.code)=Строка.Код Тогда

напиши

Строка = Объект.Строки.Найти(ДБФ.code,"Код");
7 aleks-id
 
24.11.11
15:18
(6) вот молодец какой, а? лучше бы лекцию ему про джойны прочел :)
8 Ненавижу 1С
 
гуру
24.11.11
15:20
(7) лучше про NULL и Неопределено ))
9 aleks-id
 
24.11.11
15:22
(8) его неокрепшая клюшечная психика и тонкая душевная организация не вынесут такого надругательства и выпадут в БСОД )
10 vmv
 
24.11.11
15:22
ДБФ.Перейти(НЗ); лишенее

Пока ДБФ.Следующая()Цикл

классика обхода дбф при отсутсвии индексного файла
11 aleks-id
 
24.11.11
15:23
вобщем так. (0) бери запросом данные из своей дбф. помещай их в ТЗ. дальше соединяй с этой ТЗ Объект.Строки. профит!
12 vmv
 
24.11.11
15:26
внутренний цикл тоже лажа, зачем обходить все строки тч документа, если у вас есть четкое условие отбора нужных строк. Надо так

мСтрокиОбработат = Объект.Строки.Найти("Код", СокрЛП(ДБФ.code));

  Для Каждого Строка Из мСтрокиОбработат Цикл
                           Если ДБФ.sum<0 Тогда
               Строка.Сумма=(-1)*ДБФ.sum;
               Иначе
               Строка.Сумма=ДБФ.sum;
               КонецЕсли;
               Если Лев(ДБФ.code,1)="1" ИЛИ Лев(ДБФ.code,1)="5" Тогда
                   Строка.Сумма=ДБФ.sum;
               КонецЕсли;
               Строка.Количество=ДБФ.cnt;
                КонецЦикла;
13 vmv
 
24.11.11
15:29
(11) чепуха не тот случай, тормоза у него потому что он обходит все строки всех объектов, а можно пролетать ненужные если мСтрокиОбработат.Количество() = 0
14 vmv
 
24.11.11
15:32
ну и сами условия во вонутреннем цикле неоптимальны, я бы сделал иначеесли и в первые ветки условий выставил наиболее вероятные условия модификации суммы.

ета все - тема себя исчерпала
15 DeMi4
 
24.11.11
15:35
В этом dbf еще 490 строк
16 DeMi4
 
24.11.11
15:39
Метод объекта не обнаружен (Найти)
       Строка=Объект.Строки.Найти(ДБФ.code,"Код");
17 vmv
 
24.11.11
15:47
(16) что есть коллекция "Строки" у вашего объекта?

табличная часть? тогда там другой метод - я даю правильное направление мысли, а для точной прописи методов есть СП, потрудитесь открыть и уточнить
18 vmv
 
24.11.11
15:48
и параметры метода тоже уточните, там все просто и если вы сделаете это самостятельно, а не тупо слижете код, то станете зубром, почти как я)
19 vmv
 
24.11.11
15:51
и последние искать нужно не строку, а массив строк - потом по нему крутить внутренний цикл без анализа строки на допустимость ее обработки)

ета все - дальнейшая детализация и оптимизация - это протирка конделябра, 1С-ки этим не занимаются, увы
20 aleks-id
 
24.11.11
16:19
>>станете зубром, почти как я
да уж. в цикле обходить 490 строк это сила. а если в следующем файле будет 49 000 строк?
21 DeMi4
 
24.11.11
16:22
Ну а если не циклом
22 aleks-id
 
24.11.11
16:23
(21) см (11)
23 DeMi4
 
24.11.11
16:25
Запросом данные из DBF это вообще возможно
24 hhhh
 
24.11.11
16:26
(23) спасибо.
25 vmv
 
24.11.11
18:52
(20) задача была поставлена так - как оптимизировать имеющийся у автора код, что я и предложил.

Менять подход к решению задачи автор не требовал и на сей счет я не распостранялся особо, але)
26 vmv
 
24.11.11
18:53
(23) можно в 8.2 через внешние источники и драйвер визуал фохпро, но это уже совсем другая история и совсем другой код - меньше и быстрее)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший