Поиск дублей при сохранении

Здравствуйте! На 7.16.1 необходимо настроить поиск дублей в Контрагенте по кастомному полю (ИНН). Добавил хранимую процедуру и зарегистрировал её, как описано в данной статье: https://academy.terrasoft.ru/documents/technic-sdk/7-11/dobavlenie-pravila-poiska-dubley?_ga=2.85605657.1051876412.1592819009-1256785345.1592483512. Установил признак "Использовать при сохранении", но при сохранении не отрабатывает, хотя при массовом поиске дубли находит. При этом стандартные правила отрабатывают при сохранении, если включить этот признак. 

Название кастомного поля: InfTIN

Ссылка на код процедуры: https://pastebin.com/Gwir4eDg

Ссылка на код регистрации правила: https://pastebin.com/L9uVR8kR

Нравится

11 комментариев

Константин, на первый взгляд, Ваши хранимки отличаются от примера только названиями полей. Но это инструкция к 7.11, это очень старая версия. Сейчас функциональность поиска дублей завязана на на работу сервиса глобального поиска.

 

Что интересно, если в Вашей ссылке поменять версию на 7.16, заголовок сменится на Добавление правила массового поиска дублей | Creatio Academy и содержит примечание:

Описанный процесс добавления правила массового поиска дублей актуален для Creatio версий 7.13.2 и ниже. Для версий системы 7.13.4 и выше функциональность поиска дублей описана в статье “Поиск и объединение дублей”, а работа с правилами поиска дублей при сохранении записи — в статье "Добавление правила поиска дублей при сохранении записи".

Поскольку у Вас 7.16.1, эта статья не подходит, выберите подходящую статью.

 

Зверев Александр,

В самом начале данной статьи есть предупреждение:

Описанный процесс добавления правила поиска дублей актуален для Creatio версий 7.13.2 и ниже. Для версий системы 7.13.4 и выше функциональность поиска дублей описана в статье “Поиск и объединение дублей”, а работа с правилами массового поиска дублей — в статье "Добавление правила массового поиска дублей".

При этом процедура работает, похожа на стандартные процедуры, которые работают при сохранении, при установке признака "Использовать при сохранении".

Не хотелось бы завязывать поиск дублей на функциональности для версий 7.13.2 и ниже, ведь если в последующих обновлениях её поправят, то отвалится поиск дублей. 

Для версии 7.16 поиск дублей описан в статьях «Как выполнить поиск дублей», «Как работает поиск дублей» и «Правила поиска дублей», там хранимки уже не упоминаются. Уверены, что те стандартные способы, с которыми сравниваете, используют такие хранимки?

Зверев Александр,

В статье "Правила поиска дублей" описывается достаточно странный процесс, потому что в "Правила поиска дублей" нет кнопки добавить. 

При этом, стандартные правила используют такие же хранимые процедуры. Например, правило поиска дублей контрагента по имени: https://pastebin.com/iKnzi8Nm

Кроме того, все правила описаны в таблице DuplicatesRule, которая явно указывает на хранимые процедуры.

Судя по результатам выборки, хранимки есть не у всех правил, даже активных.

Зверев Александр,



Но по статье для 7.16 необходимо замещение модулей, а с версии 7.13 оно запрещено

Где именно? Статья «Добавление правила поиска дублей при сохранении записи», несмотря на адрес с цифрой 16, тоже, похоже, относится к версии до 7.13.2.

 

По изначальному вопросу: если у Вас 7.16.1, те правила поиска, которые с хранимкой и наподобие которых Вы хотите сделать своё, точно ли отрабатывают или остались от старых версий?

 

Зверев Александр,



Да, я именно про эту статью. 



Они, скорее всего, остались от старых версий, но они отрабатывают.

В DuplicatesRuleManager в функции проверяются условия для правил:

/// <inheritdoc cref="IDuplicatesRuleManager.GetDuplicatesRules(string)"/>
public IEnumerable<DuplicatesRuleDTO> GetDuplicatesRules(string schemaName) {
	return GetAllDuplicatesRules()
		.Where(rule => rule.SchemaName == schemaName &&
			(schemaName == LeadSchemaName ? rule.IsActive : rule.UseAtSave) &&
			(string.IsNullOrEmpty(rule.SearchSchemaName) || rule.SearchSchemaName == schemaName));
}

Проверьте, все ли они выполняются для Вашего.

Зверев Александр,

А когда вызывается этот класс? При локальном и массовом поиске не получилось просмотреть.

Функция вызывается из DeduplicationManager:

/// <inheritdoc cref="IDeduplicationManager.FindDuplicates"/>
public DuplicatesCollection FindDuplicates(FindDuplicatesRequest findDuplicatesOnSaveRequest) {
	var timer = new Stopwatch();
	try {
		timer.Start();
		var entityRules = _duplicatesRuleManager
			.GetDuplicatesRules(findDuplicatesOnSaveRequest.SchemaName);
		return FindSimilarRecords(entityRules.ToList(), findDuplicatesOnSaveRequest);
	}
	finally {
		timer.Stop();
		_metricReporter.Gauge(DuplicationSearchDurationMetricName, timer.ElapsedMilliseconds);
	}
}
 
/// <inheritdoc cref="IDeduplicationManager.FindSimilarRecordsFromStored"/>
public DuplicatesCollection FindSimilarRecordsFromStored(FindSimilarRecordsFromStoredRequest request) {
	var entityRules = request.SchemaName == request.SourceSchemaName
		? _duplicatesRuleManager.GetDuplicatesRules(request.SchemaName)
		: _duplicatesRuleManager.GetDuplicatesRules(request.SourceSchemaName, request.SchemaName);
	var searchSimilarRecordsRequest = _findSimilarRecordsRequestBuilder.BuildRequest(request);
	return FindSimilarRecords(entityRules.ToList(), searchSimilarRecordsRequest);
}

 

Показать все комментарии