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

