Имя: Пароль:
1C
1C 7.7
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
(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 Тогда
       тз.УдалитьСтроку();
   КонецЕсли;
КонецЦикла;