Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

Форум 1С: Одинэс.Ру

Найти!

Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

который не честный
08.07.2009 - 03:35
Вот такой код.
Список=СоздатьОбъект("СписокЗначений");
Тз.ВыбратьСТроки();
Пока Тз.ПолучитьСТроку()=1 Цикл
Счет=Лев(Тз.Счет,1);
Если Счет="У" Тогда
Если Список.Принадлежит(Тз.Контрагент)=0 Тогда
Список.ДобавитьЗначение(Тз.Контрагент);
КонецЕсли;
КонецЕсли;
КОнецЦИкла;
Дела замеры
Строка "Если Список.Принадлежит(Тз.Контрагент)=0 Тогда" выполняется 150 раз и времени затрачивает 9 секунд.
А ниже она выполняется 800 раз и времени уходит 0.1 сек.
Почему так??
 
Тз.ВыбратьСТроки();
Тз.ПолучитьСТроку();
Пока Тз.НомерСтроки>0 Цикл
Если Список.Принадлежит(Тз.Контрагент)=0 Тогда
Тз.УдалитьСтроку(Тз.НомерСтроки);
Иначе
Тз.ПолучитьСТроку();
КонецЕсли;
КОнецЦИкла;
К списку тем 1 > К списку форумов

Интересные темы

odines.ru
22.10.2020 - 20:06
Смотри также:
Есть ли возможность развернуть наименование колонки
Разрушена база , встречались ли симптомы ?
Как восстановить md?

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

который не честный
9 - 08.07.2009 - 04:47
3,4 - это один последовательный код, процедура. В первом цикле в таблице идёт поиск контрагентов, у которых есть счета с первой буквой У. Они закидываются в список, а потом те, кто не попал в список - удаляются.
Вот вся процедура
Процедура ФильтрПоУхх(Тз)
Список=СоздатьОбъект("СписокЗначений");
Тз.ВыбратьСТроки();
Пока Тз.ПолучитьСТроку()=1 Цикл
Счет=Лев(Тз.Счет,1);
Если Счет="У" Тогда
//Если Список.Принадлежит(Тз.Контрагент)=0 Тогда
Список.ДобавитьЗначение(Тз.Контрагент);
//КонецЕсли;
КонецЕсли;
КОнецЦИкла;
 
Тз.ВыбратьСТроки();
Тз.ПолучитьСТроку();
Пока Тз.НомерСтроки>0 Цикл
Если Список.Принадлежит(Тз.Контрагент)=0 Тогда
Тз.УдалитьСтроку(Тз.НомерСтроки);
Иначе
Тз.ПолучитьСТроку();
КонецЕсли;
КОнецЦИкла;
КонецПроцедуры
Я закоментировал строку проверки(как видите), вся процедура выполнилась за 0.3 секунды.
Вопрос в том, что в первом цикле проверка выполняется 150 раз и времени занимает 9 секунд по замеру.
А во втором цикле эта проверка выполняется 800 раз за 0.1 секунды.
Почему?

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

Sasha
10 - 08.07.2009 - 04:52
(9)Вопрос "Почему?" тут не главный :-) Подборка советов в порядке поступления, а то ты игнорируешь:
Сформировать ТЗ уже без "плохих" контрагентов;
или Добавление в список и удаление строк сделать за один перебор ТЗ;
и вместо Принадлежит() использовать НайтиЗначение(), так как групп я понял у тебя нет...Кроме того, если Список дальше не используется, то он вообще не нужен

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

который не честный
11 - 08.07.2009 - 04:52
8 - есть таблица вида
К1 Счет1
К1 Счет2
К1 Счет3
К2 Счет1
К2 Счет2
К2 УСчет1
У К1 нет счета с буквой У и он не нужен.
 
Должно остаться
К2 Счет1
К2 Счет2
К2 УСчет1
 
На этапе заполнения я этого незнаю, будет ли у него такой счет.

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

roma n
12 - 08.07.2009 - 04:55
(9) код корявый.
Про эффект: в качестве предположения - при добавлении в список и последующем поиске приходится перестраивать индекс.

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

который не честный
13 - 08.07.2009 - 04:56
10 - за 1 перебор не получится помоему.

Интересные темы

odines.ru
22.10.2020 - 20:06
Смотри также:
Автозапуск 1С ночью, Win2003
не показывает СНД по сумме
Перечисление в ОЛЕ

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

который не честный
14 - 08.07.2009 - 05:00
12 - чем именно? Код простой, работает быстро. Как еще узнать, что надо удалять а что нет?

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

Sasha
15 - 08.07.2009 - 05:01
2(10)
Процедура ФильтрПоУхх(Тз)
Список=СоздатьОбъект("СписокЗначений");
//Тз.ВыбратьСТроки();
//Пока Тз.ПолучитьСТроку()=1 Цикл
сч=1;
Пока сч<=ТЗ.КоличествоСтрок() Цикл
ТЗ.ПолучитьСтрокуПоНомеру(сч);
Счет=Лев(Тз.Счет,1);
Если Счет="У" Тогда
//Если Список.Принадлежит(Тз.Контрагент)=0 Тогда
Список.ДобавитьЗначение(Тз.Контрагент);
сч=сч+1;
//КонецЕсли;
Иначе
тз.УдалитьСтроку(сч);
КонецЕсли;
КОнецЦИкла;

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

который не честный
16 - 08.07.2009 - 05:04
15 - я так понимаю из 11 поста   в ТЗ останется 1 строка, а должно 3.

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

Sasha
17 - 08.07.2009 - 05:09
(16) действительно, не внимательно посмотрел на то, что нужно в итоге)

Re: Почему проверка в списке на принадлежность первый раз тормозит а потом нет?

который не честный
18 - 08.07.2009 - 05:17
Спасибо всем.
Задача решена, ответ на вопрос примерно получен.
К списку тем 1 > К списку форумов
Тема закрыта и находится в архиве.
Но Вы можете начать новую тему.
« Шрифты в 1С 7.7 после переустановки MS Server 2003 Регистр. Каку функцию применать? »
© 2009 Форум 1С: Одинэс.Ру