1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

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

  1. Helena

    Helena Гость

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

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

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

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

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

    Helena Гость

    Репутация:
    0
    Огромное спасибо :)
     
  4. LSH

    LSH Гость

    Репутация:
    0
    Для: 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-ю уже обработал, поэтому он её пропустит и перейдет сразу на следующую.

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

    Helena Гость

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

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

    Репутация:
    0
    Регистрация:
    2 апр 2004
    Сообщения:
    2.062
    Симпатии:
    0
    Для: LSH
    Еще можно так:
    Код:
    поз=0;
    Пока тз.НайтиЗначение("ППС",поз,"Подр") <> 0 Цикл
    тз.УдалитьСтроку(поз);
    поз=0;
    КонецЦикла;
    ИМХО, короче будет...
     
  7. LSH

    LSH Гость

    Репутация:
    0
    Для: vitfil

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

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

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

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

    Helena Гость

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

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

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

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

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

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

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

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

    LSH Гость

    Репутация:
    0
    Для: vitfil

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

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

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

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

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

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

    LSH Гость

    Репутация:
    0
    <!--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-интегратор

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

    Helena Гость

    Репутация:
    0
    тз.ВыбратьСтроки();
    Пока тз.ПолучитьСтроку()=1 Цикл

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

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

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

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

    Flut Гость

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

    а=1;

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

    Helena Гость

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

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

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

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