Версия для печати темы (https://pro1c.org.ua/index.php?s=7ad2fbb810a9e00fde8394a3e42d75b6&showtopic=41977)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Удалить указанные стоки табличной части

Автор: Gigi 16.11.17, 15:27

Привет всем!
У меня опять вопрос ерундовый. У которого наверно опять решение это .... целая проблема.
Опять как обычно.. сделать ерунду сложно, а не наоборот.
Вопрос в чем... нужно удалить строки табличной части в которых булевый "реквизит2" имеет значение ЛОЖЬ.
Ну никак это не удаеться блин.. эта опять ерунда.
Потому, что наверно команда: Объект.ТабличнаяЧасть1.Удалить(ТекСтрокаИдент); удаляет по номеру строки, а не по идентификатору.
Поэтому в цикл удаляет не все поля имеющие на пример значение реквизита: "Реквизит2": ложь.... кое что оставляет и не удаляет.
Как быть? Блиин! Опять вынужден выходить на форум из ерундового вопроса.
Думал можно в цикле удалять так:

Сторка.Удалить();

Но где такое счастье, что бы можно было такой легкой командой удалить. И не париться с номером строки.. идентификатором и т.д.
&НаКлиенте
Процедура ТЧ_УдалитьУказанныеСтроки()
Для Каждого Сторка из Объект.ТабличнаяЧасть1 цикл
ТекСтрокаНомер=Сторка.НомерСтроки;
ТекСтрокаИдент=Сторка.ПолучитьИдентификатор();
Сообщить(""+ТекСтрокаНомер+" -- "+ТекСтрокаИдент);
//------------------------------------------------
Если  Сторка.Реквизит2=ложь Тогда
//Сторка.Удалить();    // ну такой команды конечно нет ... естественно
Объект.ТабличнаяЧасть1.Удалить(ТекСтрокаИдент); // не все удаляет .. пропускает не удалив
КонецЕсли;
//------------------------------------------------
КонецЦикла;    
КонецПроцедуры

Как быть?
Может в таком случае нужно удалять по идентификатору?
И как это сделать?
Буду признателен!

Автор: Petre 16.11.17, 15:32

Gigi @ Сегодня, 16:27 * ,

МассивНайденныхСтрок = Объект.ТабличнаяЧасть1.НайтиСтроки(Новый Структура("Реквизит2", Ложь));
Для Каждого ТекНайденнаяСтрока Из МассивНайденныхСтрок Цикл
    Объект.ТабличнаяЧасть1.Удалить(ТекНайденнаяСтрока);
КонецЦикла;

Автор: Bernet 16.11.17, 15:32

Gigi @ Сегодня, 15:27 * ,

МассивУдаляемых = Новый Массив;

Для Каждого СтрокаТЧ Из ВашаТЧ Цикл
   Если СтрокаТЧ.ВашРЕквизит Тогда // ВашРеквизит  = Истина
         МассивУдаляемых.Добавить(МассивУдаляемых);
   КонецЕсли;
КонецЦикла;

Для Каждого Элемент Из МассивУдаляемых Цикл
      ВашаТЧ .Удалить(Элемент);
КонецЦикла;

Автор: Gigi 16.11.17, 15:41

Bernet @ Сегодня, 15:32 * ,
Спасибо всем уважаемые
Т.е как понимается из примеров нужно обозначенное загонять в массив а уже после удалять
Ладно! Правда как работает нужно еще проверить. Ладно позже проверю и если че продолжу тему.
Пока все..
Спасибо!

Автор: Vofka 16.11.17, 16:09

Цитата
не все удаляет .. пропускает не удалив

Это частый вопрос. Расписывать в очередной раз лень, поэтому скопирую что уже написали в другом месте:

Цитата
Строки табличной части или таблицы значений необходимо удалять с конца. То биш обход надо делать не с начала, а с конца. Так как при удалении строки при обоходе с начала ТЧ индексы строк идущие за удаляемой , меняют индекс в таблице и уже не соответствуют индексам изначальной ТЧ, когда мы осуществляли поиск удаляемых строк. Для наглядности возьми ТЧ из 4 строк и удали 2-ую и 3-ю строчки и посмотри что происходит с индексами.
Пример как надо:
Для е = 0 по КоличествоСтрокТЗ - 1 Цикл
    Если (Условие верно) Тогда
              ТЗ.Удалить(КоличествоСтрокТЗ - 1 - е);
    КонецЕсли;
КонецЦикла;

Автор: Gigi 17.11.17, 11:00

Vofka @ Вчера, 16:09 * ,

Цитата(Vofka @ 16.11.17, 16:09) *
Пример как надо:

Спасибо ... понял ...
Вот оно что ... ясно. А то думал .. че за..
Но относительно других решений думаю менее простых .. первый вариант рабочий
А второй че то выдавал ошибку:
МассивУдаляемых = Новый Массив;
Для Каждого Строка Из Объект.ТабличнаяЧасть1 Цикл
    Если Строка.Реквизит2=Истина Тогда
         ТекСтрокаИдент=Строка.ПолучитьИдентификатор();
         МассивУдаляемых.Добавить(МассивУдаляемых);
   КонецЕсли;
КонецЦикла;
//---------------------------------------------------
Для Каждого Элемент Из МассивУдаляемых Цикл
      Объект.ТабличнаяЧасть1.Удалить(Элемент); // Ошибку выдавало на этой линии.
КонецЦикла;


Поэтому так был сбой...
Но сработало без сбоя только так:
МассивУдаляемых = Новый Массив;
Для Каждого Строка Из Объект.ТабличнаяЧасть1 Цикл
    Если Строка.Реквизит2=Истина Тогда
         ТекСтрокаИдент=Строка.ПолучитьИдентификатор();
         МассивУдаляемых.Добавить(ТекСтрокаИдент);
   КонецЕсли;
КонецЦикла;
//---------------------------------------------------
Для Каждого Элемент Из МассивУдаляемых Цикл
    Строка = Объект.ТабличнаяЧасть1.НайтиПоИдентификатору(Элемент);
    Объект.ТабличнаяЧасть1.Удалить(Строка);
КонецЦикла;

Ладно! Всем спасибо!








Автор: Alex_Ticho 21.11.17, 14:14

Gigi @ 17.11.17, 11:00 * ,

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

Может и долго, но надежно. icon_beer17.gif

 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 9
 

Автор: Petre 21.11.17, 14:25

Alex_Ticho @ Сегодня, 14:14 * ,
faceoff.gif
Не увидел "перейти"...

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua