Как повлиять на то какой идентификатор оставить при объединении дублей
Здравствуйте, уважаемое сообщество!
В базе имеется много Контрагентов внесённых вручную, сделали интеграцию Контрагентов из 1С при помощи 1С Коннектора, естественно появились дубли
Но заметил, что при объединении дублей остаётся идентификатор старого объекта, а не нового который я выбираю... всё бы ничего но мне нужен новый идентификатор, который был присвоен после интеграции так как по нему идёт связь с Коннектором в таблице SmrSyncHistory для дальнешей синхронизации
Вопрос, как повлиять на то какой объект оставить в системе во время объединения дублей, а какой удалить?
Проверяю следующим запросом к базе:
select * from Account where name = 'Высший Вкус ООО (ВВ)'; select * from SmrSyncHistory where localid in (select id from Account where name = 'Высший Вкус ООО (ВВ)');
До объединения:
После объединения:
Нравится
Gorbunov Alexander, Если акция разовая, то можно сделать апдейт даты в таблице на какую-то более старую.
Пока в стандартном механизме платформы нет выбора золотой записи.
В случае использования 1C Connector вы можете сразу настроить признак [Использовать для дедупликации] по полю Название, чтобы дубли вообще не создавались. Подробнее -https://samarasoft.com/docs/1c-connector/integration-setting-bpmonline/fields-mapping/
В стандартном механизме в качестве золотой берётся первое значение в коллекции. В схеме DeduplicationMergeHandler функция MergeEntityDublicates начинается так:
public void MergeEntityDublicates(string schemaName, int groupId, List<Guid> duplicateRecordIds, Dictionary<string, string> resolvedConflicts) { EntitySchema entitySchema = _userConnection.EntitySchemaManager.GetInstanceByName(schemaName); EntityCollection duplicates = GetEntityDublicates(schemaName, duplicateRecordIds); Entity goldenEntity = duplicates.FirstOrDefault(); if (goldenEntity == null) { return; } duplicates.RemoveFirst(); duplicateRecordIds.Remove(goldenEntity.PrimaryColumnValue); if (duplicates.Count == 0) { return; }
А коллекция отсортирована по дате создания, старые вначале:
public EntityCollection GetEntityDublicates(string schemaName, List<Guid> ids, List<string> columns = null) { EntitySchema schema = _userConnection.EntitySchemaManager .GetInstanceByName(schemaName); var esq = new EntitySchemaQuery(schema); if (columns == null) { esq.AddAllSchemaColumns(); } else { esq.PrimaryQueryColumn.IsAlwaysSelect = true; if (!columns.Contains("CreatedOn")) { esq.AddColumn("CreatedOn"); } foreach (string columnName in columns) { esq.AddColumn(columnName); } } esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, esq.RootSchema.PrimaryColumn.Name, ids.Cast<object>())); EntityCollection entityCollection = esq.GetEntityCollection(_userConnection); entityCollection.Order("CreatedOn", OrderDirection.Ascending); return entityCollection; }
Вы можете либо изменить эту логику, но учитывая возможные побочные эффекты, либо же последовать совету Александра, чтобы избежать создания дублей.
Здравствуйте!
Спасибо за советы, только сейчас пролучилось вернуться к этому кейсу
Я так понимаю что включать признак дедупликации в Коннекторе уже поздно, ну или чистить записи и проводить интеграцию заново
Хочу попробовать сделать по совету Зверева Александра, но не могу найти статью или ответы на комьюнити как правильно замещать "Исходный код", я так понял надо просто поменять Ascending на Descending.
Gorbunov Alexander, Если акция разовая, то можно сделать апдейт даты в таблице на какую-то более старую.
Трефилов Павел Сергеевич,
ОМАЙГАДБЛ... всё гениальное просто, спасибо, попробую ))))))))