Имя: Пароль:
1C
1С v8
удаление строк ТЧ
0 _barracuda_
 
10.05.18
16:38
Добрый день.
Удаляю строки:


Для каждого СтрокаТаблицы Из Товары Цикл
    если СтрокаТаблицы.Флаг=Истина Тогда
    Товары.Удалить(СтрокаТаблицы)    ;
    КонецЕсли;
КонецЦикла;


Не удаляется последняя строка

Хотя вроде все правильно:
Табличная часть (Tabular section)
Удалить (Delete)
Синтаксис:

Удалить(<Индекс>)
Параметры:

<Индекс> (обязательный)

Тип: Число; Строка табличной части.
Индекс удаляемой строки в табличной части, либо сама удаляемая строка.
1 Buster007
 
10.05.18
16:40
плохой подход
2 DrShad
 
10.05.18
16:40
классика
выборка сбивается
3 _barracuda_
 
10.05.18
16:42
"либо сама удаляемая строка".Удаляю именно строку
4 mr_K
 
10.05.18
16:42
НайтиСтроки.
Удалить
5 _barracuda_
 
10.05.18
16:42
Продолжить; ??
6 DrShad
 
10.05.18
16:43
(5) либо обход ТЧ с последней строки до первой
либо собрать строки которые нужно удалить в массив и обходом массива удалить из ТЧ
7 bolobol
 
10.05.18
16:49
Как эти глупыши умудрились сбивать выборку при удалении строки, на которой выборка спозиционирована. Элемент Следующий известен на этапе позиционирования, вдруг... становится неким другим. Как в анекдоте: "Да как так-то??"
8 Масянька
 
10.05.18
16:51
(7) Это не анекдот... Это классика...
"Средств у нас хватает. У нас ума не хватает" (Кот Матроскин).
9 Ахмадинежад
 
10.05.18
16:52
Для х = - ТЗ.КоличествоСТрок() По -1 Цикл

ТекСтрока = ТЗ[-х-1];
ТЗ.Удалить(ТекСтрока);
КонецЦикла;
10 _barracuda_
 
10.05.18
17:01
Сч = 0;
Пока Сч < Товары.Количество() Цикл
    СтрокаТаблицы = Товары.Получить(Сч);
        Товары.Удалить(СтрокаТаблицы);
    Сч = Сч + 1;
    КонецЦикла;

сделал так.средний не удаляется)
11 bolobol
 
10.05.18
17:03
(10) Написали же - НайтиСтроки, Удалить
12 bolobol
 
10.05.18
17:04
(10) Так а чего в (10)-то написано? Чушь какая-то... Удаляешь строки, а счётчик увеличиваешь
13 Buster007
 
10.05.18
17:05
(10) лучше так
Сч = 0;
Пока Сч < Товары.Количество() Цикл
        Товары.Удалить(Товары[0]);
    Сч = Сч + 1;
    КонецЦикла;
14 bolobol
 
10.05.18
17:05
(13) Ещё один...
15 Buster007
 
10.05.18
17:05
+(13) а еще можно Товары.Очистить()
16 bolobol
 
10.05.18
17:07
(10) Кстати, а куда пропало условие удаления "если СтрокаТаблицы.Флаг=Истина Тогда" ?
17 Timon1405
 
10.05.18
17:07
Лучше так
ТЗ.удалить()
Конфигуратор.Закрыть()
Мозг.Включать()
Поиск.Использовать()
ТупыхТем.НеСоздавать()
18 _barracuda_
 
10.05.18
17:09
Format C)))
19 3achem
 
10.05.18
17:13
Классика

ВременнаяТЗ = ИсходнаяТЗ.Скопировать();
СтрокиУдалить = ВременнаяТЗ .НайтиСтроки(Новый Структура("ЧтоТо", ЧтоТо);
Для каждого Запись Из СтрокиУдалить Цикл    
ВременнаяТЗ.Удалить(Запись);    
КонецЦикла;
ИсходнаяТЗ = ВременнаяТЗ;
20 Buster007
 
10.05.18
17:23
(19) а чего 1 раз скопировал ТЗ только? Может еще раз на всякий случай скопировать?)
21 3achem
 
10.05.18
17:23
(20) скопирую 5 раз, чтобы потом 4 раза ТЗ обнулить
22 hhhh
 
10.05.18
17:41
(21) надо так

НаВсякийСлучайКопияТЗ = ИсходнаяТЗ;
ИсходнаяТЗ = ВременнаяТЗ;
23 Масянька
 
10.05.18
17:50
(18) Блин... Ты даже хард форматнуть не можешь...
24 _barracuda_
 
10.05.18
17:53
Лыжи не едут(((((
из 1,2,3 удаляет 1 и 3

ПараметрыОтбора = Новый Структура;
Для каждого СтрокаТаблицы Из Товары Цикл
    Если СтрокаТаблицы.Флаг=Истина Тогда
        //    ПараметрыОтбора = Новый Структура;
        ПараметрыОтбора.Вставить("Номенклатура", СтрокаТаблицы.Номенклатура);
        НайденныеСтроки =Товары.НайтиСтроки(ПараметрыОтбора);
        для каждого стр из  НайденныеСтроки Цикл
            Товары.Удалить(стр);
        КонецЦикла;
    КонецЕсли;
КонецЦикла;
25 Масянька
 
10.05.18
17:55
(24) Кац предлагал сдаться (С)
26 _barracuda_
 
10.05.18
17:56
Кац жив
27 palladyi
 
10.05.18
17:57
Автор, когда ты удаляешь строчку из таблицы, твоя позиция в ней сдвигается (то есть текущая строка становится та, которая должна была стать следующей). И ты тут же переходишь на следующую строчку. Так и будешь перескакивать
28 palladyi
 
10.05.18
17:58
Лучше всего в отдельный массив отобрать строки на удаление (методом найтиСтроки()), а затем поэлементно удалять эти строки из ТЗ
29 palladyi
 
10.05.18
17:59
А старожилам желаю не стебаться и не намекать, а объяснять логику советов, иначе к ним не прислушаются никогда
30 _barracuda_
 
10.05.18
18:00
(29)Спасибо уважаю.А то чувствую себя мусором
31 palladyi
 
10.05.18
18:00
(30) Да все нормально) Сам долго не мог понять эту тему, пока не объяснили подробно)
32 Йохохо
 
10.05.18
18:05
(24) зачем тебе цикл? почему не сделать отбор 1 раз по Флаг?
33 3achem
 
10.05.18
18:11
(24) Ну как не работает то?

https://yadi.sk/d/EGhpqlyY3VgR2v
34 Fram
 
10.05.18
18:12
(31) как же ты работаешь с более сложными вещами, если такие элементарные тяжело даются
35 _barracuda_
 
10.05.18
18:16
(34) стараюсь.набираюсь опыта
36 Fram
 
10.05.18
18:35
(35) скажи честно, прежде чем создать эту ветку, отладчиком хотя бы воспользовался сначала?
37 _barracuda_
 
10.05.18
18:56
(36)все сделал.всем спасибо
38 НаборДанных
 
10.05.18
20:04
(37)В смысле всё сделал за тебя человек из (33) и даже готовую обработку выложил?)))
39 Масянька
 
11.05.18
08:33
(29) (30) Да, ладно вам... :)))
В бытность моей учебы в универе говорили - каждый нормальный программист должен в своей жизни один раз написать бесконечный цикл.
Сегодня понимаю, что и удалить неправильно должен.
40 _barracuda_
 
11.05.18
08:55
(38)в прямом смысле.мне не удалось ее скачать.Сделал как описал Волшебник и (28)
41 assasu
 
11.05.18
08:57
(0)мой, проверенный годами метод
мУдалить = Новый Массив;
для каждого стр из тз цикл
  если....тогда
    мУдалить.Добавить(стр);
  конецесли;
конеццикла;

для каждого уу из мУдалить Цикл
  тз.Удалить(уу);
конеццикла;
42 3achem
 
11.05.18
10:10
(38) Даже не знаю как это (40) прокомментировать
43 Мыш
 
11.05.18
10:14
Тоже отмечусь:

Для Счетчик=1-Коллекция.Количество() По 0 Цикл
   ЭлементКоллекции=Коллекция[-Счетчик];
КонецЦикла;
44 MiamiVice
 
11.05.18
11:26
Товары = Товары.Скопировать(Новый Структура("Флаг", Истина));
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший