Имя: Пароль:
1C
1С v8
8.2 Цикл, удалить строку
,
0 polkin
 
16.01.13
21:20
Зависает, ставлю добавить строку - работает


Для Каждого Строка Из Объект.ТаблицаЗаказа Цикл
       Если Строка.ИспользоватьХарактеристики = ИСТИНА
           И НЕ ЗначениеЗаполнено (Строка.Характеристика)
            Тогда Строка = Объект.ТаблицаЗаказа.Удалить();
       КонецЕсли;
КонецЦикла;
1 Jstunner
 
16.01.13
21:21
перебирай с конца таблицы
2 Займись делом
 
16.01.13
21:26
Удалять в цикле "Для Каждого Строка Из Объект.ТаблицаЗаказа Цикл" строку из таблицы плохая идея.
3 Prikum
 
16.01.13
21:27
(2) +1, надо собирать индекс строк, а потом уже удалять.
4 zmaximka
 
16.01.13
21:31
+(2) очень плохая идея
5 polkin
 
16.01.13
21:32
(1)(3) как?
6 Рассвет
 
16.01.13
21:33
Не обязательно собирать, можно удалять с конца:

Оставить = 100;

Пока Коллекция.Количество() > Оставить цикл
  Коллекция.Удалить(Коллекция.Количество() - 1);
КонецЦикла;
7 zak555
 
16.01.13
21:34
условие никогда не будет истиным
8 Рассвет
 
16.01.13
21:34
Да?
9 zak555
 
16.01.13
21:35
в (7) ошибся -- плохо вишу
10 DozaT
 
16.01.13
21:40
можно идти от обратного найти те строки ТЧ, которые не нужно удалять соохранить их в ТЗ и потом загрузить в ТЧ
11 DozaT
 
16.01.13
21:45
ТЗ = Объект.ТаблицаЗаказа.Выгрузить();
ТЗ.Очистить();

Для Каждого Строка Из Объект.ТаблицаЗаказа Цикл
       Если НЕ (Строка.ИспользоватьХарактеристики = ИСТИНА
           И НЕ ЗначениеЗаполнено (Строка.Характеристика))

            Тогда
                СтрТЗ = ТЗ.Добавить();

               ЗаполнитьЗначенияСвойств(СтрТЗ,Строка);
       КонецЕсли;
КонецЦикла;
Если ТЗ.Количество()>0 тогда
Объект.ТаблицаЗаказа.Загрузить(ТЗ);
конецесли
12 H A D G E H O G s
 
16.01.13
21:46
(11) Плохо
13 H A D G E H O G s
 
16.01.13
21:47
МассивСтрокНаУдаление=Таблица.НайтиСтроки(СтруктураПоиска);

Для Каждого СтрокаТаблицы Из МассивСтрокНаУдаление Цикл
Таблица.Удалить(СтрокаТаблицы);
КонецЦикла;
14 DozaT
 
16.01.13
21:48
Интересно посмотреть на структуру поиска?
15 zak555
 
16.01.13
21:48
колТаблицаЗаказа = ТаблицаЗаказа.Количество();
Для н = -колТаблицаЗаказа по -1 Цикл
 СтрокаТЗ = ТаблицаЗаказа.Получить(-н);
  Если СтрокаТЗ.ИспользоватьХарактеристики = ИСТИНА
           И НЕ ЗначениеЗаполнено (СтрокаТЗ.Характеристика)
            ТаблицаЗаказа.Удалить(-н); //или ТаблицаЗаказа.Удалить(СтрокаТЗ);
  КонецЕсли;
КонецЦикла;
16 H A D G E H O G s
 
16.01.13
21:48
МассивСтрокНаУдаление можно сформировать циклом, если нет четких условий на НайтиСтроки()

Индексы-хуиндексы - источник ошибок.
Копирование ТЗ - потенциальная ловушка по памяти
17 H A D G E H O G s
 
16.01.13
21:51
"Копирование ТЗ - потенциальная ловушка по памяти"

Неголословное утверждение.
Отчет, формирующийся несколько часов, валился по памяти, именно из за этого.
18 DozaT
 
16.01.13
21:52
тогда Запросом, получить правильные строки и выгрузить сразу в ТЧ
19 H A D G E H O G s
 
16.01.13
21:52
(18) Это если объект в базе. А если это тупо ТЗ, уже сформированная?
20 zak555
 
16.01.13
21:53
(16) > Индексы-хуиндексы - источник ошибок

это где ?
21 ДенисЧ
 
16.01.13
21:55
(19) запрос к ТЗ - православно, кошерно и халяльно.
22 H A D G E H O G s
 
16.01.13
21:59
(21) Невстречались ТЗ-шки под сотню мегабайт?
23 mxs089
 
16.01.13
22:00
Количество = Таблица.Количество();

Для НомерСтроки = 1 по Количество Цикл

   Строка = Таблица[Количество - НомерСтроки];
   
   Если НужноУдалить Тогда
       Таблица.Удалить(Строка);
   КонецЕсли;

КонецЦикла;
24 ДенисЧ
 
16.01.13
22:01
(22) нет. Я такие формирую во временных таблицах. Сервер он железный, у него на дисках места много, а память ограничена.
25 zak555
 
16.01.13
22:37
(23) ты проверял работу ?
индекс за пределы не выйдет ?
26 polkin
 
16.01.13
22:48
(23) Спасибо, помогло
27 polkin
 
16.01.13
22:50
(18) Мог бы - не мучился. А так после запроса удаляю лишние строки.
28 Ayne
 
16.01.13
23:35
(23)

Таблица[Количество - НомерСтроки];


Петросянщина какая-то. Поясни логику?
29 Ayne
 
16.01.13
23:47
Все понел, шпасибо.
30 Рассвет
 
17.01.13
18:18
(11) это аналог collect в groovy.

def tz2 = tz1.collect { isGood(it) }

Тоже способ.

Насчет плохо, в розетке тоже смертельное напряжение, но ничего живем.
31 Живой Ископаемый
 
17.01.13
18:20
2(0) Это тест чтобы определить дебилов?
32 EvgeniuXP
 
17.01.13
18:24
(0) с конца удалять не умеем, просто обходим циклом строки, добавляем в массив удаляемые строки, затем выходим из перебора строк и перебираем массив и от туда берем строку и удаляем.
33 ul_tim
 
17.01.13
18:30
Массив = Новый Массив;
       
       Для Каждого Строка Из Объект.ТаблицаЗаказа Цикл
           Если Строка.ИспользоватьХарактеристики = ИСТИНА
               И НЕ ЗначениеЗаполнено (Строка.Характеристика)
               Тогда Массив.Добавить(Строка);
           КонецЕсли;
       КонецЦикла;
       
       Для каждого Стр из Массив Цикл
           Объект.ТаблицаЗаказа.Удалить(Стр);
       КонецЦикла;