Имя: Пароль:
1C
1С v8
как избавиться от цикла в цикле?
0 Eeelena
 
18.10.16
11:54
Здравствуйте. Имеется следующий код

НайденныеСтроки = Назначения.НайтиСтроки(
         Новый Структура("ДокументОснование",ТекущиеДанныеЗаявки.Заявка));
         Для каждого Строка Из ОсновныеСредстваВсе Цикл
             Если Строка.Показывать Тогда
                 //ищем в найденныхСтроках
                 Нашли = Ложь;
                 Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
                     Если НайденнаяСтрока.ОсновноеСредство = Строка.ОсновноеСредство Тогда
                         Нашли = Истина;
                         Прервать;
                     КонецЕсли;    
                 КонецЦикла;
                
                 Если Не Нашли Тогда
                    Строка.Показывать = Ложь;
                 КонецЕсли;
             КонецЕсли;
         КонецЦикла;


Как избавиться от цикла в цикле?
1 Сергиус
 
18.10.16
11:57
(0)Запросом.
2 zladenuw
 
18.10.16
11:58
итерация
3 Nuobu
 
18.10.16
12:00
Для каждого НайденнаяСтрока Из НайденныеСтроки Цикл
                     Если НайденнаяСтрока.ОсновноеСредство = Строка.ОсновноеСредство Тогда
                         Нашли = Истина;
                         Прервать;
                     КонецЕсли;    
                 КонецЦикла;

ДругиеНайденныеСтроки = НайденныеСтроки.Найти(Новый Структура("основноеСредство", Строка.ОсновноеСредство ));
Если ДругиеНайденныеСтроки.Количество() Не Равно 0 Тогда
Нашли = Истина;
Прервать;
КонецЕсли;
4 Naf_kultura
 
18.10.16
12:01
Для каждого Строка Из ОсновныеСредстваВсе Цикл
             Если Строка.Показывать Тогда
                //ищем в найденныхСтроках

НайденныеСтроки = Назначения.НайтиСтроки(
         Новый Структура("ДокументОснование,ОсновноеСредство",ТекущиеДанныеЗаявки.Заявка,Строка.ОсновноеСредство));
                
                 Если НайденныеСтроки.Количество()=0 Тогда
                    Строка.Показывать = Ложь;

                 КонецЕсли;
             КонецЕсли;
         КонецЦикла;
5 Мойдодыр
 
18.10.16
12:01
может сразу искатьпо 2 полям?
6 Eeelena
 
18.10.16
12:12
(3) (4) от этого выполняться быстрее не стало( делаю замер производительности, на этом участке кода показывает кол вызовов 1633, время(чистое) 11,03, %Время(чистое) 88,66
7 Serg_1960
 
18.10.16
12:13
(5) Угу. НайтиСтроки() позволяет искать по нескольким полям - структура же не зря используется.
8 Timon1405
 
18.10.16
12:15
можно еще дописать в начале Назначения.Индексы.Добавить("ДокументОснование, основноеСредство");
9 Eeelena
 
18.10.16
12:22
(3) (4) (5) (7) (8) выяснала что проблема быстродействия не в этом коде, а в

Для каждого Строка Из ОсновныеСредстваВсе Цикл
             Если Не НазначениеВозможно(Строка) Тогда
                 Строка.Показывать = Ложь;
             КонецЕсли;
         КонецЦикла;

Код функции НазначениеВозможно

Значение = Истина;
    Если ДанныеСтроки=Неопределено Тогда
        ДанныеСтроки = ЭлементыФормы.ОсновныеСредства.ТекущиеДанные;
    КонецЕсли;
    
    ТекущиеДанныеЗаявки = ЭлементыФормы.Заявки.ТекущиеДанные;
    Если НЕ ЗначениеЗаполнено(ТекущиеДанныеЗаявки) или НЕ ЗначениеЗаполнено(ДанныеСтроки) Тогда
        Возврат ИСТИНА;
    КонецЕсли;

    
    Если ЗначениеЗаполнено(ТекущиеДанныеЗаявки.Модель)
        и ТекущиеДанныеЗаявки.Модель<>ДанныеСтроки.Модель Тогда
        Значение = Ложь;
        
    ИначеЕсли ЗначениеЗаполнено(ДанныеСтроки.Модель)    тогда
        если ЗначениеЗаполнено(ТекущиеДанныеЗаявки.Заявка.ТипОС)    и ТекущиеДанныеЗаявки.Заявка.ТипОС<>ДанныеСтроки.Модель.ТипМашиныМеханизма Тогда
            Значение = Ложь;
        КонецЕсли;
    Иначе
        Значение = Ложь;
    КонецЕсли;
    


    Возврат Значение;


В ТЗ ОсновныеСредсваВсе 2412 строк и для каждой вызывается эта функция, как можно повысит быстродействие?
10 Мойдодыр
 
18.10.16
12:37
а в этой функции где затык?
11 Dotoshin
 
18.10.16
12:38
(9) Тормоза возникают при обращении к вот таким реквизитам:
ДанныеСтроки.Модель.ТипМашиныМеханизма
ТекущиеДанныеЗаявки.Заявка.ТипОС
Каждое такое обращение порождает запрос к БД, к тому же не оптимальный. Если избавиться от обращения к реквизитам через точку, особенно через две и более точек тормоза должны уменьшиться.
12 Eeelena
 
18.10.16
12:39
(10) в замере производительности на этой строке

если ЗначениеЗаполнено(ТекущиеДанныеЗаявки.Заявка.ТипОС)    и ТекущиеДанныеЗаявки.Заявка.ТипОС<>ДанныеСтроки.Модель.ТипМашиныМеханизма
13 Eeelena
 
18.10.16
12:39
(11) да, спасибо, это я исправила, но производительность не повысилась
14 Torquader
 
18.10.16
12:41
А вообще с чем идёт война - может быть - динамический список в принципе быстрее работать не может ?
15 Мойдодыр
 
18.10.16
12:43
получай типОС через функцию ЗначениеРеквизитаОбъекта
16 Eeelena
 
18.10.16
12:47
(15) это для управляемых форм?
17 Eeelena
 
18.10.16
12:48
у меня обычные формы
18 Dotoshin
 
18.10.16
12:48
(13) Ну тогда только получение всех необходимых данных одним запросом спасет вас от тормозов. Ну то есть делаете один запрос, в котором проверяете все необходимые условия, заполняете все необходимые поля и один раз обходите результат этого запроса.
19 Eeelena
 
18.10.16
12:54
(11) (18) сделала вот так
Значение = Истина;
    Если ДанныеСтроки=Неопределено Тогда
        ДанныеСтроки = ЭлементыФормы.ОсновныеСредства.ТекущиеДанные;
        
    КонецЕсли;
    
    ТекущиеДанныеЗаявки = ЭлементыФормы.Заявки.ТекущиеДанные;
    Заявка=ТекущиеДанныеЗаявки.Заявка;
    Модель=ДанныеСтроки.Модель;
    Если НЕ ЗначениеЗаполнено(ТекущиеДанныеЗаявки) или НЕ ЗначениеЗаполнено(ДанныеСтроки) Тогда
        Возврат ИСТИНА;
    КонецЕсли;

    
    Если ЗначениеЗаполнено(ТекущиеДанныеЗаявки.Модель)
        и ТекущиеДанныеЗаявки.Модель<>ДанныеСтроки.Модель Тогда
        Значение = Ложь;
        
    ИначеЕсли ЗначениеЗаполнено(ДанныеСтроки.Модель)    тогда
        если ЗначениеЗаполнено(Заявка.ТипОС)    и Заявка.ТипОС<>Модель.ТипМашиныМеханизма Тогда
            Значение = Ложь;
        КонецЕсли;
    Иначе
        Значение = Ложь;
    КонецЕсли;

но судя по замеру стало работать еще медленнее
20 Dotoshin
 
18.10.16
13:09
Модель=ДанныеСтроки.Модель
Модель.ТипМашиныМеханизма
и подобные строки это все запросы к БД, то есть  когда вы обращаетесь к Модель.ТипМашиныМеханизма, платформа 1с делает запрос к БД, который "чешет" всю таблицу, платформа конечно кэширует, полученные ранее значения, но это спасает слабо...