Имя: Пароль:
1C
1C 7.7
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
(159) Гляди на результат обрезки:

http://fotoifolder.ru/view_foto/cqbqk9ohdqe9/
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 Тогда
       тз.УдалитьСтроку();
   КонецЕсли;
КонецЦикла;
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан