глПроверкаДублейСтрок(
ВыбДок,
СтрокаСвертки) Экспорт
ВидДок=
ВыбДок.
Вид()
; Список=
глРазложить(
СтрокаСвертки)
; ТекстЗапроса= "
|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 Тогда
НеПроводить(Контекст, "Устраните дубли!")
;Возврат
;КонецЕсли
;Оригинал статьи