Имя: Пароль:
1C
 
Удаление строки из таблицы значений
0 Ston
 
30.11.09
14:03
есть в форме табличное поле. Данные с определенным маршрутом нужно занести в документ Путевой лист. Потом эта строка должна быть удалена.
написал вот такое:

Для Каждого Стр Из ТабличноеПоле1 Цикл
       Если Стр.Маршрут=НомерМаршрута Тогда
       СтрокаТЧ=Док.ТабличнаяЧасть1.Добавить();
       СтрокаТЧ.Контрагент=Стр.Контрагент;
       СтрокаТЧ.Реализация=Стр.Заявка;        
       СтрокаТЧ.АдресДоставки=Стр.АдресДоставки;
       СтрокаТЧ.вес=Стр.Вес;
               ТабличноеПоле1.Удалить(Стр);
   КонецЕсли;                        
КонецЦикла;
Получается что удаляет по одной строке. Как быть подскажите..
1 73
 
30.11.09
14:05
Съедает сам себя...

Накапливай в массив удаляемых.
Потом отдельным циклом по массиву - удалить.
2 Mitriy
 
30.11.09
14:08
Перем НайденнаяСтрока;
Для Каждого Стр Из ТабличноеПоле1 Цикл

       Если Стр.Маршрут=НомерМаршрута Тогда
НайденнаяСтрока = Стр;
       СтрокаТЧ=Док.ТабличнаяЧасть1.Добавить();
       СтрокаТЧ.Контрагент=Стр.Контрагент;
       СтрокаТЧ.Реализация=Стр.Заявка;        
       СтрокаТЧ.АдресДоставки=Стр.АдресДоставки;
       СтрокаТЧ.вес=Стр.Вес;
               
   КонецЕсли;                        
КонецЦикла;
Если НайденнаяСтрока <> Неопределено Тогда
ТабличноеПоле1.Удалить(НайденнаяСтрока);
КонецЕсли;
3 Ston
 
30.11.09
14:08
(1) ага...пасиба
4 Ston
 
30.11.09
14:08
(2) пасиба
5 Ston
 
30.11.09
14:12
(2) нее....удаляет только последнюю строку
6 Mitriy
 
30.11.09
14:15
(5) что спросил, то тебе и ответил... дорисуй массив (1)
7 de_k
 
30.11.09
14:29
В обратном порядке:

ИндексПоследнего = ТабличноеПоле1.Количество() - 1;

Для Индекс = 0 По ИндексПоследнего Цикл

       Если ТабличноеПоле1[ИндексПоследнего - Индекс].Маршрут = НомерМаршрута Тогда

       ...
       ТабличноеПоле1.Удалить(ИндексПоследнего - Индекс);
   
   КонецЕсли;

КонецЦикла;
8 lxs
 
30.11.09
14:37
МассивСтрок = Новый Массив;
Для Каждого Стр Из ТабличноеПоле1 Цикл
       Если Стр.Маршрут=НомерМаршрута Тогда
       СтрокаТЧ=Док.ТабличнаяЧасть1.Добавить();
       СтрокаТЧ.Контрагент=Стр.Контрагент;
       СтрокаТЧ.Реализация=Стр.Заявка;        
       СтрокаТЧ.АдресДоставки=Стр.АдресДоставки;
       СтрокаТЧ.вес=Стр.Вес;
       МассивСтрок.Добавить(Стр);
   КонецЕсли;                        
КонецЦикла;

Для каждого ЭлементМассива Из МассивСтрок Цикл
   ТабличноеПоле1.Удалить(ЭлементМассива);
КонецЦикла;
9 Ston
 
30.11.09
14:40
(8) спасибо, так и сделал
10 strange2007
 
30.11.09
14:52
(9) Обратным порядком быстрее и проще
11 Mitriy
 
30.11.09
14:57
(10) быстрее и проще вообще через НайтиСтроки...
12 strange2007
 
30.11.09
19:30
(11) Согласен. Если это единичная строка. Если необходимо анализировать всю ТЗ с удалением, тогда обратный порядок. Вообще, в 8 поиск строк в ТЗ ооочень долгий и не выгодный
13 Axel2009
 
30.11.09
19:35
Сч = 0;
Пока Сч < ТабличноеПоле1.Количество() Цикл
   СтрокаТЧ = ТабличноеПоле1[Сч];
   Если Стр.Маршрут=НомерМаршрута Тогда
       СтрокаТЧ=Док.ТабличнаяЧасть1.Добавить();
       СтрокаТЧ.Контрагент=Стр.Контрагент;
       СтрокаТЧ.Реализация=Стр.Заявка;        
       СтрокаТЧ.АдресДоставки=Стр.АдресДоставки;
       СтрокаТЧ.вес=Стр.Вес;
       МассивСтрок.Добавить(Стр);
   Иначе
       Сч = Сч + 1;
   КонецЕсли;  
КонецЦикла;
14 Axel2009
 
30.11.09
19:36
конечно удаляем без массива

Сч = 0;
Пока Сч < ТабличноеПоле1.Количество() Цикл
   СтрокаТЧ = ТабличноеПоле1[Сч];
   Если Стр.Маршрут=НомерМаршрута Тогда
       СтрокаТЧ=Док.ТабличнаяЧасть1.Добавить();
       СтрокаТЧ.Контрагент=Стр.Контрагент;
       СтрокаТЧ.Реализация=Стр.Заявка;        
       СтрокаТЧ.АдресДоставки=Стр.АдресДоставки;
       СтрокаТЧ.вес=Стр.Вес;
       ТабличноеПоле1.Удалить(СтрокаТЧ);
   Иначе
       Сч = Сч + 1;
   КонецЕсли;  
КонецЦикла;
15 1c_asp
 
30.11.09
19:39
Для а = -ТабличноеПоле1.Количество()+1 по 0 цикл
СтрокаТЧ = ТабличноеПоле1[-а];
ТабличноеПоле1.Удалить(СтрокаТЧ);
конеццикла;
16 ОбычныйЧеловек
 
30.11.09
20:05
МассивСтрок=ТабличноеПоле1.НайтиСтроки(Новый Структура("Маршрут", НомерМаршрута));
Для Каждого СтрокаМассива Из МассивСтрок Цикл
  СтрокаТЧ=Док.ТабличнаяЧасть1.Добавить();
  ЗаполнитьЗначенияСвойств(СтрокаТЧ, СтрокаМассива);
  СтрокаТЧ.Реализация=СтрокаМассива .Заявка;
  ТабличноеПоле1.Удалить(СтрокаМассива);
КонецЦикла;
17 strange2007
 
01.12.09
04:02
(13) Не надо так делать. Идти надо в обратном порядке от конца ТЗ. Таким образом уменьшается количество проверок, увеличивается скорость и уменьшается перегруженность кода
18 strange2007
 
01.12.09
04:04
(16) Долго работать будет. Метод "НайтиСтроки()" самый не оптимальный
19 Шёпот теней
 
01.12.09
08:54
удаление "одинаковых" строк из ТЗ "с низу" или "с верху через массив" требуют либо сортировки по сравниваемым колонкам с возвратом в "обратно" ... либо "беготни" по всей ТЗ ...

метод НайтиСтроки() позволяет это делать без сортировки ...

... вот ...
20 strange2007
 
03.12.09
03:57
(19) Сам метод найти строки требует время на то что бы пробежаться по ТЗ. Именно пробежаться. Да пробежаться так, что часто "руками" бывает быстрее нежели средствами платформы. На втором шаге необходимо пройти по результату. Тогда как обратным обходом можно за один раз все сделать.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший