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