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