Как удалить строки из таблицы значений по некоторому условию (1С: 8.1: Программисту: Таблица значений) — 1C-h
 

Как удалить строки из таблицы значений по некоторому условию (1С: 8.1: Программисту: Таблица значений)

9

Вопрос Как удалить строки из таблицы значений по некоторому условию
Ответ
Предположим, есть таблица значений ТЗ:

Колонка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 Тогда
			ТЗ.Удалить(стр);
		КонецЕсли;
		
	КонецЦикла;

9 thoughts on “Как удалить строки из таблицы значений по некоторому условию (1С: 8.1: Программисту: Таблица значений)

  1. Ага очень красиво, а если нужно значение второй колонки меньше 22???
    а строк тысяча!!

  2. только это не «удаление строк по критерию», а «копирование строк по критерию». на случай, если кажется, что это одно и то же: именно поэтому для задачи, когда надо удалить, к примеру, все строки с нулями, этот алгоритм не подходит.

    1. Андрей, спасибо за комментарий.
      В статью добавлены еще несколько вариантов.
      Выбирайте любой, какой больше понравится/подойдет для вашей задачи.
      Предлагайте свои варианты.

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

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

Next Post

Как изменить вид договора в ЗУП (1С: v8: Зарплата и Управление персоналом)

Вс Июл 18 , 2010
Вопрос Как изменить вид договора в ЗУП, если случайно оформили на основное место, а нужно по совместительству? Ведь поле «Вид занятости» недоступно для редактирования! Ответ Если вы только что оформили сотрудника и еще не начисляли ему заработную плату, то сделать это довольно легко — нужно отменить проведение документа «Прием на […]

You May Like