diff -Nuar a/vendor/magento/module-configurable-product/Model/ResourceModel/Product/Indexer/Price/Configurable.php b/vendor/magento/module-configurable-product/Model/ResourceModel/Product/Indexer/Price/Configurable.php
index b7bbf7aa187..5a22ad8238a 100644
--- a/vendor/magento/module-configurable-product/Model/ResourceModel/Product/Indexer/Price/Configurable.php
+++ b/vendor/magento/module-configurable-product/Model/ResourceModel/Product/Indexer/Price/Configurable.php
@@ -3,9 +3,13 @@
  * Copyright © Magento, Inc. All rights reserved.
  * See COPYING.txt for license details.
  */
+declare(strict_types=1);
+
 namespace Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price;
 
+use Magento\Catalog\Model\ResourceModel\Product\BaseSelectProcessorInterface;
 use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\BasePriceModifier;
+use Magento\Framework\DB\Select;
 use Magento\Framework\Indexer\DimensionalIndexerInterface;
 use Magento\Framework\EntityManager\MetadataPool;
 use Magento\Catalog\Model\Indexer\Product\Price\TableMaintainer;
@@ -13,10 +17,8 @@ use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\Query\BaseFinalPri
 use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\IndexTableStructureFactory;
 use Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\IndexTableStructure;
 use Magento\Framework\App\Config\ScopeConfigInterface;
-use Magento\Store\Model\ScopeInterface;
 use Magento\Framework\App\ObjectManager;
 use Magento\CatalogInventory\Model\Stock;
-use Magento\CatalogInventory\Model\Configuration;
 
 /**
  * Configurable Products Price Indexer Resource model
@@ -75,6 +77,11 @@ class Configurable implements DimensionalIndexerInterface
      */
     private $scopeConfig;
 
+    /**
+     * @var BaseSelectProcessorInterface
+     */
+    private $baseSelectProcessor;
+
     /**
      * @param BaseFinalPrice $baseFinalPrice
      * @param IndexTableStructureFactory $indexTableStructureFactory
@@ -85,6 +92,9 @@ class Configurable implements DimensionalIndexerInterface
      * @param bool $fullReindexAction
      * @param string $connectionName
      * @param ScopeConfigInterface $scopeConfig
+     * @param BaseSelectProcessorInterface|null $baseSelectProcessor
+     *
+     * @SuppressWarnings(PHPMD.ExcessiveParameterList)
      */
     public function __construct(
         BaseFinalPrice $baseFinalPrice,
@@ -95,7 +105,8 @@ class Configurable implements DimensionalIndexerInterface
         BasePriceModifier $basePriceModifier,
         $fullReindexAction = false,
         $connectionName = 'indexer',
-        ScopeConfigInterface $scopeConfig = null
+        ScopeConfigInterface $scopeConfig = null,
+        ?BaseSelectProcessorInterface $baseSelectProcessor = null
     ) {
         $this->baseFinalPrice = $baseFinalPrice;
         $this->indexTableStructureFactory = $indexTableStructureFactory;
@@ -106,6 +117,8 @@ class Configurable implements DimensionalIndexerInterface
         $this->fullReindexAction = $fullReindexAction;
         $this->basePriceModifier = $basePriceModifier;
         $this->scopeConfig = $scopeConfig ?: ObjectManager::getInstance()->get(ScopeConfigInterface::class);
+        $this->baseSelectProcessor = $baseSelectProcessor ?:
+            ObjectManager::getInstance()->get(BaseSelectProcessorInterface::class);
     }
 
     /**
@@ -199,15 +212,7 @@ class Configurable implements DimensionalIndexerInterface
             []
         );
 
-        // Does not make sense to extend query if out of stock products won't appear in tables for indexing
-        if ($this->isConfigShowOutOfStock()) {
-            $select->join(
-                ['si' => $this->getTable('cataloginventory_stock_item')],
-                'si.product_id = l.product_id',
-                []
-            );
-            $select->where('si.is_in_stock = ?', Stock::STOCK_IN_STOCK);
-        }
+        $this->baseSelectProcessor->process($select);
 
         $select->columns(
             [
@@ -297,17 +302,4 @@ class Configurable implements DimensionalIndexerInterface
     {
         return $this->resource->getTableName($tableName, $this->connectionName);
     }
-
-    /**
-     * Is flag Show Out Of Stock setted
-     *
-     * @return bool
-     */
-    private function isConfigShowOutOfStock(): bool
-    {
-        return $this->scopeConfig->isSetFlag(
-            Configuration::XML_PATH_SHOW_OUT_OF_STOCK,
-            ScopeInterface::SCOPE_STORE
-        );
-    }
 }
