табличное поле

1. user595393_leoshko84 24.05.17 11:53 Сейчас в теме
Коллеги, есть табличное поле СвойстваИЗначения.
Как по этому объекту перебрать строки и удалить по условию.
+
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. tjurikov_ivan 213 24.05.17 12:01 Сейчас в теме
В самом простом варианте как-то так.
Сч = 0;
Для каждого Стр Из СвойстваИЗначения Цикл
Если Стр.Реквизит <> "Значение" Тогда
СвойстваИЗначения.Удалить(Сч);
КонецЕсли;
Сч = Сч+1;
КонецЦикла;
Показать
+
3. eksetro 6 24.05.17 12:14 Сейчас в теме
(2) А разве индексы при таком варианте не съезжают и не будут пропускаться строки?
Xershi; klinval; ResetAtreides; +3
6. Alex_E 2353 24.05.17 12:26 Сейчас в теме
Вариант из (2) не пройдет - нельзя удалять записи из итератора цикла. Вариантов несколько, например - обход и удаление таблицы с "конца", как то так:
КолСтрок = ВашаТЗ.Количество();
Сч = 0;
Для а = 1 По КолСтрок Цикл
     Стр  = ВашаТЗ.Получить(КолСтрок - Сч);
     Если <Ваше условие> Тогда
         ВашаТЗ.Удалить(КолСтрок - Сч);
     КонецЕсли;
     Сч = Сч + 1;
КонецЦикла; 
Показать
+
4. herfis 498 24.05.17 12:16 Сейчас в теме
Никак. Манипуляции с данными производятся не над интерфейсными элементами, а над источниками данных, которые они отображают.
Методика зависит от вида источника.
+
5. olenka-ul 3 24.05.17 12:17 Сейчас в теме
Скорее всего табличное поле отображает таблицу значений. Эту таблицу нужно циклом проходить с конца (!).
+
7. herfis 498 24.05.17 12:57 Сейчас в теме
Если на то пошло, то самый изящный способ обходить коллекции с конца еще в 7.7 изобрели:
Для ОтрицательныйИндекс = -ВсегоСтрок + 1 По 0 Цикл
     Коллекция.Удалить(-ОтрицательныйИндекс);
КонецЦикла;

Но на 8-ке я предпочитаю удалять в два этапа - сначала набор массива ссылок на удаляемые строки, а затем их удаление обходом этого массива. Но это уже больше вопросы вкуса и стиля.
alex-l19041; +1
8. Mafoni 24.05.17 13:20 Сейчас в теме
Удалять лучше с обходом по индексу от максимального к минимальному
ибо при удаление в два цикла ( через массив ) при входных данных есть 1000 строк нужно удалить 900 по сути цикл прогоняется два раза , поэтому лучше в один проход по индексу да еще и цикл написать в одну строку ( проверено цикл в три строки работает дольше чем цикл в одну строку)
+
10. herfis 498 25.05.17 12:02 Сейчас в теме
(8) Я вас умоляю. Время выполнения холостого цикла он считает. Оптимизирует скорость за счет размещения команд в одной строке. Давайте еще скорость арифметики 1С вспомним и методы ее оптимизации. Первое же обращение к БД похоронит все ваши оптимизации в десятые доли процента общей производительности. Не говоря уже о том, что удаляется как правило меньшее количество строк, а не большее.
На типовых задачах 1С гораздо больше толку будет, если вы потратите усилия на повышение читабельности и сопровождаемости кода. А двойной обход - очень гибок в этом плане и хорошо читается. Причем в простейших случаях даже двойной обход не нужен:

Для Каждого УдаляемаяСтрока Из Таблица.НайтиСтроки(Новый Структура("Количество", 0)) Цикл
     Таблица.Удалить(УдаляемаяСтрока);
КонецЦикла;


ЗЫ. В плюс двойного обхода - первый обход почти всегда нужен для чего-то еще. И бывает так, что при этом желательно обходить в прямом порядке, а не в обратном.
+
9. fromtomike 48 24.05.17 17:31 Сейчас в теме
Сч = 0;
Пока Сч < СвойстваИЗначения.Количество() Цикл
    СтрокаТаблицы = СвойстваИЗначения[Сч];
    Если <Ваше условие> Тогда
         СвойстваИЗначения.Удалить(СтрокаТаблицы);
    Иначе
         Сч = Сч + 1;
    КонецЕсли;
КонецЦикла;
Показать
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот