Имя: Пароль:
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с делает запрос к БД, который "чешет" всю таблицу, платформа конечно кэширует, полученные ранее значения, но это спасает слабо...
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший