|   |   | 
| 
 | v7: Удаление лишних строк в ТЗ (NNNN-ная ветка на эту тему) | ☑ | ||
|---|---|---|---|---|
| 0
    
        mirror1982 03.10.12✎ 14:26 | 
        Как в ТЗ в цикле удалить строки, которые не подходят мне по каким-то критериям.
  ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку()=1 Цикл Если ТЗ.Товар........ Тогда ТЗ.УдалитьСтроку(); КонецЕсли; КонецЦикла; Это не работает! | |||
| 1
    
        Галахад гуру 03.10.12✎ 14:27 | 
        Фигасе.     | |||
| 2
    
        mikecool 03.10.12✎ 14:28 | 
        (1) +1 и главное - при чем здесь копирование     | |||
| 3
    
        Zmich 03.10.12✎ 14:28 | 
        Баян.
  Удалять строки надо с конца. | |||
| 4
    
        mirror1982 03.10.12✎ 14:30 | 
        (2) Ну можно из одной ТЗ скопировать данные, которые удовлетворяют моим условиям в другую чистую ТЗ. Без описаний колонок (можно ли так?)     | |||
| 5
    
        mirror1982 03.10.12✎ 14:33 | 
        ау     | |||
| 6
    
        Галахад гуру 03.10.12✎ 14:35 | ||||
| 7
    
        Pr0gLamer 03.10.12✎ 14:35 | 
        http://www.mista.ru/tutor_1c/tz.htm
  там есть рабочий пример | |||
| 8
    
        mikecool 03.10.12✎ 14:35 | 
        (5) можно     | |||
| 9
    
        Zmich 03.10.12✎ 14:36 | 
        ТЗ2 = СоздатьОбъект("ТаблицаЗначений");
  ТЗ.Загрузить(ТЗ2); // а дальше удаляй строки в ТЗ2, только правильным алгоритмом, а не таким, как у тебя | |||
| 10
    
        mikecool 03.10.12✎ 14:36 | 
        копия ТЗ с колонками:
  ТЗ1.Выгрузить(ТЗ2, 1, 1); ТЗ2.УдалитьСтроки(); все | |||
| 11
    
        МихаилМ 03.10.12✎ 14:38 | 
        лет 10 назад на хиппо (проклаб)
  был конкурс на быстрое удааление строк в тз 1с 77 | |||
| 12
    
        Светлый Гений 03.10.12✎ 14:40 | 
        (0)что-нить типа
  сч = 1; КолСтрок = ТЗ.КоличествоСтрок(); Пока сч <= КолСтрок Цикл ТЗ.ПолучитьСтрокуПоНомеру(сч); Если ТЗ.Товар........ Тогда ТЗ.УдалитьСтроку(сч); КолСтрок = КолСтрок - 1; Продолжить; КонецЕсли; сч = сч + 1; КонецЦикла; | |||
| 13
    
        Boroda 03.10.12✎ 14:40 | 
        Как уже было сказано, надо удалять с конца. Тогда все нормально.
  Например я обычно делаю так: Для ц = -тз.КоличествоСтрок() по -1 Цикл тз.ПолучитьСтрокуПоНомеру(-ц); Если ...// Если условие выполняется тз.УдалитьСтроку(); КонецЕсли; КонецЦикла; | |||
| 14
    
        Boroda 03.10.12✎ 14:42 | 
        Для небольших таблиц иногда делаю как в (1), но добавляю после удаления строки тз.ВыбратьСтроки();     | |||
| 15
    
        Светлый Гений 03.10.12✎ 14:44 | 
        (14)все равно жесть ))     | |||
| 16
    
        Mikeware 03.10.12✎ 14:44 | 
        (14) лучше ИндексированнаяТаблица-ДобавитьИндекс-УстановитьФильтр-Выгрузить или ИндексированнаяТаблица-ДобавитьИндекс-УстановитьФильтр-УдалитьСтроки     | |||
| 17
    
        МихаилМ 03.10.12✎ 14:47 | ||||
| 18
    
        Эльниньо 03.10.12✎ 16:58 | 
        Давненько не было самой популярной темы.
  (3) Нет, сначала. Спорим? | |||
| 19
    
        Deon 03.10.12✎ 17:02 | 
        (18) А слабо из середины одновременно в разные стороны?     | |||
| 20
    
        Эльниньо 03.10.12✎ 17:05 | 
        (11) Мой алгоритм конкурс не прошёл, но в какой-то учебник попал.
  Сейчас, как правило, его советуют. Странно, что здесь ещё не выложили. | |||
| 21
    
        Deon 03.10.12✎ 17:06 | 
        (20) Покажешь?     | |||
| 22
    
        Эльниньо 03.10.12✎ 17:15 | 
        (21) В (0) Если заменить на Пока. Ну и ещё пару строчек.     | |||
| 23
    
        Mikeware 03.10.12✎ 18:09 | 
        (19) легко. Только зачем?
  кстати, выбор алгоритма изрядно зависит от критерия и входных данных. | |||
| 24
    
        acsent 03.10.12✎ 18:16 | 
        даже помнится конкурс на эту тему был     | |||
| 25
    
        Злопчинский 04.10.12✎ 16:37 | 
        //******************************************************************************
  // ОчисткаТЗ() // Параметры: ТЗ, которую надо очистить // В ТЗ д.б. Колонки с идентификаторами "НадоУдалить" и "ОПС" (оригинальный порядок строк) // Описание: очищает ТЗ от ненужных строк Процедура глОчисткаТЗ(ТЗдляЧистки, ОПС="+ОПС", КолонкаУдалить="НадоУдалить", Режим=0) Экспорт Попытка НадоУдалить = ТЗдляЧистки.Итог(КолонкаУдалить); Исключение Возврат; КонецПопытки; ТЗКС = ТЗдляЧистки.КоличествоСтрок(); Если Режим <> 0 Тогда Сообщить("> ["+ТекущееВремя()+"]: *** удаляем "+НадоУдалить+" из "+ТЗКС+" ****"); КонецЕсли; Если НадоУдалить <= 0 Тогда Возврат; КонецЕсли; Если НадоУдалить >= ТЗКС Тогда ТЗдляЧистки.УдалитьСтроки(); Иначе ТЗРаб = СоздатьОбъект("ТаблицаЗначений"); ТЗдляЧистки.Выгрузить(ТЗРаб); ТЗРаб.Сортировать("+"+КолонкаУдалить); ТЗРаб.Выгрузить(ТЗдляЧистки,1,ТЗКС-НадоУдалить); ТЗРаб = 0; КонецЕсли; Если ОПС = "" Тогда Возврат; КонецЕсли; //сортировать не надо Если ОПС = "###" Тогда Возврат; КонецЕсли; //сортировать не надо //восстановим оригинальный порядок строк ТЗдляЧистки.Сортировать(ОПС); КонецПроцедуры //глОчисткаТЗ() | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |