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

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

Найти!

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

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

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

odines.ru
27.10.2020 - 18:49
Смотри также:
Ошибка разделения доступа к 1Cv7.MD
Не получается проверить 2НДФЛ :(
Урбд.Как восстановить базу.

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

4UHAN
1 - 08.07.2009 - 04:22
Предположу, что при удалении строки (во втором случае), выборка начинается вновь с первой строки таблицы значений.

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

Sasha
2 - 08.07.2009 - 04:25
2(0)каким образом формируется ТЗ? Нет возможности наложить фильтр на этапе создания этой таблицы?

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

roma n
3 - 08.07.2009 - 04:29
(0) размеры списков...

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

Sasha
4 - 08.07.2009 - 04:35
(+3) ага, и наличие групп в первом и во втором случае в Списке

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

который не честный
5 - 08.07.2009 - 04:40
1 - ТЗ тут нипричём, т.к. я смотрю время работы проверки в списке значений
"Если Список.Принадлежит(Тз.Контрагент)=0 Тогда"
2 - Тз формируется сложно, проще и быстрее  вырезать лишнее,чем делать бухзапрос по поиску контрагентов, у которых есть остатки на нужных счетах, благо таблица не большая, примерно 800-900 строк..
В прнципе, проверка на вхождение в первом цикле и не нужна, сейчас уберу её и посмотрю время работы всей процедуры

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

odines.ru
27.10.2020 - 18:49
Смотри также:
Как начислить аванс с возвратов?
Подскажите по последовательности в комплексной
Не могу найти в отчетности декларацию по УСН

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

Sasha
6 - 08.07.2009 - 04:41
(5)Не понятно, если эти два цикла идут друг за другом, почему нельзя всё сделать в одном? Если в списке групп нет, то используй вместо Принадлежит(), Найти()

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

Sasha
7 - 08.07.2009 - 04:42
(+6)...НайтиЗначение()

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

USSR
8 - 08.07.2009 - 04:43
А что автор вообще хотел сделать? Уж больно корявовато выглядит код. Может во втором фрагменте логичнее список перебрать, если конечно в нем групп нет? Зачем вообще этот "черный" список "У" ? Сразу не добавлять в ТЗ таковых, или сразу удалить, если ТЗ получилась выгрузкой. Но без формирования списка

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 перебор не получится помоему.

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С: Одинэс.Ру