diff -Nuar a/vendor/magento/module-configurable-product/Model/ResourceModel/Product/Indexer/Price/StockStatusBaseSelectProcessor.php b/vendor/magento/module-configurable-product/Model/ResourceModel/Product/Indexer/Price/StockStatusBaseSelectProcessor.php
new file mode 100644
index 00000000000..b5cbaa57858
--- /dev/null
+++ b/vendor/magento/module-configurable-product/Model/ResourceModel/Product/Indexer/Price/StockStatusBaseSelectProcessor.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price;
+
+use Magento\CatalogInventory\Model\Stock;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\DB\Select;
+use Magento\Catalog\Model\ResourceModel\Product\BaseSelectProcessorInterface;
+use Magento\CatalogInventory\Api\StockConfigurationInterface;
+
+/**
+ * A Select object processor.
+ *
+ * Adds stock status limitations to a given Select object.
+ */
+class StockStatusBaseSelectProcessor implements BaseSelectProcessorInterface
+{
+    /**
+     * @var ResourceConnection
+     */
+    private $resource;
+
+    /**
+     * @var StockConfigurationInterface
+     */
+    private $stockConfig;
+
+    /**
+     * @param ResourceConnection $resource
+     * @param StockConfigurationInterface $stockConfig
+     */
+    public function __construct(
+        ResourceConnection $resource,
+        StockConfigurationInterface $stockConfig
+    ) {
+        $this->resource = $resource;
+        $this->stockConfig = $stockConfig;
+    }
+
+    /**
+     * @inheritdoc
+     */
+    public function process(Select $select)
+    {
+        // Does not make sense to extend query if out of stock products won't appear in tables for indexing
+        if ($this->stockConfig->isShowOutOfStock()) {
+            $select->join(
+                ['si' => $this->resource->getTableName('cataloginventory_stock_item')],
+                'si.product_id = l.product_id',
+                []
+            );
+            $select->join(
+                ['si_parent' => $this->resource->getTableName('cataloginventory_stock_item')],
+                'si_parent.product_id = l.parent_id',
+                []
+            );
+            $select->where('si.is_in_stock = ?', Stock::STOCK_IN_STOCK);
+            $select->orWhere('si_parent.is_in_stock = ?', Stock::STOCK_OUT_OF_STOCK);
+        }
+
+        return $select;
+    }
+}
diff -Nuar a/vendor/magento/module-configurable-product/etc/di.xml b/vendor/magento/module-configurable-product/etc/di.xml
index c8a278df92d..9f01af66f97 100644
--- a/vendor/magento/module-configurable-product/etc/di.xml
+++ b/vendor/magento/module-configurable-product/etc/di.xml
@@ -198,6 +198,7 @@
         <arguments>
             <argument name="tableStrategy" xsi:type="object">Magento\Catalog\Model\ResourceModel\Product\Indexer\TemporaryTableStrategy</argument>
             <argument name="connectionName" xsi:type="string">indexer</argument>
+            <argument name="baseSelectProcessor" xsi:type="object">Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price\StockStatusBaseSelectProcessor</argument>
         </arguments>
     </type>
     <type name="Magento\ConfigurableProduct\Plugin\Model\ResourceModel\Product">
