Каталог решений - ТаблицаЗначений. Проверка дублей.

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

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

В наличии

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

Категория:

Описание

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

КонецФункции

has been added to your cart:
Оформление заказа