|
v7: как правильно убрать строки из ТЗ | ☑ | ||
---|---|---|---|---|
0
vitalka
16.11.12
✎
19:14
|
надо удалить из таблицы значений строки с количеством = 0
делаю так Таб.ВыбратьСтроки(); Пока Таб.ПолучитьСтроку()=1 Цикл Если Число(Таб.Количество)=0 Тогда Таб.УдалитьСтроку(); КонецЕсли; КонецЦикла; удаляет не все как сделать правильно? |
|||
1
vitalka
16.11.12
✎
19:17
|
кроме как переписывать в другую таблицу не нулевые строчки ничего на ум не приходит
|
|||
2
Надсмотрщик
16.11.12
✎
19:18
|
КосСтрок = ТЗ.КоличествоСтрок;
Для Сч = -КосСтрок по -1 Цикл .................... |
|||
3
Mikeware
16.11.12
✎
19:20
|
"шо, опять?"©
|
|||
4
zladenuw
16.11.12
✎
19:21
|
Пока к=1 Цикл
Стр=""; Если Тб.НайтиЗначение(0,Стр,"Количество")=1 Тогда ТБ.УдалитьСтроку(Стр); Иначе Прервать; КонецЕсли; КонецЦикла; |
|||
5
vitalka
16.11.12
✎
19:21
|
спасибо, понял
|
|||
6
Надсмотрщик
16.11.12
✎
19:23
|
(4) Гланды через )|(опу
|
|||
7
zladenuw
16.11.12
✎
19:25
|
(6)
а так тоже через это место ? Стр=""; Пока Тб.НайтиЗначение(0,Стр,"Количество")=1 Цикл ТБ.УдалитьСтроку(Стр); КонецЦикла; |
|||
8
Надсмотрщик
16.11.12
✎
19:28
|
(7) И сколько раз ты будешь ИСКАТЬ в таблице? До втого пришествия? Если ПЕРВАЯ ТЫСЯЧА СТРОК не равна 0?
|
|||
9
Скользящий
16.11.12
✎
19:30
|
||||
10
zladenuw
16.11.12
✎
19:31
|
(8) проверил. меньше секунды!
|
|||
11
vitalka
16.11.12
✎
19:32
|
(8)Сортировать по количеству
|
|||
12
Скользящий
16.11.12
✎
19:32
|
(7) ты не кодер а гландожёповыдератель.
|
|||
13
zladenuw
16.11.12
✎
19:32
|
(7) главное что удаляет. а как ТС удобно это его дело
|
|||
14
zladenuw
16.11.12
✎
19:33
|
(12) ну обоснуй чем плохой этот вариант ?
|
|||
15
Надсмотрщик
16.11.12
✎
19:34
|
(10) САмое быстрое ПЕРЕБОР ОДИН РАЗ!
|
|||
16
Надсмотрщик
16.11.12
✎
19:36
|
(9) Стас был еще молод!
|
|||
17
zladenuw
16.11.12
✎
19:36
|
(15) не спорю. но ведь можно и так.
|
|||
18
Надсмотрщик
16.11.12
✎
19:38
|
(17) Мжно и Гланды через )|(опу. Сложно, но можно!
|
|||
19
zladenuw
16.11.12
✎
19:40
|
(18) ювелирно зато :). это же надо уметь :)
|
|||
20
ADirks
16.11.12
✎
20:06
|
(19) Как-то с год назад разбирали с товарищем один кусок кода, что достался нам в наследство. Там чё-то колбасилось с двумя списками, и чем-то там ещё. Всего кода было строчек 20, мы его курили около часа, и в итоге поняли, что оно _не_делает_ничего_ !!!1111блеать Т.е. эти списки в процессе как-то там модифицировались, но в итоге всё оказывалось в исходном состоянии.
Вот это да, надо уметь... Поубивал бы |
|||
21
Надсмотрщик
16.11.12
✎
20:17
|
(20) При всех возможных условиях?
|
|||
22
АЛьФ
16.11.12
✎
20:20
|
2(14) тем, что он не будет работать.
|
|||
23
ADirks
16.11.12
✎
20:22
|
(21) да
|
|||
24
Junior1s
16.11.12
✎
20:37
|
20 строчек, в клюшках, около часа, жесть. наверно с начало курили, а потом смотрели, сквозь строчки кода :)
|
|||
25
ADirks
16.11.12
✎
20:46
|
(24) ну типа того
очень, знаешь, хотелось поглядеть на автора |
|||
26
VladZ
16.11.12
✎
20:49
|
(0) Одно из решений проблем - не создавать себе проблемы.
Исходная таблица как получается? Фильтруй на начальном этапе. |
|||
27
Надсмотрщик
16.11.12
✎
20:50
|
(25) В зеркало? ;-)
|
|||
28
oslokot
16.11.12
✎
20:51
|
Мой быдлокод, юзаю по привычке с дедства:
Таб.ВыбратьСтроки(); Пока Таб.ПолучитьСтроку()=1 Цикл Если Число(Таб.Количество)=0 Тогда Таб.УдалитьСтроку(); Таб.ВыбратьСтроки(); КонецЕсли; КонецЦикла; Не ругайте! сам знаю... :) |
|||
29
VladZ
16.11.12
✎
20:55
|
ИМХО, лучше использовать индексированную таблицу, УстановитьФильтр и т.д.
|
|||
30
Надсмотрщик
16.11.12
✎
20:58
|
(29) Лучше МОЗГАМИ шевелить, если они есть!
|
|||
31
Ork
16.11.12
✎
21:00
|
(28) Дарю. Перебирать нужно с конца в начало. Удаляя по ходу то, что нужно. Все далается за один проход.
|
|||
32
ADirks
16.11.12
✎
21:00
|
(29) Из пушки по воробьям. Иной раз надо быть проще.
там затраты на построение индекса будут маманегорюй |
|||
33
AlexNew
16.11.12
✎
21:09
|
После этого реализация метода пузырька тянет на докторскую.
|
|||
34
AlexNew
16.11.12
✎
21:09
|
к (33) вменяемая.
|
|||
35
VladZ
16.11.12
✎
21:09
|
(32) Э... Какие затраты?
|
|||
36
ADirks
16.11.12
✎
21:26
|
(35) Ну какие... памяти и процессора
При маленькой табличке основные затраты будут на перекачивание ТЗ в ИТ. При большой - перекачивание, и построение собственно индекса (селективность которого оч. вероятно будет фиговой). При удалении строк по фильтру индекс тоже будет перестраиваться. В общем, тупо перебрать строки в обратном порядке скорее всего будет эффективнее, чем юзать ИТ. А кода на 3 строчки больше. |
|||
37
AlexNew
16.11.12
✎
21:32
|
(36) Разбирать смысла нет. Книжки видимо были правильные, но практического опыта видимо маловато. "Какое количество оперативной памяти занимает ваша программа?" (c)
|
|||
38
andrewalexk
16.11.12
✎
21:32
|
:)
я использую: ТЗ.ВыбратьСтроки(); ПС=ТЗ.ПолучитьСТроку(); Пока ПС=1 Цикл Если **** Тогда ТЗ.УдалитьСтроку(); Если ТЗ.НомерСтроки=0 Тогда Прервать; КонецЕсли; Иначе ПС=ТЗ.ПолучитьСТроку(); КонецЕсли; КонецЦикла; |
|||
39
Feunoir
16.11.12
✎
21:34
|
Я, уже подзабыл семерку, конечно, но как бы в типовых сделано так:
НомерСтроки = ТаблицаЗначений.КоличествоСтрок(); Пока НомерСтроки<>0 Цикл ТаблицаЗначений.ПолучитьСтрокуПоНомеру(НомерСтроки); Если ТаблицаЗначений.Количество=0 Тогда ТаблицаЗначений.УдалитьСтроку(НомерСтроки); КонецЕсли; НомерСтроки = НомерСтроки - 1; КонецЦикла; |
|||
40
AlexNew
16.11.12
✎
21:41
|
(38), (39) не можете пьяными программировать - просто пейте.
|
|||
41
AlexNew
16.11.12
✎
21:47
|
Стоп, (39) рабочий.
|
|||
42
Надсмотрщик
16.11.12
✎
21:48
|
(39) Видать Ленина читают - "Шаг вперед два шага назад"!
|
|||
43
AlexNew
16.11.12
✎
21:51
|
(42) Да нет, даже при больших таблицах едва ли не лучший способ.
|
|||
44
Mikeware
16.11.12
✎
21:51
|
(37) повеселил...
|
|||
45
ADirks
16.11.12
✎
21:53
|
кароче :)
н = тз.КоличествоСтрок(); Пока н > 0 Цикл Если тз.ПолучитьЗначение(н, "Количество") = 0 Тогда тз.УдалитьСтроку(н); КонецЕсли; н = н - 1; КонецЦикла; |
|||
46
Mikeware
16.11.12
✎
21:56
|
(45) в общем случае завсит и от того, сколько "нулей"...
может, выгоднее создать новую ТЗ и скопировать туда 1 строку (варианты - отсортировать, и уменьшить количество строк, и т.п.), а может - удалить единственную строку с нулем... |
|||
47
AlexNew
16.11.12
✎
21:57
|
(44) Долгая история. Вопрос (я там курс помогал ставить по БД год 95) от замдекана, типа программистки.
|
|||
48
Mikeware
16.11.12
✎
21:59
|
(47) повеселил тем, что сказал, что у Диркса мало опыта....
|
|||
49
Mikeware
16.11.12
✎
22:01
|
а о смешных вопросах...
одна, гкхм, учителка информатики, в далеком 1989, задала вопрос: "я тут решила научиться порграммировать. посоветуйте, как лучше программировать - в кодах, или в ASCII????" на всю жисть запомнил... |
|||
50
Надсмотрщик
16.11.12
✎
22:03
|
(46) Тебе по секрету сообщили "сколько "нулей"..."?
|
|||
51
AlexNew
16.11.12
✎
22:03
|
(48) Тогда много. В свое время Чистов, принимая у меня очередной экзамен по сертификату "Если много кода, то либо человек ничего не знает, либо знает слишком много".
|
|||
52
Mikeware
16.11.12
✎
22:04
|
(50) Нет, но обычно отношение оставить/удалить - ожидаемо...
|
|||
53
AlexNew
16.11.12
✎
22:05
|
(48) Избыточность в конкретных задачах бывает не менее вредна, чем недостаточность. А опыта в конкретных проектах мало, потому что сервак стоит дешевле программиста.
|
|||
54
AlexNew
16.11.12
✎
22:06
|
к (53) обычно.
|
|||
55
Надсмотрщик
16.11.12
✎
22:07
|
(52) Количество черных кошек в темной комнате :-)
|
|||
56
AlexNew
16.11.12
✎
22:08
|
(55) А монетка на что?
|
|||
57
AlexNew
16.11.12
✎
22:08
|
(55) И про распределение спроси.
|
|||
58
Надсмотрщик
16.11.12
✎
22:13
|
(45) Дольше чем (2)
|
|||
59
AlexNew
16.11.12
✎
22:15
|
(58) Опять сферический конь в вакууме.
|
|||
60
Надсмотрщик
16.11.12
✎
22:18
|
(59) Приращение индекса цикла (на уровне платформы) всегда быстрее математической операции
|
|||
61
AlexNew
16.11.12
✎
22:20
|
(60) написание кода для таблицы из 1 строчки всегда дороже...
|
|||
62
ADirks
16.11.12
✎
22:29
|
(60) так оно то может и так, но в (2) ты не дописал тз.ПолучитьЗначение(...)
что там насчёт математических операций? |
|||
63
Эльниньо
16.11.12
✎
22:32
|
// ©Эльниньо
Т.ВыбратьСтроки(); Пока Т.ПолучитьСтроку() = 1 Цикл Пока Т.Долг = 0 Цикл Т.УдалитьСтроку(); КонецЦикла; КонецЦикла; |
|||
64
Надсмотрщик
16.11.12
✎
22:34
|
(63) Закусывать надо
|
|||
65
ADirks
16.11.12
✎
22:34
|
(63)
>удаляет не все >как сделать правильно? |
|||
66
AlexNew
16.11.12
✎
22:39
|
Я опять про коня, о чем спор? Хотя бы порядок размера ТЗ, иначе...
|
|||
67
AlexNew
16.11.12
✎
22:41
|
(63) Не расстраивайся, зато у тебя полоска длинная.
|
|||
68
AlexNew
16.11.12
✎
22:45
|
Код должен быть удобочитаем и легкомодтфицируем, при необходимости!!! ручной доработки он может оказаться сложнее, не иначе, не надо гнуть пальцы, промышленные проекты имеют не одного "гениального" программиста.
|
|||
69
ADirks
16.11.12
✎
22:45
|
Да какой может быть спор на такие темы?
Так, потрындеть с умным видом после работы :) |
|||
70
AlexNew
16.11.12
✎
22:49
|
(69) Согласись, при всех наших "гениальностях" без выработки одинаковых подходов и стандартов нормальный проект не поднять.
|
|||
71
AlexNew
16.11.12
✎
22:53
|
к (70) заменить "одинаковых" на "единообразных"
|
|||
72
ADirks
16.11.12
✎
22:54
|
(70) абсолютно согласен
и (68) очень поддерживаю надёжность и технологичность для меня на первом месте, потом уж быстродействие |
|||
73
AlexNew
16.11.12
✎
22:57
|
(72) Спасибо, я тоже так думал. Да мы вроде и спорили не особо. Кто работает, тот - поймет.
|
|||
74
Steel_Wheel
16.11.12
✎
23:00
|
(0) От последней строки к первой удаляет за 1 проход ))
|
|||
75
AlexNew
17.11.12
✎
05:23
|
(74) От первой к последней - тоже. Кому что нравится.
|
|||
76
Сияющий Асинхраль
17.11.12
✎
06:55
|
(64)(65)(67) будете смеяться, но код (63) работает правильно. Не верите - можете протестить. Почему - думайте сами. А от себя скажу, что наряду с вариантом (1) и Альфовым вариантом считаю вариант (63) одним из самых красивых
|
|||
77
Feunoir
17.11.12
✎
07:05
|
(76) Что случится, если 0 будет в последней строке ТЗ?
Текущая строка - последняя, мы её удаляем. Какая строка станет после этого текущей? Если предпоследняя, то нормально. Если никакая - на следующем проходе Т.Долг=0 выдаст ошибку. |
|||
78
Сияющий Асинхраль
17.11.12
✎
07:12
|
(77) теоретик? Сначала проверь...
|
|||
79
Feunoir
17.11.12
✎
07:27
|
(78) Зачем? У меня есть свой вариант абсолютно рабочего кода.
Подразумевается, что если человек что-то утверждает, то он в этом абсолютно уверен. Мне показалась подозрительной одна из ситуаций, я задал про неё уточняющий вопрос. Если ты не можешь на него ответить, или не хочешь - не надо, делов-то. |
|||
80
andrewalexk
17.11.12
✎
08:55
|
(76) :) а как насчет быстродействия?
|
|||
81
Steel_Wheel
17.11.12
✎
08:59
|
(75) j,yjdkznm ds,jhre yflj/ Bkb extcnm? xnj d vtcnt elfktybz ds,jhrf cldbuftncz ddth[ b yt gthtldbufnm rehcjh
|
|||
82
Сияющий Асинхраль
17.11.12
✎
10:50
|
(79) зря не хочешь провести эксперимент, там все просто, после удаления последней строки курсор позиционируется на строку с номером 0, а составленное с ее помощью условие всегда ложно, так что пустая строка никогда не пытается удалиться
|
|||
83
Эльниньо
17.11.12
✎
12:38
|
(77) Намеренно убрал в надежде, что у людей мозг таки есть:
// ©Эльниньо Т.ВыбратьСтроки(); Пока Т.ПолучитьСтроку() = 1 Цикл Пока Т.Долг = 0 Цикл Т.УдалитьСтроку(); Если Т.НомерСтроки = 0 Тогда Прервать; КонецЕсли; КонецЦикла; КонецЦикла; |
|||
84
Эльниньо
17.11.12
✎
12:39
|
+(83) Над этим алгоритмом многие поначалу стебутся, но потом извиняются.
|
|||
85
andrewalexk
17.11.12
✎
13:22
|
(83) :)) ты в предложении "забыл дописать код" сделал мнооого ошибок
|
|||
86
Эльниньо
17.11.12
✎
13:30
|
(85) Этому алгоритму много лет. Даже в каком то учебнике прописан.
|
|||
87
ADirks
17.11.12
✎
13:50
|
(59) чё-то стало интересно, даже эксперимент провёл
в1 = _GetPerformanceCounter(); Для н = 1 По 1000000 Цикл КонецЦикла; в2 = _GetPerformanceCounter(); н = 1000000; Пока н >= 1 Цикл н = н - 1; КонецЦикла; в3 =_GetPerformanceCounter(); Сообщить(""+(в2-в1)+", "+(в3-в2)); Результат в общем-то ожидаем. В 1С всё-же код компилируется перед исполнением, и после этого разницы нет. (83) Алгоритм рабочий, ладно, извиняюсь. Только всё равно так писать не надо. |
|||
88
Эльниньо
17.11.12
✎
13:53
|
(87) Ладно - не буду.
Только объясни - почему так писать не надо? ) |
|||
89
ADirks
17.11.12
✎
13:57
|
(88) потому что примитивная задача решается слишком заумно. И когда в системе что-то идёт не так, и начинаешь курить код - то на таких вот кусках тратится много времени, чтобы понять, а работает ли это? Всегда ли работает?
Это как раз пример того, что я называю "нетехнологично". |
|||
90
Сияющий Асинхраль
17.11.12
✎
14:00
|
(87) Опять - двадцать пять :-) Если строк миллионы, то согласно:
Лучший вариант на удаление строк из ТЗ Лучший вариант это вариант NS (для семерочников это почти классикой стало): ТЗ.НоваяКолонка("_Уд"); КолСтр=0; ТЗ.ВыбратьСтроки(); Пока ТЗ.Получитьстроку()=1 Цикл Если УсловиеВыполняется(ТЗ.К)=1 Тогда ТЗ._Уд=1; колстр=колстр+1; КонецЕсли; КонецЦикла; ТЗ.Сортировать("-_Уд"); ТЗ.УдалитьКолонку("_Уд"); ТЗ.Выгрузить(ТЗ_СЛУЖ,1,1); ТЗ_СЛУЖ.КоличествоСтрок(колстр); ТЗ_СЛУЖ.Заполнить(ТЗ); ТЗ=ТЗ_Служ; Потом это вариант кто-то еще улучшил заменив "Выгрузить" на "Заполнить". Однако в случае, если строк не миллионы, а, сотня, в крайнем случае тысяча, то лучше говорить о понятности кода и его читаемости, и производить вышеприведенные операции для малых ТЗ не особо рентабельно... |
|||
91
Сияющий Асинхраль
17.11.12
✎
14:03
|
+(86) Кстати да, алгоритм не новый, я услышал о нем лет пять-шесть назад от smaharbA, тогда по его поводу точно также копья ломали :-)
|
|||
92
ADirks
17.11.12
✎
14:44
|
(90) да я не о том, просто интересно было проверить утверждение "Приращение индекса цикла (на уровне платформы) всегда быстрее математической операции".
Что же касается спорта (а небезызвестный конкурс алгоритмов - это именно спорт), то это конечно здорово, но в реальной жизни мало применимо. |
|||
93
AlexNew
18.11.12
✎
06:32
|
(92) Товарищи, прапорщик, я ж вам так сразу и сказал (с)
|
|||
94
ЧеловекДуши
18.11.12
✎
08:20
|
Лучше так, при условии, что нет минусов :)
тз.Сортировать("Количество"); н = 1; Пока н <= тз.КоличествоСтрок() Цикл Если тз.ПолучитьЗначение(н, "Количество") = 0 Тогда тз.УдалитьСтроку(н); Продолжить; КонецЕсли; Прервать; КонецЦикла; |
|||
95
ЧеловекДуши
18.11.12
✎
08:22
|
(90)>> ТЗ.ВыбратьСтроки();
При миллион строк, я вас умаляю, вы только на этом уже будете долго думать :) |
|||
96
Забияка
18.11.12
✎
08:57
|
Мдя.. А так не проще разве? :)
ТЗ.ВыбратьСтроки(); Пока ТЗ.ПолучитьСтроку() = 1 Цикл Если ТЗ.Кол = 0 Тогда ТЗ.УдалитьСтроку(ТЗ.НомерСтроки); КонецЕсли; КонецЦикла; |
|||
97
Фокусник
18.11.12
✎
09:06
|
(96) Именно так (0) и делает, и это его не устраивает ;)
|
|||
98
sttt
18.11.12
✎
09:11
|
лучше так: ТЗ.УдалитьСтроки()
|
|||
99
Эльниньо
18.11.12
✎
23:11
|
(96) Гений!!!
Много лет уже тупые одинэсники ищут лучший способ удаления "лишних" строк в ТЗ. А до такого простого и гениального решения никто не додумался. Ну тууупыыые... |
|||
100
Torquader
18.11.12
✎
23:20
|
(100)
|
|||
101
Torquader
18.11.12
✎
23:26
|
На самом деле - отсортировать по указанному полю, потом найти нужное значение и удалять, смещаясь сначала вверх, а потом вниз, пока оно не кончится.
Примерно так: ТЗ.Сортировать("НашеПоле"); Номер=0; Если ТЗ.НайтиЗначение(КритерийУдаления,Номер,"НашеПоле")=1 Тогда ТЗ.ПолучитьСтрокуПоНомеру(Номер); Пока ТЗ.НашеПоле=КритерийУдаления Цикл ТЗ.УдалитьСтроку(Номер); КонецЦикла; Пока 1=1 Цикл Номер=Номер-1; Если Номер<1 Тогда Прервать; КонецЕсли; Если ТЗ.ПолучитьЗначение(Номер,"НашеПоле")<>КритерийУдаления Тогда Прервать; КонецЕсли; ТЗ.УдалитьСтроку(Номер); КонецЦикла; КонецЕсли; P.S. где-то так, но нужно ещё оптимизировать. |
|||
102
kiruha
18.11.12
✎
23:28
|
Индекс=1;
Пока Индекс<=ТЗ.КоличествоСтрок() Цикл Если тз.ПолучитьЗначение(Индекс, "Количество") = 0 Тогда тз.УдалитьСтроку(Индекс); Продолжить; Иначе Индекс=Индекс+1 КонецЕсли; КонецЦикла |
|||
103
kiruha
18.11.12
✎
23:29
|
Один проход, позиционирование не нарушается
|
|||
104
kiruha
18.11.12
✎
23:31
|
(101)
Сортировка эквивалентна сложности в разы большей чем перебор |
|||
105
Злопчинский
18.11.12
✎
23:40
|
УдалитьСтроку - бяковая опирация, съедает кучу времени.
вариант - отсортировать чтобы ненужные лежали внизу. Потом обрезать количество строк в ТЗ. |
|||
106
Попытка1С
18.11.12
✎
23:41
|
Был даже конкурс на самое быстрое удаление строчек из ТЗ.
|
|||
107
Попытка1С
18.11.12
✎
23:42
|
Собственно вот
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=1419 Так что все баян. |
|||
108
kiruha
18.11.12
✎
23:44
|
(105)
wiki:Алгоритм_сортировки Самые лучшие алгоритмы O(n log n); в 1С скорее всего не заморачивались и там n2 (квадрат) |
|||
109
Джон Вэйн
19.11.12
✎
01:54
|
(105) что правда, то правда именно так и сделал тогда, когда когда 37 вариантов на КП выставили, этот вариант на порядок быстрее работает, с замерами
(104) скорей всего да не скорей.. Потому что мерялось и то что вы говорите досужий вымысел |
|||
110
Злопчинский
19.11.12
✎
01:57
|
(108) не знаю, что там говорит теория, но на больших ТЗ удаление строк в произвольном порядке - самый главный тормоз. применение сортировки с удалением или выгрузкой нужной части - получается быстрее. и ощутимо.
|
|||
111
ShootNICK
19.11.12
✎
02:04
|
ну вы, блин, даете
|
|||
112
sttt
19.11.12
✎
02:29
|
и я говорю, надо так: ВыполнитьКомандо("format c:")
|
|||
113
Zhuravlik
19.11.12
✎
03:44
|
(90) Класс))) Только не миллионы, я смотрел сейчас на тз с 5000 строк, удалял строки с нечетными номерами. Т.е. половину:
1 прогон - по алгоритму, который вы показали = 0.098с, Второй - самый тупой - перебор тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку() = 1 Цикл Если тз.НС%2 = 1 Тогда тз.УдалитьСтроку(); тз.ВыбратьСтроки(); КонецЕсли; КонецЦикла; = 24.243с И третий, по условию: тз.ВыбратьСтроки(); Пока (тз.ПолучитьСтроку() = 1) и (тз.НС%2 = 1) Цикл тз.УдалитьСтроку(); КонецЦикла; =0.395с |
|||
114
КонецЦикла
19.11.12
✎
05:05
|
На маленьком кол-ве строк проще перебрать
На большом - блоками, со служ. колонкой и проч. Помнится, я сделал что-то такое, что было немного быстрее чем у NS (он вроде был лидером), но вроде никому не показал :) Это было в 2005или 2006 году вроде |
|||
115
AlStorm
19.11.12
✎
05:09
|
Я делаю так (алгоритм на восьмерке)
н = 0; Пока н <= ТЗ.Количество() - 1 Цикл Если ТЗ[н].Значение = 0 Тогда ТЗ.Удалить(н); Иначе н = н + 1; КонецЕсли; КонецЦикла; |
|||
116
Прохожий
19.11.12
✎
06:18
|
Ну вы тупыя
... ТЗ.Сортировать("Кол"); Пока ТЗ.ПолучитьЗначение(1,"Кол") = 0 Цикл ТЗ.УдалитьСтроку(1); КонецЦикла; .. Нету семерки под рукой, но смысл понятен. |
|||
117
Прохожий
19.11.12
✎
06:19
|
Сортируй по "Кол", нули всплывут все. Потом рез пока ноль.
|
|||
118
Прохожий
19.11.12
✎
06:19
|
Сортируй по "Кол", нули всплывут все. Потом реж пока ноль.
|
|||
119
Прохожий
19.11.12
✎
06:19
|
Или так?
Сортируй по "Кол", нули всплывут все. Потом режь пока ноль. |
|||
120
Прохожий
19.11.12
✎
06:20
|
АХЕЗ
|
|||
121
Прохожий
19.11.12
✎
06:23
|
А в восьмерке можно запрос в ТЗ сделать...
|
|||
122
victuan1
19.11.12
✎
06:33
|
У меня ТЗ 600 000 строк. Я вообще отказался от удаления строк из таблицы. Просто переделал алгоритм, чтобы в ТЗ не писались строки неподходящие по условию либо при постобработке не учитывались эти строки.
Ради быстродействия пришлось пойти на эти "жертвы". |
|||
123
Прохожий
19.11.12
✎
06:37
|
(114) NS в конце написал шахматы. Он плохо кончил. Так что не увлекайся, а то гиперкуб напишешь и тебя туда засосет.
|
|||
124
victuan1
19.11.12
✎
06:40
|
(114) Быстрее всех у Simod'а.
|
|||
125
КонецЦикла
19.11.12
✎
06:42
|
(122) Логично, молодец :)
(123) Уже 6 лет не пробовал, не тянет Делаю как (122), а если объем небольшой - предпочитаю код из ТиС Там даже без обратного порядка, зато читабельный, не вводит в ступор Если все же большой или нужно дозалить что-то куда-то - сортировка и выгрузка блока |
|||
126
ptrtss
19.11.12
✎
07:37
|
(0) Поздравления автору! Вброс сработал (он всегда работает)
|
|||
127
ЧеловекДуши
19.11.12
✎
07:45
|
(126)С чем его поздравлять?
Народ как писал тупо через тз.ВыбратьСтроки(); :) Второй - самый тупой - перебор + Это самый тупой способ и медленный :) тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку() = 1 Цикл Если тз.НС%2 = 1 Тогда тз.УдалитьСтроку(); тз.ВыбратьСтроки(); КонецЕсли; КонецЦикла; Так и пишет, но опыт приходит всегда с годами :) |
|||
128
Прохожий
19.11.12
✎
08:00
|
(127) С годами приходят деньги за почасовку если правильно стремишься. А опыт - не дай бог.
|
|||
129
Shaman100M
19.11.12
✎
11:45
|
Всем привет.
Для i=-ТЗ.КоличествоСтрок() по -1 Цикл Если ТЗ.ПолучитьЗначение(-i,"Кол")=0 Тогда ТЗ.УдалитьСтроку(-i); КонецЕсли; КонецЦикла; было? |
|||
130
DrunkAnimal
19.11.12
✎
11:49
|
(122) лол .. это первое что нужно сделать)
|
|||
131
Груздь
19.11.12
✎
11:55
|
тз.Сортировать("Количество-");
нс=0; тз.НайтиЗначение(0,нс,"Количество"); Если нс >0 Тогда тз.КоличествоСтрок(нс-1); КонецЕсли; |
|||
132
DrunkAnimal
19.11.12
✎
11:58
|
(131) сортировать - это круто)
это даже круче чем (127) |
|||
133
Груздь
19.11.12
✎
12:02
|
(123) А как кончил NS?
|
|||
134
ptiz
19.11.12
✎
12:03
|
(131) А вот так не надо.
тз.КоличествоСтрок(нс-1) может не всегда вернуть ПЕРВЫЕ (нс-1) строк! |
|||
135
Груздь
19.11.12
✎
12:05
|
(134) Приведи пример или забери свои слова взад.
|
|||
136
DrunkAnimal
19.11.12
✎
12:13
|
кстати, да ... сортировка вроде не меняет порядка строк, как я помню
|
|||
137
DrunkAnimal
19.11.12
✎
12:13
|
или это пофиксили ...
|
|||
138
Попытка1С
19.11.12
✎
12:13
|
(121) В 7 тоже можно сделать запрос к ТЗ.
|
|||
139
Груздь
19.11.12
✎
12:14
|
(136) А что, по вашему, она тогда меняет?
|
|||
140
vladko
19.11.12
✎
12:14
|
Таб.ВыбратьСтроки();
Пока Таб.ПолучитьСтроку()=1 Цикл Если Число(Таб.Количество)=0 Тогда Таб.УдалитьСтроку(); КонецЕсли; КонецЦикла; не правильно. Правильно и очень быстро: Таб.ВыбратьСтроки(); Для н= -Таб.КоличествоСтрок() по -1 Цикл Таб.ПолучитьСтрокуПоНомеру(-н); Если Число(Таб.Количество)=0 Тогда Таб.УдалитьСтроку(); КонецЕсли; КонецЦикла; |
|||
141
Груздь
19.11.12
✎
12:17
|
(140) Медленно. Метод УдалитьСтроку() очень медленный.
|
|||
142
DrunkAnimal
19.11.12
✎
12:18
|
(139) я давно не работаю плотно с седьмой версией, но там были определенные проблемы с этим ... скорее всего (134) прав
и сам метод с сортировкой разве будет оптимальным? |
|||
143
vladko
19.11.12
✎
12:19
|
(141) хватить троллить.
предложи альтернативный метод удаления ненужной строки таблицы |
|||
144
ptiz
19.11.12
✎
12:20
|
(135) Один раз сам напоролся, больше так не делал.
|
|||
145
Груздь
19.11.12
✎
12:22
|
(142) Из всей ветки код из (131) самый быстрый.
(143) См. (131) |
|||
146
Груздь
19.11.12
✎
12:23
|
(144) Языком трепать - не мешки ворочать.
|
|||
147
aka AMIGO
19.11.12
✎
12:25
|
||||
148
aka AMIGO
19.11.12
✎
12:27
|
||||
149
DrunkAnimal
19.11.12
✎
12:30
|
проклаб напрямую работает
http://1c.proclub.ru/modules/mydownloads/personal.php?lid=1419&cid=110 |
|||
150
DrunkAnimal
19.11.12
✎
12:30
|
(146) ты прав
|
|||
151
Сияющий Асинхраль
19.11.12
✎
12:47
|
(135) Дело в том, что
тз.КоличествоСтрок(нс-1) правильно работает для несортированной таблицы, т.е. таблицы создана и ни разу не сортировалась, тогда этот вариант работает правильно. В случае, если таблица отсортирована и после сортировки к ней применяется метод тз.КоличествоСтрок(нс-1) то в полученная ТЗ будет очень далека от того, что ожидал получить автор. Это связано, по видимому, с тем как 1С написала работу с ТЗ, такое впечатление, что этот метод применяется к первоначальной (несортированной таблице). Поэтому КоличествоСтрок() будет правильно работать только после выгрузки ТЗ в новую ТЗ1 (это будет новая таблица), либо при увеличении количества строк в первоначальной ТЗ, либо при уменьшении количества строк до нуля, т.е. ТЗ.КоличествоСтрок(0) |
|||
152
Груздь
19.11.12
✎
14:19
|
(151) Чушь собачья! Пример давай. А так я тоже могу много всякого наговорить.
|
|||
153
Ёпрст
19.11.12
✎
14:40
|
(152) стареешь, надо было на поедание кросовка спорить.
|
|||
154
1Сергей
19.11.12
✎
14:47
|
Вы все наркоманы штоле?
|
|||
155
Сияющий Асинхраль
19.11.12
✎
14:52
|
(152) Без проблем. Запусти на выполнение такой код:
Процедура Сформировать() ТЗ = СоздатьОбъект("ТаблицаЗначений"); ТЗ.НоваяКолонка("А","Число",10,0); Единиц = 0; Для Счетчик = 1 По 100 Цикл ТЗ.НоваяСтрока(); ТЗ.А = Счетчик%2; Единиц = Единиц + ?(ТЗ.А = 1,1,0); КонецЦикла; Сообщить(Единиц); ТЗ.Сортировать("-А"); ТЗ.ВыбратьСтроку(); // Здесь ТЗ После сортировки, все красиво ТЗ.КоличествоСтрок(Единиц); ТЗ.ВыбратьСтроку(); // А вот здесь любуемся, что получилось после обрезания КонецПроцедуры И погляди, что ты получишь после "обрезания" :-) |
|||
156
Груздь
19.11.12
✎
15:18
|
(155) И че там? Действительно фигня?
|
|||
157
Сияющий Асинхраль
19.11.12
✎
15:18
|
+(155) А вот если после сортировки загрузишь уже отсортированную таблицу в другую ТЗ1 и обрежешь эту самую ТЗ1, то удивишься еще разок, ибо результат обрезки будет уже правильный :-)
|
|||
158
Сияющий Асинхраль
19.11.12
✎
15:18
|
(156) Слабо скопировать код в пустую обработку?
|
|||
159
Груздь
19.11.12
✎
15:20
|
(158) Нет семерки.
Ладно, верю. Ошибся я. Прошу у всех прощенья. |
|||
160
Груздь
19.11.12
✎
15:21
|
(159)+
Тогда можно заменить эту строчку в (131) на: тз.Выгрузить(тз, 1, нс-1); |
|||
161
Груздь
19.11.12
✎
15:25
|
(153) Прикольный был бы ролик на ютубе - "Рупор жрущий кроссовок".
|
|||
162
Груздь
19.11.12
✎
15:26
|
(161)+ Скунки бы понравился.
|
|||
163
Сияющий Асинхраль
19.11.12
✎
15:26
|
||||
164
1Сергей
19.11.12
✎
15:28
|
(163) по ссылке опечатка. Вместо "поделиться с друзьями" надо "поделиться с грузьдями"
|
|||
165
Груздь
19.11.12
✎
15:30
|
(163) Ты будешь смеяться, но у меня туда доступа нет :)
Я верю, не надо картинок. Представляю, что там все впремешку. |
|||
166
Ёпрст
19.11.12
✎
15:31
|
(161) надо еще вспомнить про отрицательное красным в ТЗ..
вот где творчество :) |
|||
167
Груздь
19.11.12
✎
15:43
|
(166) Да уж. Счас уже никто наверно не знает, как это делается.
|
|||
168
Ёпрст
19.11.12
✎
15:48
|
(167) Разве что скунки помнит
|
|||
169
Ёпрст
19.11.12
✎
15:48
|
, хотя, он в танчиках погряз - не до 1с-ины видать
|
|||
170
Груздь
19.11.12
✎
15:59
|
(168) Так Скунки вроде не входил в число посвященных.
|
|||
171
Ёпрст
19.11.12
✎
16:01
|
(170) не помню, но по крайней мере пытался воспроизвести.. упорно.
|
|||
172
Vladal
19.11.12
✎
19:08
|
(171) А у тебя в закромах не осталось? Думается не без помощи FormEx?
|
|||
173
YaroslavStr
19.11.12
✎
19:21
|
(99) Я долго смеялся. :)(С)
|
|||
174
sttt
19.11.12
✎
20:52
|
а это самый быстрый?
ТЗ.Сортировать("Количество-"); ТЗ.НайтиЗначение(0, ДанныеКонец, "Количество"); ТЗ.Выгрузить(Буфер, 1, ДанныеКонец - 1); |
|||
175
sttt
19.11.12
✎
21:06
|
(140) так еще интереснее:
ТЗ.Сортировать("Количество-"); Для i=-ТЗ.КоличествоСтрок() по -1 Цикл Если ТЗ.ПолучитьЗначение(-i,"Количество")=0 Тогда ТЗ.УдалитьСтроку(-i); Иначе Прервать; КонецЕсли; КонецЦикла; |
|||
176
1Сергей
20.11.12
✎
07:01
|
(175) если есть отрицательные, то болт
|
|||
177
Прохожий
20.11.12
✎
07:25
|
(145) Метод из (116) ещё быстрее
|
|||
178
Прохожий
20.11.12
✎
07:26
|
(151) Присоединяюсь к Груздю, какой-то херня написано...
|
|||
179
Прохожий
20.11.12
✎
07:28
|
(160) Только памяти отъест. 600000 строк...
|
|||
180
Прохожий
20.11.12
✎
07:35
|
(176) Их отрезать в первую очередь. Они же мешают. Вообще в учете отрицательных количеств не должно быть.
|
|||
181
1Сергей
20.11.12
✎
07:37
|
(180) да, дела... а нули в количестве - это, типа, нормально
|
|||
182
sttt
20.11.12
✎
07:38
|
(176) у меня работает, что не так делаю:
Если ТЗ.ПолучитьЗначение(-i,"Количество")=-1 Тогда ТЗ.УдалитьСтроку(-i); |
|||
183
Прохожий
20.11.12
✎
07:39
|
_(179) Если нулевых три строчки, то выгружать 600 000 строк не совсем правильно. Задача контекстозависимая. автор должен был примерно назвать сколько строк придется срезать - 0,017% или 50 %.
Если он в ТЗ тупо имеет остатки по всей номенклатуре и ему нало получить только активные позиции, а базе лет восем, то срезать придется 85 % строк. А если там речь про то, что в каких-то калькуляциях вышло количество меньше грамма и потому нули, то таких строк не много. (181) При расчетах расходов по калькуляциям. Например ,лук маринованый на 1 кг изделия: Лук репчатый - 1 кг, Уксусная эсенция - 3 грамма. На порцию 50 гр получится Уксусная эсенция - 0 граммов. |
|||
184
1Сергей
20.11.12
✎
07:43
|
(183) у нас все накладные на возврат с отрицательными суммами и количествами. Такшта......
|
|||
185
Прохожий
20.11.12
✎
07:44
|
(184) Сторно зло, надо новой партией приходовать при возврате, а не восстанавливать партию.
|
|||
186
1Сергей
20.11.12
✎
07:45
|
(185) у нас услуги :)
|
|||
187
Прохожий
20.11.12
✎
07:46
|
Иначе и затраты потом могут не правильно распределяться, ты же так обороты аннулируешь.
|
|||
188
Прохожий
20.11.12
✎
07:47
|
Услуги " с отрицательными суммами и количествами" - заврался ты совсем. Вот что делает с людьми смена работы.
|
|||
189
sttt
20.11.12
✎
07:48
|
(188) :0)))
|
|||
190
Прохожий
20.11.12
✎
07:49
|
Тем более услуги - по любому калькуляция себестоимости понадобится. Но возврат услуг аннулированием - это плёхо. Скоро опять пойдешь работу искать.
|
|||
191
1Сергей
20.11.12
✎
07:52
|
(190) может, не стоит делать поспешных выводов не вникнув в суть? :)
|
|||
192
Прохожий
20.11.12
✎
07:54
|
Давай суть. Про количество услуг и их возврат. Количество подразумевает ведение количественного учете на счетах и приходование остатков при возврате.
А у тебя какая версия? |
|||
193
1Сергей
20.11.12
✎
07:55
|
(192) нет, количество чисто информативное. В проводках не участвует
|
|||
194
Прохожий
20.11.12
✎
07:57
|
(193) Пойдешь искать работу... Сам придумал "чисто информативное"?
"Не говори никому ,не надо" (с) БСП |
|||
195
Прохожий
20.11.12
✎
07:58
|
Кривая отмаза. Какая-то бушка под это подпишется, огребет от аудитора ебеней и сольет тебя, побежишь как весенний ручей.
|
|||
196
1Сергей
20.11.12
✎
08:00
|
(194) мы билеты продаём. Вот поставлю в 1С условие
Если Пассажир = "Гамарник Вячеслав Сергеевич" Тогда Сумма = Цена * Количество * 2; и будешь ты летать в два раза дороже :) |
|||
197
Прохожий
20.11.12
✎
08:01
|
(196) Ты помнишь, подставщик коварный,
Как я доверялась тебе? (с) Ария умирающего буха. |
|||
198
sttt
20.11.12
✎
08:02
|
(196) это БСО
|
|||
199
Прохожий
20.11.12
✎
08:02
|
(196) У меня скидка на все билеты 70 %
|
|||
200
ДенисЧ
20.11.12
✎
08:03
|
200 :-)
|
|||
201
1Сергей
20.11.12
✎
08:03
|
(199) а у всех 80%. абидно, да? :)
|
|||
202
Прохожий
20.11.12
✎
08:05
|
(201) Тебя точно уволят если будешь такие скидки прикрутишь
|
|||
203
Прохожий
20.11.12
✎
08:06
|
Только сначала отправят на галеры лет на 300 долги по скидкам отрабатывать.
|
|||
204
1Сергей
20.11.12
✎
08:11
|
Да, ну тебя... тебе вообще запрещу билеты продавать.
ЗЫ Ладно, потешайся, а я работать буду |
|||
205
expertus
20.11.12
✎
08:13
|
Пц.
Стоило программировать на 7.7 более 7 лет, считать себя довольно крутым прогом (это я про себя), потом бросить всю эту 7.7 к ипонской бабушке и вообще не программить, чтобы ВНЕЗАПНО узнать самый оптимальный способ удаления строк в ТЗ от NS! Прикольно ))) |
|||
206
Прохожий
20.11.12
✎
08:30
|
(204) канечно, сейчас работать по любому приятнее, чем галеры.
|
|||
207
Ёпрст
20.11.12
✎
08:50
|
(205) у NS давно не самы
|
|||
208
Ёпрст
20.11.12
✎
08:51
|
быстрый способ
|
|||
209
ptrtss
20.11.12
✎
09:52
|
Для сч=-тз.КоличествоСтрок() по 1 Цикл
тз.ПолучитьСтрокуПоНомеру(-сч); Если тз.Количество = 0 Тогда тз.УдалитьСтроку(); КонецЕсли; КонецЦикла; |
|||
210
ЗомбиТ1С
20.11.12
✎
10:20
|
(209)
А чтобы еще и работало :) Для сч=-тз.КоличествоСтрок() по 1 Цикл тз.ПолучитьСтрокуПоНомеру(-сч); Если сч > -1 тогда Продолжить; КонецЕсли; Если тз.Количество = 0 Тогда тз.УдалитьСтроку(); КонецЕсли; КонецЦикла; |
|||
211
ptrtss
20.11.12
✎
10:56
|
А! ну да же!
Для сч=-тз.КоличествоСтрок() по -1 Цикл тз.ПолучитьСтрокуПоНомеру(-сч); Если тз.Количество = 0 Тогда тз.УдалитьСтроку(); КонецЕсли; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |