Каталог решений - Таблица значений, быстрое удаление дублей строк

Таблица значений, быстрое удаление дублей строк

Таблица значений, быстрое удаление дублей строк

В наличии

Быстрое удаление дублей строк в таблице значений по списку колонок.

Категория:

Описание

Столкнулся с задачей удаления дублей строк в таблице значений, при этом важным критерием для меня является производительность, из-за большых размеров таблиц значений. Написал процедуру, возможно эта процедура кому-нибудь еще будет полезной.

 
Процедура ТаблицаЗначений_УдалитьДубли_ПоСпискуКолонок(ТаблицаДанных, СписокКолонокСтрокой, ОставитьОднуСтроку = Ложь)
	
	//Проверяем, что таблица данных не пустая
	Если ТаблицаДанных.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	
	//Создаем и Заполняем буферную таблицу
	БуфернаяТаблицаДанных  = ТаблицаДанных.Скопировать(,СписокКолонокСтрокой);
	
	//Заполняем список колонок, по которым будет осуществелн поиск дублей
	МассивКолонок = Новый Массив;
	Для Каждого Колонка Из БуфернаяТаблицаДанных.Колоники Цикл
		МассивКолонок.Добавить(Колонка.Имя);
	КонецЦикла;
	
	//Добавляем колонку "Счетчик" и заполняем ее занчением = 1
	БуфернаяТаблицаДанных.Колонки.Добавить("Счетчик");
	БуфернаяТаблицаДанных.ЗаполнитьЗначения(1,"Счетчик");
	БуфернаяТаблицаДанных.Свернуть(СписокКолонокСтрокой,"Счетчик");
	
	//Создаем и заполняем буферную таблицу для получения значений стчетчиков
	БуфернаяТаблицаСчетчик = БуфернаяТаблицаДанных.Скопировать();
	БуфернаяТаблицаСчетчик.Свернуть("Счетчик");
	
	//Удаляем строку со счетчиком = 1
	СтрокаГдеСчетчикРавно1 = БуфернаяТаблицаСчетчик.Найти(1, "Счетчик");
	Если НЕ СтрокаГдеСчетчикРавно1 = Неопределено Тогда
		БуфернаяТаблицаСчетчик.Удалить(СтрокаГдеСчетчикРавно1);
	КонецЕсли;
	
	//Удаляем дубли в таблице данных
	Для Каждого СтрокаТаблицыСчетчик Из БуфернаяТаблицаСчетчик Цикл
		//Находим  строки буферной таблицы, для каждого из значений счетчика
		ОтборПоСчетчику = Новый Структура();
		ОтборПоСчетчику.Вставить("Счетчик",СтрокаТаблицыСчетчик.Счетчик);
		НайденныеСтроки = БуфернаяТаблицаДанных.НайтиСтроки(ОтборПоСчетчику);
		//Для каждой такой строки, заполняем структуру отбора реальной таблицы по значениям колонок из буферной таблицы
		Для Каждого НайденнаяСтрока Из НайденныеСтроки Цикл
			//Заполняем отбор по массиву колонок
			ОтборУдаляемыхСтрок = Новый Структура();
			Для Каждого Колонка Из МассивКолонок Цикл
				ОтборУдаляемыхСтрок.Вставить(Колонка,НайденнаяСтрока[Колонка]);	
			КонецЦикла;
			//Находим строки реальной таблице по соответствующему отбору, и удаляем.
			ЭтоПерваяСтрока = Истина;
			НайденныеСтрокиДляУдаления = ТаблицаДанных.НайтиСтроки(ОтборУдаляемыхСтрок);
			Для Каждого НайденнаяСтрокаДляУдаления Из НайденныеСтрокиДляУдаления Цикл
				Если ОставитьОднуСтроку И ЭтоПерваяСтрока Тогда
					ЭтоПерваяСтрока = Ложь;
					Продолжить;
				КонецЕсли;
				ТаблицаДанных.Удалить(НайденнаяСтрокаДляУдаления);	
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры
has been added to your cart:
Оформление заказа