|
Напомните алгоритм обхода и удаления строк в ТЗ | ☑ | ||
---|---|---|---|---|
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
|
я вот так удаляю
понравилась идея ИС-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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |