Проверка таблицы на дублирование строк (ТаблицаЗначений, ТабличнаяЧасть) и получение массива таких строк

Публикация № 780163

Программирование - Практика программирования

Дублирование строк проверка таблицы

9
Функция для проверки дублирования строк в ТаблицеЗначений или ТабличнойЧасти. Также, если необходимо, возвращает массив задублированных строк (можно обработать).

В помощь коллегам (из давних наработок).

Функция по проверке дублирования строк в таблицах (и получения массива таких строк).

  • Передавать можно как ТаблицуЗначений так и ТабличнуюЧасть.
  • Если имена колонок (разделенных запятыми) не передавать, то будет проведена проверка на полностью идентичные строки (по значениям всех колонок).
  • Если передать параметр МассивСтрок типа Массив, то функция вернет в неё массив задублированных строк (можно дальше обработать, например удалить).

Обработка в комплекте просто предназначена для отладки функции, весь код функции приведен ниже. Если кому-то пригодилось скачайте в благодарность :)

 
 ПроверитьДублированиеСтрокТаблицы()
 
 Пример вызова
 
 ПроверитьДублированиеСтрокТЧ() (для типовых конфигураций на обычных формах)

 

9

Скачать файлы

Наименование Файл Версия Размер
Проверка таблицы на дублирование строк (ТаблицаЗначений, ТабличнаяЧасть):
.epf 11,92Kb
05.02.18
5
.epf 11,92Kb 5 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. Hamsik 13 05.02.18 14:50 Сейчас в теме
Добрый день, не очень понятно зачем так много когда для такой задачи, да и практическое применение тоже не очень понятно, пробовали на большом количестве строк?
2. uri1978 125 05.02.18 14:55 Сейчас в теме
(1) Если можно реализовать этот функционал меньшим количеством строк кода буду рад увидеть. На больших не пробовал.
3. pm74 124 05.02.18 14:57 Сейчас в теме
(2) через запрос будет короче
4. uri1978 125 05.02.18 14:59 Сейчас в теме
6. kuzev 40 05.02.18 15:01 Сейчас в теме
7. uri1978 125 05.02.18 15:02 Сейчас в теме
(6) Что именно? Если передача имен колонок - то нет, неважно в каком регистре. Если содержание таблицы - да, регистрозависимо.
8. pm74 124 05.02.18 15:04 Сейчас в теме
(6)
регистрозависимо
что имеется в виду ?
9. kuzev 40 05.02.18 15:04 Сейчас в теме
10. pm74 124 05.02.18 15:07 Сейчас в теме
(9) ах вот что , ну да для текстовых строк
5. uri1978 125 05.02.18 15:00 Сейчас в теме
Проверять можно не только ТабличнуюЧасть, но и любую ТаблицуЗначений.
11. acsent 1136 05.02.18 18:52 Сейчас в теме
А нельзя ли было однопроходным алгоритмом по сортированной таблице сделать?
12. uri1978 125 05.02.18 18:55 Сейчас в теме
(11) Хотелось бы увидеть такой код
13. МихаилМ 05.02.18 19:47 Сейчас в теме
(12)
такой код есть в Искусство программирования. Том 1—4»
Автор: Дональд Эрвин Кнут
16. acsent 1136 06.02.18 13:21 Сейчас в теме
(12) Типа идешь вниз по таблице, если ключевые занчения не поменялись, то это дубль
17. uri1978 125 06.02.18 15:16 Сейчас в теме
(16) Вариант.
Но боюсь, что интерпретатор 1С при проходе всех строк будет работать намного дольше чем "Свернуть", "Отсортировать", тем более придется сравнивать все ключевые поля на каждой итерации.
18. acsent 1136 06.02.18 17:19 Сейчас в теме
(17) нужно устроить конкурс по скорости поиска дублей )))
14. Идальго 116 05.02.18 20:36 Сейчас в теме
Вот для основы:

