удаление строки из таблицы значений

Тема в разделе "1C и всё что с ней связано", создана пользователем Helena, 12 апр 2007.

  1. Helena

    Helena Гость

    Вроде простая операция, а не работает... :)

    тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку()=1 Цикл
    Если (тз.Подр="ППС") Тогда
    тз.удалитьстроку();
    КонецЕсли;
    КонецЦикла;

    Подскажите, пожалуйста, что я делаю не так? В отладчике точно вижу, что тз.Подр=ППС, но условие все равно проскакивается
     
  2. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Посмотрите внимательно в отладчике.
    Подозреваю, что тз.Подр = "ППС "
    Всмысле, содержит либо впереди, либо в конце строки пробелы
    условие СокрЛП(тз.Подр) точно будет "ППС"
     
  3. Helena

    Helena Гость

    Огромное спасибо :)
     
  4. LSH

    LSH Гость

    Для: Helena

    <!--QuoteBegin-Helena+12:04:2007, 10:22 -->
    <span class="vbquote">(Helena @ 12:04:2007, 10:22 )</span><!--QuoteEBegin-->тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку()=1 Цикл
    Если (тз.Подр="ППС") Тогда
    тз.удалитьстроку();
    КонецЕсли;
    КонецЦикла;
    [snapback]62197" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Не правильно.

    У вас в цикле пропускаются строки. Например, у нас 3-я и 4-я строка содержат тз.Подр = "ППС".
    Цикл попадает на 3-ю строку, условие выполняется, и он эту строку удаляет. При этом, все последующиестроки сдвигаются на 1 вверх, и получается так, что 4-я строка стала 3-ей, но цикл 3-ю уже обработал, поэтому он её пропустит и перейдет сразу на следующую.

    Идеальный вариант:
    Код (Text):
    а=1;

    Пока а <= тз.КоличествоСтрок() Цикл
    тз.ПолучитьСтрокуПоНомеру(а);
    Если СокрЛП(тз.Подр)="ППС" Тогда
    тз.УдалитьСтроку(а);        //удаляем строку, но "а" не увеличиваем, т.к. следующая строка у нас и есть "а"
    Иначе
    а = а + 1;                         //увеличиваем а (для перехода на след. строку)
    КонецЕсли;
    КонецЦикла;
     
  5. Helena

    Helena Гость

    В итоге строки я удаля, но в дальнейшем, когда я из функции обращаюсь к этой таблице, оказывается так, что строки не удалены.....:(
    не понимаю, почему....
     
  6. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Для: LSH
    Еще можно так:
    Код (Text):

    поз=0;
    Пока тз.НайтиЗначение("ППС",поз,"Подр") <> 0 Цикл
    тз.УдалитьСтроку(поз);
    поз=0;
    КонецЦикла;
    ИМХО, короче будет...
     
  7. LSH

    LSH Гость

    Для: vitfil

    Короче, но по-моему медленнее.

    Всё будет тормозить
    Код (Text):
    тз.НайтиЗначение("ППС",поз,"Подр")
     
  8. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Для: LSH
    сказывается отсутствие индексов на ТЗ в семерке.
    только вот я лично не знаю, как работает тз.КоличествоСтрок()...
    Ради прикола сейчас сделаю тест на скорость двух вариантов...
     
  9. Helena

    Helena Гость

    Это все замечательно, но не могли бы вы на мой вопрос ответить? :)

    В итоге строки я удаля, но в дальнейшем, когда я из функции обращаюсь к этой таблице, оказывается так, что строки не удалены.....
    не понимаю, почему....
     
  10. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Для: LSH
    Ваш вариант на 10 000 строк - 3267 мсек
    Мой вариант без сортировки таблицы - 11120 мсек
    После сортировки таблицы - 11808 мсек.

    Вывод: мой код более компактный, ваш код более быстрый!
     
  11. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Для: LSH
    Дальнейшие испытания показали, что время выполнения моего варианта практически всегда в 4 раза больше.

    Для: Helena
    ах даааааааа.
    Давайте ваш код по удалению и потом как обращаетесь к таблице, в которой оказывается, что не удалены строки. Может, удаление все же не происходит? В отладчике посмотрите, удаляются строки или нет.
     
  12. LSH

    LSH Гость

    Для: vitfil

    В коде часто встречаю такие конструкции:

    Код (Text):
    тз.ВыбратьСТроки();
    Пока тз.ПолучитьСтроку() = 1 Цикл
    Если какое_то_условие = 1 Тогда
    тз.УдалитьСТроку();
    тз.ВыбратьСтроки();
    КонецЦикла;
    Можете замерять время такого способа (на ваших данных)?
     
  13. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Для: LSH
    Время указано в мсек. Таблица заполнялась случайным образом двумя значениями: "ППС" и "ККС". Удалялись строки с "ППС".
    Всего строк в таблице: 10000
    Вот парочка замеров. Тенденция, однако, прослеживается.

    Удалено позиций: 2925
    Первый вариант (ваш): 1100
    Вариант без сортировки: 4240
    Вариант с сортировкой: 7540
    Вариант с перевыборкой: 152344

    Удалено позиций: 3032
    Первый вариант: 1143
    Вариант без сортировки: 4547
    Вариант с сортировкой: 8511
    Вариант с перевыборкой: 160330
     
  14. LSH

    LSH Гость

    <!--QuoteBegin-vitfil+14:04:2007, 08:10 -->
    <span class="vbquote">(vitfil @ 14:04:2007, 08:10 )</span><!--QuoteEBegin-->Вариант с перевыборкой: 152344
    ...
    Вариант с перевыборкой: 160330
    [snapback]62405" rel="nofollow" target="_blank[/snapback]​
    [/quote]

    Ничего себе!!
     
  15. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Для: LSH
    С перевыборкой - это ваш последний код. В общем, в следующий раз, когда встречаете такой код, берете топор и отымаете руки тому, кто это писал... :)
    Я еще и не такое встречал. Расходная накладная. При проведении запрос формируется не по списку товаров, а по каждому товару в отдельности с запретом товарных дублей в табличной части документа.
     
  16. Helena

    Helena Гость

    тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку()=1 Цикл

    Если (СокрЛП(тз.Подр)="ППС") и (тз.НомерСтроки()<>0) Тогда
    тз.удалитьстроку();
    КонецЕсли;
    КонецЦикла;

    // вывожу тз, строки удалены

    Функция занято()
    зан=0;
    тз.выбратьстроки();
    Пока тз.ПолучитьСтроку()=1 Цикл
    ........
    КонецЦикла;
    возврат зан;
    КонецФункции

    // в отладчике вижу, что обрабатывается вся таблица тз (т.е. строки в ней не удалены)
     
  17. Flut

    Flut Гость

    Пробуй сделать как написал LSH, должно получиться

    а=1;

    Пока а <= тз.КоличествоСтрок() Цикл
    тз.ПолучитьСтрокуПоНомеру(а);
    Если СокрЛП(тз.Подр)="ППС" Тогда
    тз.УдалитьСтроку(а); //удаляем строку, но "а" не увеличиваем, т.к. следующая строка у нас и есть "а"
    Иначе
    а = а + 1; //увеличиваем а (для перехода на след. строку)
    КонецЕсли;
    КонецЦикла;
     
  18. Helena

    Helena Гость

    В том-то и дело, чтьо удалять-то удаляет, потому что я сначала вывожу "очищенную" таблицу, потом снова к ней обращаюсь и уже оказывается, что она "не очищена"
     
  19. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Для: Helena
    Посмотрел ваш код... Посмотрел рекомендации и примеры, которые дали вам в качестве правильного кода... Никак не могу понять, почему вы не хотите читать то, что вам пишут?! У вас в коде ошибка. Не удаляются все "ненужные" строки в таблице.
     
Загрузка...

Поделиться этой страницей