Имя: Пароль:
1C
1C 7.7
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;
   КонецЕсли;
   Если ОПС = ""     Тогда Возврат; КонецЕсли; //сортировать не надо
   Если ОПС = "###" Тогда Возврат; КонецЕсли; //сортировать не надо
   //восстановим оригинальный порядок строк
   ТЗдляЧистки.Сортировать(ОПС);
КонецПроцедуры    //глОчисткаТЗ()
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.