gifts2017

Проверка дублей строк с помощью 1С++

Опубликовал Вадим 1С911.BY (Вадимко) в раздел Программирование - Практика программирования

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

Оригинал статьи
http://1c911.by/stati_1s/statya-proverka-dubley-strok-s-pomoshchyu-1s.htm
Изменения и новые публикации смотрите на http://1c911.by/stati-1s.htm

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Mihenius (mihenius) 23.11.07 13:49
А может лучше дубли автоматом устранять?

не помешал бы вариант и для дбф ;)
2. Вадим 1С911.BY (Вадимко) 23.11.07 14:24
Может и лучше, ситуации разные бывают
Для ДБФ надо nolock убрать, остальное должно прокатить под ОЛЕДБ
3. Adapter (adapter) 26.11.07 09:59
Вот вариант для борьбы с дублями, который работает на любом формате базы и без 1C++
http://www.adaptersoft.ru/index.php?name=News&file=article&sid=8

Таких вариантов в Сети много, мне моя реализация скромно кажется лучшей ;)
4. Вадим 1С911.BY (Вадимко) 26.11.07 20:55
2(3) Кхе-кхе... в принципе тут речь идет о проверке в обработке проведения, например
Конечно не спорю... мой пример - наиболее корявый и куевый, написан был быстро, на коленке
>>и без 1C++
это, наверное, очень медленно :)
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа