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

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 человек.
Рекламное место пустует