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