Архив метки: удаление из табличной части

1C: Правильное удаление элементов из таблицы значений

Некоторые пытаются сделать так:

			 для каждого стр из док.Начисления цикл
			     если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000000048") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда
			    	  док.Начисления.удалить(стр);
			    	  продолжить;
			     конецесли;	 
			     если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000000058") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда
			    	 	док.Начисления.удалить(стр);
			    		продолжить;
			     конецесли;	 
			     если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000010010") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда
			    	 	док.Начисления.удалить(стр);
			    		продолжить;
			     конецесли;	 				 
			 конеццикла;

Т.е. перебирают всю таблицу и по условию удаляют это строчку. И это совершенноне верно! При таком удалении, если строчки которые нужно удалить идут «вподряд», идет «перескок» и строка не удаляется. Правильно удалять с отборами:

			    СтруктураОтбора = Новый Структура();
				СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000000048"));
				СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод);
			 	МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора);
				Для Каждого ЭлементМассив Из МассивСтрок Цикл
					док.Начисления.Удалить(ЭлементМассив); //удаляем строки
				КонецЦикла; 
			    СтруктураОтбора = Новый Структура();
				СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000000058"));
				СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод);
			 	МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора);
				Для Каждого ЭлементМассив Из МассивСтрок Цикл
					док.Начисления.Удалить(ЭлементМассив); //удаляем строки
				КонецЦикла; 
			    СтруктураОтбора = Новый Структура();
				СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000010010"));
				СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод);
			 	МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора);
				Для Каждого ЭлементМассив Из МассивСтрок Цикл
					док.Начисления.Удалить(ЭлементМассив); //удаляем строки
				КонецЦикла;

Пусть более громоздко, но зато работает верно. Можно еще покопать в строну использования «И и ИЛИ» в отборах. Будет короче.  Не стал

Удаление не нужных записей из табличной части 1С

Снимок экрана из 2015-10-12 16:46:28Задача: выставить верное количество остатков на складе. Удалить из табличной части строки с нулевым количеством.

	   для каждого стр из НоменклатураДляПодбора цикл		   
		    Запрос = Новый Запрос("ВЫБРАТЬ
		                          |	ТоварыНаСкладахОстатки.КоличествоОстаток,
		                          |	ТоварыНаСкладахОстатки.Номенклатура
		                          |ИЗ
		                          |	РегистрНакопления.ТоварыНаСкладах.Остатки(&Период, ) КАК ТоварыНаСкладахОстатки
		                          |ГДЕ
		                          |	ТоварыНаСкладахОстатки.Склад = &Склад
		                          |	И ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура");								  
           Запрос.УстановитьПараметр("Склад",СтруктураИсходныхПараметров["Склад"]);
		   Запрос.УстановитьПараметр("Номенклатура",стр.Номенклатура);
		   Запрос.УстановитьПараметр("Период",ТекущаяДата());
		   Результат = Запрос.Выполнить().Выбрать();
			 такиостаток=0;
			 пока Результат.Следующий() цикл
			 такиостаток=Результат.КоличествоОстаток;			 
		    конеццикла;		 
		   стр.КоличествоСвободныйОстаток=такиостаток;
	   конеццикла;	   
	   
	    СтрокиКУдалению = НоменклатураДляПодбора.НайтиСтроки(Новый Структура("КоличествоСвободныйОстаток",0));
 		Для каждого СтрокаТаблицы Из СтрокиКУдалению Цикл
		НоменклатураДляПодбора.Удалить(СтрокаТаблицы);
		КонецЦикла;