ТаблицаЗначений. Проверка дублей.

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

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

В случае, если параметр "КонтролируемаяКолонка" не передан, проверка осуществляется по всем колонкам.

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

 

Собственно, код ниже.

Буду рад комментариям.

// функция проверяет дубли строк таблицы значений по контролируемым колонкам
// Параметры:
// ТабЧасть - таблица значений
// КонтролируемаяКолонка - строка, списокЗначений - Наименование колонок;
// ТекстВозвратузнавать программистова - переменная, куда будет возвращено значение
// УдалятьНомерСтроки - не учитывать колонку НомерСтроки, в случае, если не передан список колонок.
// Возвращаемые значения:
// в случае отсутствия дублей - ложь
// в случае наличия дублей - истина и в параметр "ТекстВозвратузнавать программистова" записывается строковое значение дублей

Функция ПроверкаДублей(ТабЧасть, КонтролируемаяКолонка = Неопределено, ТекстВозвратузнавать программистова = "", УдалятьНомерСтроки = Истина) Экспорт

   
ЕстьДубли = Ложь;

    Если
ТипЗнч(ТабЧасть) = Тип("ТаблицаЗначений") тогда

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

       
тз = ТабЧасть.Скопировать();
       
тз.Колонки.Добавить("_КолонкаЕдиницы", Новый ОписаниеТипов(Новый КвалификаторыЧисла(1, 0, ДопустимыйЗнак.Неотрицательный)));
       
тз.ЗаполнитьЗначения(1,"_КолонкаЕдиницы");
       
тз.Свернуть(СтрокаСвертки, "_КолонкаЕдиницы");

        для каждого
стр из тз цикл
            Если
стр._КолонкаЕдиницы > 1 Тогда
               
ТекстВозвратузнавать программистова = ТекстВозвратузнавать программистова + "Дублирование строк: ";
               
ЕстьДубли = Истина;
                Для
ИндексКол = 0 по тз.колонки.Количество() - 1 цикл
                    Если
тз.колонки[ИндексКол].Имя = "_КолонкаЕдиницы" тогда
                       
ТекстВозвратузнавать программистова = ТекстВозвратузнавать программистова + " - найдено "+стр._КолонкаЕдиницы+" стр."+Символы.ПС;
                    Иначе
                        Если
ИндексКол > 0 тогда
                           
ТекстВозвратузнавать программистова = ТекстВозвратузнавать программистова + "; ";
                        КонецотчетыЕсли;
                       
ТекстВозвратузнавать программистова = ТекстВозвратузнавать программистова + Строка(стр[ИндексКол]);
                    КонецотчетыЕсли;
                Конецотчетыцикла;
            КонецотчетыЕсли;
        КонецотчетыЦикла;
    КонецотчетыЕсли;

    Возвратузнавать программистов
ЕстьДубли;

КонецотчетыФункции

Скриншоты


1C8[1].JPG

Полная версия

© ООО "Инфостарт", 2006-2023 www.infostart.ru