Имя: Пароль:
1C
1С v8
Напомните алгоритм обхода и удаления строк в ТЗ
,
0 Тонкий Клиент
 
28.07.14
08:39
Напомните алгоритм обхода и удаления строк в ТЗ
1 Cube
 
28.07.14
08:41
300 руб.
2 rasswet
 
28.07.14
08:41
либо от последней строки к первой и удаляешь,
либо при обычном обходе бросаешь строки в массив, потом его обходишь и удаляешь.
3 Фокусник
 
28.07.14
08:41
(0)
1. Поместить в массив при первом обходе. Перебирать массив, удалять строки
2. Обход с конца: для сч = -ТЗ.Количество() по -1 Цикл
...
4 Hans
 
28.07.14
08:42
Проходишь ТЗ - скидываешь в массив.
Проходишь массив -  удаляешь.
5 zva
 
28.07.14
08:42
удалять с конца
6 zak555
 
28.07.14
08:42
(3) (4) зачем вам массив :?
7 Тонкий Клиент
 
28.07.14
08:44
вот где-то накопал такой алгоритм, как думаете, он рабочий?

НомСтроки = 1;    
Пока НомСтроки <= Таб.КоличествоСтрок() Цикл
Таб.ПолучитьСтрокуПоНомеру(НомСтроки);
Если ....... Тогда
Таб.УдалитьСтроку();
Продолжить;
КонецЕсли;
НомСтроки = НомСтроки + 1;
КонецЦикла;
8 Hans
 
28.07.14
08:45
(6) я никогда не помню с чего начинаются элементы в 1С - с нуля или с единицы. Помоему некоторые начинаются с нуля, некоторые с единицы.
9 Asmody
 
28.07.14
08:47
(7) это для 7.7
10 Coldboy
 
28.07.14
08:49
(0) Индекс = ТЗ.Количество()-1;
Пока Индекс>-1 Цикл
Строка = ТЗ.Получить(Индекс);
//действие строки
ТЗ.Удалить(Индекс);
Индекс= Индекс-1;
КонецЦикла;
11 tdm
 
28.07.14
08:49
(6) потому что мы бежим по коллекции значений которую еще и удаляем)) - например (7) вы позиционируетесь на 3 строке по условию её удаляете и переходите к 4 строке! т.е. пропускаете строку которая раньше была 4 а стала 3)...а массивом строк к удалению железобетонно не пролетите лишних
12 zak555
 
28.07.14
08:52
(8) купи записную книгу

(9) для 8ки не пойдёт ?

(11) так глупо использовать массив -- лишнее действие
проще сразу пройтись с конца
13 Serg_1960
 
28.07.14
08:52
(0) "Напомните алгоритм" - напоминаю :) главная страница форума, кнопка "Поиск" - строка "Удаление строк из табличной части". Успехов!
14 Фокусник
 
28.07.14
08:52
(6) ИМХО, иногда через массив нагляднее, иногда просто удобнее, иногда нужно много разных алгоритмов отбора выполнить, а результат всех отборов запомнить в одном массиве и только потом удалять. Иногда нужно не удалять, а как-либо обработать эти строки. И т.д. и т.п. :)
Иногда массив - это результат НайтиСтроки :)
15 temsa
 
28.07.14
08:54
зачем обходить убейте сразу все ТЗ ))
16 zak555
 
28.07.14
08:54
(14) тогда проще запросом обратиться к тз
17 tdm
 
28.07.14
09:03
(16) есть платформенный метод - НайтиСтроки() работает быстро и полученный массив удалить...а так проще изначально ТЗ получать уже готовую запросом
18 Kyon8
 
28.07.14
09:04
(12) В 8-ке обычно через итераторы обход, индекс ненагядно, тем более в обратном порядке 1С не поддерживает нормальный синтаксис обхода. Через массив более простой и понятный код и не нужно помнить про обратный порядок и т.д..
19 zak555
 
28.07.14
09:18
(18) да ну ? где не наглядно ?

кол = ТЗ.Количество() - 1;

Для н = - кол по 0 Цикл
   текСтр = ТЗ[-н];
КонецЦикла;
20 Холодильник
 
28.07.14
09:20
удалять с конца?
перебирать по индексу? тогда при удалении ваши индексы поплывут
21 Полотенчик
 
28.07.14
09:24
А если внутри цикла могут добавлятся строки?
22 ArgonPrime
 
