Лишние строки при удалении строк из таблицы значений

1. user1619761 31.03.22 10:33 Сейчас в теме
Доброго времени суток. Есть обработка (ОФ) с заполнением таблицы значений на форме. При удалении строк через индекс в таблице остается 119 строк, при удалении через Таблица.Удалить(Строка) - 140. Количество строк до удаления в обоих случаях 163. Помогите, пожалуйста, разобраться, какой метод правильнее, и почему такая разница в количестве строк?
Индекс = ТаблицаДБФ.Количество() - 1;
Пока Индекс >= 0 Цикл
			
			Для Счетчик = 0 По ТаблицаДБФ.Количество() - 1 Цикл  ////////ТаблицаДБФ - Табличная часть обработки
				
				Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(ТаблицаДБФ[Индекс].КодНоменклатуры));
				
				Если Номенклатура.Пустая() Тогда
					
					Сообщить("Номенклатура с кодом " + СокрЛП(ТаблицаДБФ[Индекс].КодНоменклатуры) + " отсутствует.", СтатусСообщения.Внимание);
					ТаблицаДБФ.Удалить(Индекс);
					Прервать;
					
				КонецЕсли;
				
			КонецЦикла;
			
			Индекс = Индекс-1;
			
		КонецЦикла;

////////////////////////////////////////////////////////////­//////////////////////////////----------------------------------------------------------------------------------

Для Каждого Строка Из ТаблицаДанных Цикл    ///////////////////////ТаблицаДанных - Таблица значений , созданная программно
			
			Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(СтрЗаменить(Строка.КодНоменклатуры, Символы.НПП, "")));
			
			Если Номенклатура.Пустая() Тогда
				
				Сообщить("Номенклатура с кодом " + СокрЛП(СтрЗаменить(Строка.КодНоменклатуры, Символы.НПП, "")) + " отсутствует.", СтатусСообщения.Внимание);
				ТаблицаДанных.Удалить(Строка);
				
			КонецЕсли;
			
		КонецЦикла;
		
		Для Каждого Строка Из ТаблицаДанных Цикл
			
			ЗаполнитьЗначенияСвойств(ТаблицаДБФ.Добавить(), Строка);
			
		КонецЦикла;

Показать
По теме из базы знаний
Найденные решения
2. starjevschik 31.03.22 10:36 Сейчас в теме
нельзя удалять строки при прямом обходе прямо в цикле, выборка сбивается, получится ерунда.
Правильно сначала собрать все удаляемые строки и потом уже удалить по ссылкам.
4. Sashares 35 31.03.22 10:37 Сейчас в теме
(1)Правильно работает первый, второй не верно - потому что нельзя удалять в том же цикле, в котором обходите таблицу.
Для второго варианта надо помещать строки к удалению в отдельный массив, и потом в отдельном цикле удалять строки по данному массиву.
6. Sashares 35 31.03.22 10:40 Сейчас в теме
(5)Первый вариант тоже кривой на самом деле.
цикл
Для Счетчик = 0 По ТаблицаДБФ.Количество() - 1 Цикл

не нужен тут
8. slavyan_arena 31.03.22 12:16 Сейчас в теме
(3)
хотя и он неправильно удаление сделает

как вариант можно:

новаяТабличка = ТаблицаДБФ.Скопировать();
НоваяТабличка.Очистить();

Для каждого строчки из ТаблицаДБФ Цикл
       Если Не Номенклатура.Пустая() Тогда
               НоваяСтрочка = НоваяТабличка.Добавить();
               НоваяСтрочка.Номенклатура = Строчки.Номенклатура;
               ...
               ...
       КонецЕсли;
КонецЕсли;
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. slavyan_arena 31.03.22 10:37 Сейчас в теме
(1)
Здравствуйте!
думаю второй метод более правильный, потому как при удалении через индекс, меняется индексация таблицы
и не факт что удаляется именно то что нужно
8. slavyan_arena 31.03.22 12:16 Сейчас в теме
(3)
хотя и он неправильно удаление сделает

как вариант можно:

новаяТабличка = ТаблицаДБФ.Скопировать();
НоваяТабличка.Очистить();

Для каждого строчки из ТаблицаДБФ Цикл
       Если Не Номенклатура.Пустая() Тогда
               НоваяСтрочка = НоваяТабличка.Добавить();
               НоваяСтрочка.Номенклатура = Строчки.Номенклатура;
               ...
               ...
       КонецЕсли;
КонецЕсли;
Показать
9. user1619761 31.03.22 15:30 Сейчас в теме
4. Sashares 35 31.03.22 10:37 Сейчас в теме
(1)Правильно работает первый, второй не верно - потому что нельзя удалять в том же цикле, в котором обходите таблицу.
Для второго варианта надо помещать строки к удалению в отдельный массив, и потом в отдельном цикле удалять строки по данному массиву.
2. starjevschik 31.03.22 10:36 Сейчас в теме
нельзя удалять строки при прямом обходе прямо в цикле, выборка сбивается, получится ерунда.
Правильно сначала собрать все удаляемые строки и потом уже удалить по ссылкам.
5. user1619761 31.03.22 10:39 Сейчас в теме
6. Sashares 35 31.03.22 10:40 Сейчас в теме
(5)Первый вариант тоже кривой на самом деле.
цикл
Для Счетчик = 0 По ТаблицаДБФ.Количество() - 1 Цикл

не нужен тут
7. user1619761 31.03.22 10:42 Сейчас в теме
(6) Согласен, Спасибо что поправили! Поэтому долго и работала обработка, что выполняла цикл из 163*163 строк.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот