1C: Правильное удаление элементов из таблицы значений
Некоторые пытаются сделать так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
для каждого стр из док.Начисления цикл если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000000048") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда док.Начисления.удалить(стр); продолжить; конецесли; если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000000058") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда док.Начисления.удалить(стр); продолжить; конецесли; если стр.ВидНачисления=справочники.vscВидыНачислений.НайтиПоКоду("000010010") и стр.ТипРасчета<>перечисления.vscТипРасчетаКомУслуг.ПерерасчетПредыдущихПериодов тогда док.Начисления.удалить(стр); продолжить; конецесли; конеццикла; |
Т.е. перебирают всю таблицу и по условию удаляют это строчку. И это совершенноне верно! При таком удалении, если строчки которые нужно удалить идут «вподряд», идет «перескок» и строка не удаляется. Правильно удалять с отборами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
СтруктураОтбора = Новый Структура(); СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000000048")); СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод); МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора); Для Каждого ЭлементМассив Из МассивСтрок Цикл док.Начисления.Удалить(ЭлементМассив); //удаляем строки КонецЦикла; СтруктураОтбора = Новый Структура(); СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000000058")); СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод); МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора); Для Каждого ЭлементМассив Из МассивСтрок Цикл док.Начисления.Удалить(ЭлементМассив); //удаляем строки КонецЦикла; СтруктураОтбора = Новый Структура(); СтруктураОтбора.Вставить("ВидНачисления", справочники.vscВидыНачислений.НайтиПоКоду("000010010")); СтруктураОтбора.Вставить("ТипРасчета", перечисления.vscТипРасчетаКомУслуг.НачислениеЗаРасчетныйПериод); МассивСтрок = док.Начисления.НайтиСтроки(СтруктураОтбора); Для Каждого ЭлементМассив Из МассивСтрок Цикл док.Начисления.Удалить(ЭлементМассив); //удаляем строки КонецЦикла; |
Пусть более громоздко, но зато работает верно. Можно еще покопать в строну использования «И и ИЛИ» в отборах. Будет короче. Не стал