Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

как избавиться от цикла в цикле?

как избавиться от цикла в цикле?
Я
   Eeelena
 
18.10.16 - 11:54
Здравствуйте. Имеется следующий код 

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

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


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

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


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

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

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

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

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


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


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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует