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

29.05.13

Разработка - Универсальные функции

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

Универсальные функции Платформа 1С v7.7 Россия Абонемент ($m)

В библиотеку собраны различные функции по работе с документами, журналами, типами данных, строками, датой и временем, таблицами значений, Excel, файлами, XML, JSON, Http-сервисами, SMTP серверами и т.п.

1 стартмани

22.12.2023    716    9    user706545_kseg1971    0    

4

1С 7.7 и новый 1С:Контрагент

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Россия Бесплатно (free)

Получение реквизитов контрагентов из 1С:Контрагент для старых конфигураций под 1с 7.7.

25.04.2022    1868    zhenyat    7    

6

Печать таблицы значений в 1С 7.7 при отладке

Универсальные функции Платформа 1С v7.7 Россия Бесплатно (free)

Функция выводит таблицу значений в табличный документ. (v7.7) Особенно полезно при отладке. Не нужно вносить изменения в код, вызываем функцию как вычисляемое выражение при останове. Если таблица обрабатывается в несколько этапов, можно вывести её после каждого и визуально проследить эволюцию.

30.06.2021    4487    Zoltan_Black    11    

2

Установка принтера по умолчанию для 1С 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Установка принтера по умолчанию в 1С 7.7. Обработка может быть полезна в том случае, когда нужно установить принтер по умолчанию, а доступа к рабочему столу нет (например, терминальный режим без рабочего стола или remoteApp)

1 стартмани

13.02.2019    13332    4    alsen    3    

4

Формирование строки json в 1С: 7.7

Универсальные функции Платформа 1С v7.7 Конфигурации 1cv7 1С:Комплексная 7.7 Абонемент ($m)

Предлагается набор функций 1с 7.7 для формирования строки json стандартными средствами.

1 стартмани

10.12.2018    10163    malovandrey    5    

18

Как создать индикатор в 1С:Предприятии 7.7

Универсальные функции Работа с интерфейсом Платформа 1С v7.7 Конфигурации 1cv7 Россия Абонемент ($m)

В статье дано описание создания индикатора на форме в среде разработки 1С:Предприятие 7.7 исключительно типовыми средствами.

1 стартмани

27.09.2016    18702    2    HAMMER_59    6    

2
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. mihenius 83 23.11.07 13:49 Сейчас в теме
А может лучше дубли автоматом устранять?

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

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