|
v7: как правильно убрать строки из ТЗ | ☑ | ||
---|---|---|---|---|
0
vitalka
16.11.12
✎
19:14
|
надо удалить из таблицы значений строки с количеством = 0
делаю так Таб.ВыбратьСтроки(); Пока Таб.ПолучитьСтроку()=1 Цикл Если Число(Таб.Количество)=0 Тогда Таб.УдалитьСтроку(); КонецЕсли; КонецЦикла; удаляет не все как сделать правильно? |
|||
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 Тогда тз.УдалитьСтроку(); КонецЕсли; КонецЦикла; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |