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

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

Как быть?
Может в таком случае нужно удалять по идентификатору?
И как это сделать?
Буду признателен!
Petre
Gigi @ Сегодня, 16:27 необходимо зарегистрироваться для просмотра ссылки ,
МассивНайденныхСтрок = Объект.ТабличнаяЧасть1.НайтиСтроки(Новый Структура("Реквизит2", Ложь));
Для Каждого ТекНайденнаяСтрока Из МассивНайденныхСтрок Цикл
    Объект.ТабличнаяЧасть1.Удалить(ТекНайденнаяСтрока);
КонецЦикла;
Bernet
Gigi @ Сегодня, 15:27 необходимо зарегистрироваться для просмотра ссылки ,
МассивУдаляемых = Новый Массив;

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

Для Каждого Элемент Из МассивУдаляемых Цикл
      ВашаТЧ .Удалить(Элемент);
КонецЦикла;
Gigi
Bernet @ Сегодня, 15:32 необходимо зарегистрироваться для просмотра ссылки ,
Спасибо всем уважаемые
Т.е как понимается из примеров нужно обозначенное загонять в массив а уже после удалять
Ладно! Правда как работает нужно еще проверить. Ладно позже проверю и если че продолжу тему.
Пока все..
Спасибо!
Vofka
Цитата
не все удаляет .. пропускает не удалив

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

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

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


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

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







Alex_Ticho
Gigi @ 17.11.17, 11:00 необходимо зарегистрироваться для просмотра ссылки ,

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

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

 ! 

необходимо зарегистрироваться для просмотра ссылки: 9
 
Petre
Alex_Ticho @ Сегодня, 14:14 необходимо зарегистрироваться для просмотра ссылки ,
faceoff.gif
Не увидел "перейти"...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.