Имя: Пароль:
1C
1С v8
Удаление строки из ТЗ по условию
,
0 Nast
 
02.03.19
17:53
Скажите, можно ли оптимизировать данный код?

Для а = -ТаблицаЗначений.Количество() + 1 по 0 Цикл
      Стр = ТаблицаЗначений[-а];
      Если Стр.Количество = 0 Тогда
            ТаблицаЗначений.Удалить(Стр);
      КонецЕсли;
КонецЦикла;
1 SleepyHead
 
гуру
02.03.19
17:54
(0) Можно.

ТаблицаЗначений.Индексы.Добавить("Сумма");
МассивСтрок = ТаблицаЗначений.НайтиСтроки(Новый Структура("Сумма",0));
Для Каждого Стр из массивСтрок Цикл
  ТаблицаЗначений.Удалить(Стр)
КонецЦикла;
2 Nast
 
02.03.19
18:00
А почему так оптимальнее? НайтиСтроки() работает быстрее?
3 Garykom
 
гуру
02.03.19
18:01
Я уже заипался повторять что самое оптимальное (в среднем при обычных условиях) это не удаление строк из ТЗ.

А перенос только нужных строк в новую ТЗ из исходной!
4 Garykom
 
гуру
02.03.19
18:02
Поймите что ТЗ это сложная динамическая структура на основе указателей в памяти.
И удаление строк вызывает перестройку указателей и памяти с очисткой памяти дебильными кусочками что затем требует дефрагментацию памяти сборщиком мусора.

Короче берем новый кусок памяти, туда новую пустую ТЗ и заполняем ее.
А старую ТЗ грохаем целиком.
5 SleepyHead
 
гуру
02.03.19
18:08
ТаблицаЗначений.Колонки.Добавить("КоличествоНеНулевое", Новый ОписаниеТипов("Булево"));
Для Каждого Стр из ТаблицаЗначений Цикл
   Стр.КоличествоНеНулевое = (Стр.Количество <> 0);
КонецЦикла;
ТаблицаЗначений.Индексы.Добавить("КоличествоНеНулевое");
ТЗ = ТаблицаЗначений.Скопировать(Новый Структура("КоличествоНеНулевое", Истина);

Вот так совсем православно?
6 SleepyHead
 
гуру
02.03.19
18:09
(2) Ваш способ вообще ошибочный, у вас колчество строк ТЗ меняется в цикле, а цикл жестко заданы индексы. Вывалится с ошибкой.
7 Garykom
 
гуру
02.03.19
18:10
(5) Угу на больших количествах (тысячи и более) коротких строк (мало колонок) разница в скорости может быть несколько раз.
8 Mikeware
 
02.03.19
18:16
(5) заполнить добавленную колонку ложью. По индексу с нулевой суммой пробежаться и расставить истину. И копировать...
9 jsmith82
 
02.03.19
18:21
(3) во-во
10 Nast
 
02.03.19
18:44
Ваш способ вообще ошибочный, у вас колчество строк ТЗ меняется в цикле, а цикл жестко заданы индексы. Вывалится с ошибкой.

А у меня не вываливается, работает
11 Garykom
 
гуру
02.03.19
19:12
(10) Это случайность что у тебя индексы по порядку идут.
Попробуй вставить строки или удалить сначала а потом проверить что будет.
12 Nast
 
02.03.19
19:24
Работает все. Почему должны идти не по порядку, если перед удалением вставить строку, если берется вся таблица?
13 Nast
 
02.03.19
19:29
или вы хотите, чтобы в цикле в процессе удаления строк что-то добавлялось? В чем смысл?
14 SleepyHead
 
гуру
03.03.19
03:19
(8) нет предела совершенству ))
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс