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