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

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

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

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

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

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

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.