Проверяются только справочники, для остального надо переделать немного фрагмент кода с метаданными
Функция глПроверкаДублейСтрок(ВыбДок, СтрокаСвертки) Экспорт ВидДок = ВыбДок.Вид(); Список = глРазложить(СтрокаСвертки); ТекстЗапроса = " |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)