Rebuilding a search index might fail with an unhandled exception. The issue occurs if a sellable item is associated with more than one catalog, and one of the catalogs that the sellable item is associated with is not selected in the Content Editor in order to be displayed on a storefront. The following message can be found in the logs:
Exception: System.Reflection.TargetInvocationException Message: Exception has been thrown by the target of an invocation. ---> Exception: System.NullReferenceException Message: Object reference not set to an instance of an object. Source: Sitecore.Commerce.Engine.Connect at Sitecore.Commerce.Engine.Connect.SitecoreDataProvider.Parsers.ExternalSettingsParser..ctor(JToken entity) at Sitecore.Commerce.Engine.Connect.DataProvider.ReadOnlyCatalogDataProvider.GetItemTemplate(CatalogRepository repository, ID itemId, String sharedPropertyName, ID defaultTemplateId) at Sitecore.Commerce.Engine.Connect.DataProvider.ReadOnlyCatalogDataProvider.GetItemDefinition(ID itemId, CallContext context) at Sitecore.Data.DataProviders.DataProvider.GetItemDefinition(ID itemID, CallContext context, DataProviderCollection providers) at Sitecore.Data.DataSource.GetItemInformation(ID itemID) at Sitecore.Data.DataSource.GetItemData(ID itemID, Language language, Version version) at Sitecore.Nexus.Data.DataCommands.GetItemCommand.(ID , Language , Version , Database ) at Sitecore.Nexus.Data.DataCommands.GetItemCommand.(ID , Language , Version , Database ) at Sitecore.Data.Engines.DataCommands.GetItemCommand.DoExecute() at Sitecore.Data.Engines.EngineCommand`2.Execute() at Sitecore.Data.Managers.ItemProvider.GetItem(ID itemId, Language language, Version version, Database database) at Sitecore.Data.Managers.ItemProvider.GetItem(ID itemId, Language language, Version version, Database database, SecurityCheck securityCheck) at Sitecore.ContentTesting.Pipelines.ItemProvider.GetItem.GetItemUnderTestProcessor.Process(GetItemArgs args) at (Object , Object ) at Sitecore.Pipelines.CorePipeline.Run(PipelineArgs args) at Sitecore.Data.Managers.DefaultItemManager.GetItem(ID itemId, Language language, Version version, Database database, SecurityCheck securityCheck) at Sitecore.Data.Managers.DefaultItemManager.GetItem(ID itemId, Language language, Version version, Database database) at Sitecore.Data.Managers.ItemManager.GetItem(ID itemId, Language language, Version version, Database database) at Sitecore.Commerce.Engine.Connect.Search.Crawlers.AllCatalogItemsCrawler.TryGetItem(ID deterministicId) at Sitecore.Commerce.Engine.Connect.Search.Crawlers.AllCatalogItemsCrawler.Add(IProviderUpdateContext context, CancellationToken cancellationToken) at Sitecore.ContentSearch.FlatDataCrawler`1.RebuildFromRoot(IProviderUpdateContext context, IndexingOptions indexingOptions, CancellationToken cancellationToken) at Sitecore.Commerce.Engine.Connect.Search.Crawlers.AllCatalogItemsCrawler.RebuildFromRoot(IProviderUpdateContext context, IndexingOptions indexingOptions, CancellationToken cancellationToken) at Sitecore.ContentSearch.SolrProvider.SolrSearchIndex.PerformRebuild(Boolean resetIndex, Boolean optimizeOnComplete, IndexingOptions indexingOptions, CancellationToken cancellationToken) at Sitecore.ContentSearch.SolrProvider.SolrSearchIndex.Rebuild(Boolean resetIndex, Boolean optimizeOnComplete)
To resolve the issue, download and install the hotfix:
For Sitecore XC 9.1 (Initial Release): SC Hotfix 347459-1 CommerceEngineConnect 3.0.46.zip
Be aware that the hotfix was built for the specific Sitecore XC version and must not be installed on other Sitecore XC versions or in combination with other hotfixes. If any other hotfixes have already been installed on a certain Sitecore XC instance, send a request for a compatibility check to Sitecore Support.
Note that the ZIP file contents must be extracted to locate installation instructions and related files inside. The hotfix must be installed on a CM instance and then synced with other instances using standard development practices.