Вопрос Как удалить строки из таблицы значений по некоторому условию
Ответ Предположим, есть таблица значений ТЗ:
Колонка1 | Колонка2 | Колонка3 |
1 | 11 | 234 |
2 | 22 | 456 |
3 | 33 | 765 |
4 | 22 | 340 |
5 | 55 | 456 |
Вариант 1. Предположим, требуется из этой таблицы удалить все строки, у которых значение колонки 2 не равно 22.
Эта задача в 1С v8 легко решается с помощью механизма отборов. Программный код, решающий задачу:
стрОтбор = Новый Структура("Колока2",22);
МассивСтрок = ТЗ.НайтиСтроки(стрОтбор); // в этом массиве останутся строки 2 и 4, т.е. в результате получим массив строк таблицы значений, соответствующих условиям поиска. Важно! Такой массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным.
ВремТЗ = ТЗ.Скопировать(МассивСтрок); // копируем массив строк во временную таблицу значений
ТЗ.Очистить(); // удаляем все строки из ТЗ
ТЗ = ВремТЗ.Скопировать(); // копируем всю временную таблицу значений в нашу ТЗ
Вариант 2 . Удаление строк таблицы значений по условию: удалить все строки, у которых значение колонки 2 равно 22
// ТЗ- Таблица значений // МассивНЕДопустимых - массив недопустимых строк, у которых колонка Колонка2 содержит недопустимое значение (для примера - 0) стрОтбор = Новый Структура("Колонка2",0); МассивНЕДопустимых = ТЗ.НайтиСтроки(стрОтбор); // в этом массиве останутся строки 2 и 4, //т.е. в результате получим массив строк таблицы значений, соответствующих условиям поиска. //Важно! Такой массив хранит ссылки на строки таблицы значений, то есть при изменении строки в таблице, значение в массиве тоже будет измененным. Индекс = ТЗ.Количество() - 1; Пока Индекс >= 0 Цикл Если МассивНЕДопустимых.Найти(ТЗ[Индекс]) <> Неопределено Тогда ТЗ.Удалить(Индекс); КонецЕсли; Индекс = Индекс - 1; КонецЦикла;
Или еще проще, без использования механизма отборов — когда условие удаления строки простое, по единственному критерию:
// или еще проще, без отборов: Индекс = ТЗ.Количество() - 1; Пока Индекс >= 0 Цикл Если ТЗ[Индекс].Колонка2 = 0 Тогда ТЗ.Удалить(Индекс); КонецЕсли; Индекс = Индекс - 1; КонецЦикла;
Вариант 3.
СтруктураОтбора = Новый Структура("Наименование реквизита", Егозначение);// задаем условия МассивСтрок = ЭтотОбъект.Товары.НайтиСтроки(СтруктураОтбора); Для Каждого ЭлементМассив Из МассивСтрок Цикл ЭтотОбъект.Товары.Удалить(ЭлементМассив); //удаляем строки КонецЦикла;
Вариант 4.
Для Индекс = -Объект.ТЗ.Количество()+1 По 0 Цикл Если Объект.ТЗ[-Индекс].Значение = <Условие> Тогда Объект.ТЗ.Удалить(-Индекс); КонецЕсли; КонецЦикла;
Вариант 5.
ТЗ=Объект.ШПЗ.Выгрузить(,"ШПЗ,Шифр31"); Количество=ТЗ.Количество(); Для к=1 По Количество Цикл стр=ТЗ[Количество-к]; Если НЕ стр.Шифр31 Тогда ТЗ.Удалить(стр); КонецЕсли; КонецЦикла;
перечитал весь блог, довольно неплохо
Спасибо!
СПАСИБО!!!!!!!!!
Пожалуйста. И Вам спасибо за спасибо ))
Очень ригодилось, спасибо!
Спасибо. пригодилось новичку 😉
Ага очень красиво, а если нужно значение второй колонки меньше 22???
а строк тысяча!!
только это не «удаление строк по критерию», а «копирование строк по критерию». на случай, если кажется, что это одно и то же: именно поэтому для задачи, когда надо удалить, к примеру, все строки с нулями, этот алгоритм не подходит.
Андрей, спасибо за комментарий.
В статью добавлены еще несколько вариантов.
Выбирайте любой, какой больше понравится/подойдет для вашей задачи.
Предлагайте свои варианты.