28.07.14
09:31
(7) Этот алгоритм будет работать неправильно.

Правильно вот так:

КолвоСтрок = ТЗ.КоличествоСтрок();
НомСтр = 1;

Пока НомСтр <= КолвоСтрок Цикл

    ТЗ.ПолучитьСтрокуПоНомеру(НомСтр);

    Если <УсловиеУдаления> Тогда
        ТЗ.УдалитьСтроку();
        КолвоСтрок = КолвоСтрок - 1;
        НомСтр = НомСтр - 1;
    КонецЕсли;

    НомСтр = НомСтр + 1;

КонецЦикла;
23 ArgonPrime
 
28.07.14
09:34
Вот меня всегда удивляло, почему именно эта простейшая задача и именно почему-то для 1с-ников становится камнем преткновения и изобретается наибольшее количество велосипедов с костылями ;-)
24 ArgonPrime
 
28.07.14
09:39
+22 Хотя нет, прошу прощения, алгоритм в (7) в принципе аналогичен в (22) - быстро проглядев не заметил Продолжить;

(9) Человек же просил алгоритм, а не готовый код, я думаю перевод с 7.7 на 8 проблем-то не должен представлять.
25 PLUT
 
28.07.14
09:40
(19) вместо этого г.внокода есть специальная команда Очистить()
26 ArgonPrime
 
28.07.14
09:42
Присоединяюсь к (6). Зачем массив-то ?;-)
27 zak555
 
28.07.14
09:42
(25)

1. с чего это ковнокод ?
2. Очистить -- удаляет ВСЕ строки из ТЗ, а в 0 нужно по условию
28 ArgonPrime
 
28.07.14
09:45
(27) А где в (19) ты видишь удаление по условию ?;-)
29 ArgonPrime
 
28.07.14
09:46
+28 Поэтому согласен с (25).
30 zak555
 
28.07.14
09:46
(28) читай контекст
31 ИС-2
 
naïve
28.07.14
09:48
(22) не люблю алгоритмы удаления. Предпочитаю добавить колонку "УдалитьСтроку", заполнить где надо в Истину и заново создать таблицу оставив строки которые не надо удалять
32 PLUT
 
28.07.14
09:48
(27) конечно г.внокод)) обход коллекции для Каждого - не г.внокод

а если по условию - то запросом или НайтиСтроки() и удалить строки из массива
33 zak555
 
28.07.14
09:49
(32) много лишних действий
34 ArgonPrime
 
28.07.14
09:50
(30) Я не думаю, что ТС не знает как полностью очистить ТЗ и спрашивает про специальный алгоритм для этого, тем более в (7) он уточнил, что ему требуется именно удаление по условию.
35 tdm
 
28.07.14
09:50
(33) платформенный метод думаете работает быстрее цикла ?))
36 zak555
 
28.07.14
09:53
(34) и ?
обходим с конца и удаляем, то что подходит по условию

(35) не знаю, что быстрее работает
нужно замерять
37 ArgonPrime
 
28.07.14
09:55
(31) Представляю что будет, если с таким подходом писать ту же Windows или платформу 1C ;-)
38 ArgonPrime
 
28.07.14
09:57
(36) А зачем обходить с конца, когда можно и с начала ?
39 f_vadim
 
28.07.14
10:02
я вот так удаляю

Индекс = 0;
Пока Индекс < ТЗ.Количество() Цикл
    СтрокаТЗ = ТЗ.Получить(Индекс);
    Если СтрокаТЗ.Сумма = 0 Тогда
        ИндексСтроки = ТЗ.Индекс(СтрокаТЗ);
        ТЗ.Удалить(ИндексСтроки);
    Иначе
        Индекс = Индекс + 1;
    КонецЕсли;
КонецЦикла;

понравилась идея ИС-2 из (31), может тоже так буду делать
40 f_vadim
 
28.07.14
10:04
кстати в (22), кмк, некорректно условие

КолвоСтрок = ТЗ.КоличествоСтрок();
Пока НомСтр <= КолвоСтрок Цикл

строки в цикле удаляются, количество строк уменьшается
41 Лодырь
 
28.07.14
10:04
(38) Можете привести пример кода?
42 Эмбеддер
 
28.07.14
10:05
(38) если удалять с конца, можно пользоваться нормальным циклом "для i=..."
если удалять с начала, то только "пока ... цикл"

и теоретически еще 1-й вариант для больших таблиц, когда удаляешь большую часть данных будет работать быстрее)))
43 f_vadim
 
28.07.14
10:05
к (40). всё ок, не увидел

КолвоСтрок = КолвоСтрок - 1;
44 Эмбеддер
 
28.07.14
10:06
(39) вместо
ИндексСтроки = ТЗ.Индекс(СтрокаТЗ);
ТЗ.Удалить(ИндексСтроки);
лучше сразу
ТЗ.Удалить(СтрокаТЗ);
45 Timon1405
 
28.07.14
10:07
(39),(40) наоборот, считать ТЗ.количество() при каждой итерации, это не по фэн-шую
46 ArgonPrime
 
28.07.14
10:10
(0) Вообще если есть трудности с пониманием "замороченных" алгоритмов, то самый простой для понимания метод - это создать новую ТЗ, скопировать туда только нужные строки, а старую удалить.
Но это КодКоторыйНеприятноПахнет ;-)
47 f_vadim
 
28.07.14
10:14
(44)(45) ага, тоже верно.
48 ArgonPrime
 
28.07.14
10:16
(39) Твой код аналогиче коду в (7), а вот использовать идею из (31) на мой взгля вряд ли стоит.
49 Coldboy
 
28.07.14
10:17
народ, а чем (10) плох, почему тему так раздули?
50 Эмбеддер
 
28.07.14
10:20
(49) "индекс>-1" все-же лучше заменить на "индекс>=0", а то совсем коряво выглядит
51 Тонкий Клиент
 
28.07.14
10:27
(49)
я кстати сделал почти как в (10) код действительно работает, хотя и не полностью пригоден для копипасты. В итоге у меня так получилось

Индекс = таблном.Количество()-1;
Пока Индекс>-1 Цикл
Строка = таблном.Получить(Индекс);
Если  таблном[Индекс].КоличествоУпаковок=0 тогда
таблном.Удалить(Индекс);
КонецЕсли;
Индекс= Индекс-1;
КонецЦикла;
52 Полотенчик
 
28.07.14
10:32
(45) а он и не будет считать каждый раз. после первого раза закеширует и будет использовать это значение
53 f_vadim
 
28.07.14
10:38
(52) не-а, не кэширует
54 Timon1405
 
28.07.14
10:42
(52) откуда дровишки?
http://savepic.org/5839143.jpg
55 zak555
 
28.07.14
10:49
(54) зачем количество в цикле ?
56 Полотенчик
 
28.07.14
10:53
сделай таблицу из 3 строк
сделай Для НомерСтроки = 1 по Таблица.Количество() Цикл
в цикле добавь, например, 10 строк
посмотри сколько раз сработает цикл
57 Timon1405
 
28.07.14
10:53
(55) так там 2 цикла, как раз для сравнения.
кстати, я делаю так же как в (19)
58 acsent
 
28.07.14
10:53
Это вообще мелочи как удалять: с конца или через массив. Не там вы прикладываете силы для оптимизации
59 Timon1405
 
28.07.14
11:15
(56) Проверил, цикл "Для ..Цикл" действительно выполняется Таблица.Количество() раз. Но если использовать "Пока цикл"(с добавлением 10 строк), с инкрементом НомерСтроки в конце цикла(а тут в примерах таких циклов большинство), то вылетает в бесконечность.
60 ИС-2
 
naïve
28.07.14
12:23
(41) если большой объем данных, то циклы противопоказаны. В этом случае лучше использовать запросы для фильтрации таблицы
(46) а что плохого в копировании туда-сюда? Отлаживается горазло проще, чем удаление строк.
61 Torquader
 
28.07.14
12:24
А что - разве в восьмёрке коллекция теряется, если из неё строки удалять ?
62 ИС-2
 
naïve
28.07.14
12:25
можно выделить 3 варианты удаления ненужных строк:
1) Цикл с удалением строк
2) Цикл с установкой признака "Удалять" и копированием таблицы
3) Фильтрация в запросе

какой их способов нравиться больше и почему?
63 Полотенчик
 
28.07.14
13:23
(62) 3) - таблицу надо записать в ВТ? нафиг тормзной ХДД дергать если можно все сделать в оперативке?
64 ИС-2
 
naïve
28.07.14
13:40
ВТ на жесткий диск что ли кэшируются?
65 Полотенчик
 
28.07.14
13:47
(64) конечно, в tempdb
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн