Проверяются только справочники, для остального надо переделать немного фрагмент кода с метаданными

Функция глПроверкаДублейСтрок(ВыбДок, СтрокаСвертки) Экспорт
    ВидДок = ВыбДок.Вид();
    
    Список = глРазложить(СтрокаСвертки);
    
    ТекстЗапроса = "
    |SELECT Строки1.LINENO_ НомерСтроки
    |";
    
    Для Сч = 1 по Список.РазмерСписка() Цикл
        ТекИД = Список.ПолучитьЗначение(Сч);
        Вид = Метаданные.Документ(ВидДок).РеквизитТабличнойЧасти(ТекИД).Вид;
        ТекстЗапроса = ТекстЗапроса + "
        |, $Строки1." + ТекИД + " [" + ТекИД + " $Справочник." + Вид + "]
        |";
    КонецЦикла;	
    
    ТекстЗапроса = ТекстЗапроса + "
    |FROM (
    |SELECT 
    |";

    Для Сч = 1 по Список.РазмерСписка() Цикл
        ТекИД = Список.ПолучитьЗначение(Сч);
        Доб = ?(Сч = 1, "", ",");
        ТекстЗапроса = ТекстЗапроса + "
        |" + Доб + " $Строки." + ТекИД + " " + ТекИД + "
        |";
    КонецЦикла;	
       
    ТекстЗапроса = ТекстЗапроса + "	
    |FROM $ДокументСтроки." + ВидДок + " AS Строки With (NOLOCK)
    |WHERE (Строки.IDDOC = :ВыбДок)
    |GROUP BY 
    |";
    
    Для Сч = 1 по Список.РазмерСписка() Цикл
        ТекИД = Список.ПолучитьЗначение(Сч);
        Доб = ?(Сч = 1, "", ",");
        
        ТекстЗапроса = ТекстЗапроса + "
        |" + Доб + " $Строки." + ТекИД + "
        |";
    КонецЦикла;

    ТекстЗапроса = ТекстЗапроса + "	
    |HAVING COUNT(*) > 1
    |) AS Подзапрос
    |LEFT JOIN $ДокументСтроки." + ВидДок + " AS Строки1 With (NOLOCK) ON Строки1.IDDOC = :ВыбДок 
    |";
    
    Для Сч = 1 по Список.РазмерСписка() Цикл
        ТекИД = Список.ПолучитьЗначение(Сч);
        Доб = ?(Сч = 1, "", ",");
        ТекстЗапроса = ТекстЗапроса + "
        |AND $Строки1." + ТекИД + " = Подзапрос." + ТекИд + "
        |";
    КонецЦикла;	
    
    RecordSet.УстановитьТекстовыйПараметр("ВыбДок", ВыбДок);
    ТЗ = RecordSet.ВыполнитьИнструкцию(ТекстЗапроса);
    
    Статус = 0;
    ТЗ.ВыбратьСтроки();
    
    Пока ТЗ.ПолучитьСтроку() = 1 Цикл
        Статус = 1;
        СтрокаСообщения = "Строка: " + Строка(ТЗ.НомерСтроки);
        Для Сч = 1 по Список.РазмерСписка() Цикл
            ТекИД = Список.ПолучитьЗначение(Сч);
            СтрокаСообщения = СтрокаСообщения + ", " + ТекИД + ": " + ТЗ.ПолучитьЗначение(ТЗ.НомерСтроки, ТекИД);
        КонецЦикла;	
        Сообщить(СтрокаСообщения);
    КонецЦикла;
    
    Возврат Статус;
КонецФункции // глПроверкаДублейСтрок()

Функция глРазложить() есть в ТиС, примерно следующего содержания:

Функция глРазложить(Знач Стр, Разделитель = ",") Экспорт
    Список = СоздатьОбъект("СписокЗначений");
    Длина  = СтрДлина(Разделитель);
    Стр = СокрЛП(Стр);
    Поз = Найти(Стр, Разделитель);
    Пока 0 < Поз Цикл
        Список.ДобавитьЗначение(СокрП(Лев(Стр, Поз-1)));
        Стр = СокрЛ(Сред(Стр, Поз+Длина));
        Поз = Найти(Стр, Разделитель);
    КонецЦикла;
    Список.ДобавитьЗначение(Стр);
    Возврат Список;
КонецФункции

Пример вызова функции глПроверкаДублейСтрок():

Если глПроверкаДублейСтрок(ТекущийДокумент(), "Товар,Партия") = 1 Тогда
    НеПроводить(Контекст, "Устраните дубли!");
    Возврат;
КонецЕсли;

Другие статьи по прямым запросам:

Ускоряем регистрацию объектов в МОД (для SQL)

Аналог ON DUPLICATE KEY UPDATE в MS SQL

Как использовать УРБД в отличающихся конфигурациях

Примеры решения нестандартных задач на T-SQL в 1С

Как написать прямой запрос в 1С (DBF, 1sqlite)

Запросы в 1С к двум базам одновременно (DBF, OLE DB)

Как написать прямой запрос в 1С (SQL) с помощью 1С++

Онлайн резервирование товаров на складе (online reservation)