Функция ПроверитьНаличиеДублейГрупп()
	
	Запрос = Новый Запрос(
		"ВЫБРАТЬ
		|	ТаблицаГруппы.Группа КАК Группа
		|ПОМЕСТИТЬ
		|	ГруппыТемы
		|ИЗ
		|	&ТаблицаГруппы КАК ТаблицаГруппы;
		|
		|ВЫБРАТЬ
		|	ГруппыТемы.Группа КАК Группа
		|ИЗ
		|	ГруппыТемы КАК ГруппыТемы
		|СГРУППИРОВАТЬ ПО
		|	ГруппыТемы.Группа
		|ИМЕЮЩИЕ 
		|	КОЛИЧЕСТВО (*) > 1");
	
	Запрос.УстановитьПараметр("ТаблицаГруппы", ГруппыНоменклатуры.Выгрузить(,"Группа"));
	РезультатЗапроса = Запрос.Выполнить();
	Выборка = РезультатЗапроса.Выбрать();
	
	#Если Клиент Тогда
		Пока Выборка.Следующий() Цикл
			ТекстОшибки = "Группа "+Строка(Выборка.Группа)+" повторяется.";
			Сообщить(ТекстОшибки);
		КонецЦикла;
	#КонецЕсли 

	Возврат РезультатЗапроса.Пустой();
	
КонецФункции
Показать



Можно переделать более универсально и передавать имя таблицы, а также добавить вывод прочей информации.
jaroslav.h; +1 Ответить
15. uri1978 125 05.02.18 22:42 Сейчас в теме
(14) Поиск задублированных строк осуществляется следующим кодом, всё остальное в функции довесы. Причем код универсальный для любой таблицы значений и любого количества колонок:
ВремТаблицаЗначений = Таблица.Выгрузить(,Колонки);
ВремТаблицаЗначений.Колонки.Добавить("Количество_fhgeE");
ВремТаблицаЗначений.ЗаполнитьЗначения(1, "Количество_fhgeE");
ВремТаблицаЗначений.Свернуть(Колонки, "Количество_fhgeE");
ВремТаблицаЗначений.Сортировать("Количество_fhgeE" + " Убыв");  


То что происходит выгрузка ТЗ, так ведь и в запрос её нужно передать. То что есть сворачивания и сортировки естественно есть и в запросе.
Вариант запросом рассматривался, выбран был этот вариант.
19. independ 488 06.02.18 17:29 Сейчас в теме
Как то делал так, насчет скорости не замерял

Для каждого стр из ТЗ Цикл
		ПараметрыОтбора=Новый Структура;
		Для каждого Колонка из ТЗ.Колонки Цикл
			ПараметрыОтбора.Вставить(Колонка.Имя,стр[Колонка.Имя]);
		КонецЦикла;
		стрНайд=ТЗ.НайтиСтроки(ПараметрыОтбора);
		Если стрНайд.Количество()>1 Тогда

		КонецЕсли;
КонецЦикла;	
Показать
portal2011; +1 Ответить
20. uri1978 125 06.02.18 17:34 Сейчас в теме
(19) Будут найдены дубли, а потом по ним снова поиск дублей.
21. independ 488 06.02.18 17:42 Сейчас в теме
(20) да, но можно сделать некую проверку, или выгрузить, а затем свернуть. Но на большой ТЗ, думаю будет не очень
22. uri1978 125 06.02.18 17:42 Сейчас в теме
26. brylig 17.10.18 10:21 Сейчас в теме
(19) Вот тут так для табличных частей сделал без повторных проверок https://forum.infostart.ru/forum9/topic44859/message2066170/
27. uri1978 125 17.10.18 12:01 Сейчас в теме
(26) Этот код видел, в теме отписался. Собственно эта тема и сподвигла выложить свою процедуру (давно валялась) :)
23. IssakN 3 20.09.18 15:48 Сейчас в теме
Благодарю автора за приведенный код - пригодился в работе. Один вопрос - Колонки если нужно сделать отбор по двум - нужно вызывать функцию соответственно дважды, передавая разное значение переменной Колонки?
24. uri1978 125 20.09.18 16:29 Сейчас в теме
(23)

Пример таблицы:

Колонка1 | Колонка2
10 | 1
10 | 2


1. Если Вы хотите проверить задублированные строки по паре значений - нужно передавать через запятую названия 2 колонок.
"Колонка1,Колонка2" - этом случае задвоенных значений нет.

2. Если же Вы хотите проверить для каждой из колонок наличие дублей - то вызывать соответственно два раза.
Из примера выше - по колонке 1 будет выдано, что есть задвоенные значения, по второй колонке задвоенных нет.
25. IssakN 3 21.09.18 11:04 Сейчас в теме
(24) Благодарю пригодился второй способ.
Оставьте свое сообщение