Деактивировать товар если не активны SKU

Кастомный обмен с 1С впилился в дефолтный компонент catalog.import.1c, но у нас несколько БД сливают информацию о товарах, поэтому из обмена было не понятно какие товары должны отображаться, а какие нет.

Вот пример sql запроса, который включает элемент, у которого хоть 1 активный SKU.
Он же делает наоборот: отключает элемент если все SKU неактивны.

/**
     * catalog_import_1C_finish
     * - событие, вызываемое после окончания обмена одним XML-файлом.
     * @param  mixed $arParams - Параметры подключения компонента обмена.
     * @param  mixed $ABS_FILE_NAME - Полный путь к XML-файлу обмена.
     * @return void
     */
    function catalog_import_1C_finish($arParams, $ABS_FILE_NAME)
    {
        if(stripos($ABS_FILE_NAME,"offers.xml"))
        {
            global $DB;
            $strSql = "CREATE TEMPORARY TABLE `sku_active`
                SELECT `ID`,count(DISTINCT CASE WHEN `ACTIVE` = 'Y' THEN `ID` END) as `COUNT`, substr(`XML_ID`, 1, INSTR(`XML_ID`, '#')-1) AS `PARENT_XML_ID`
                FROM `b_iblock_element`
                WHERE `XML_ID` LIKE '%#%'
                GROUP BY `PARENT_XML_ID`;
            ";
            $DB->Query($strSql, true);

            $strSql = "UPDATE `b_iblock_element` AS `T1`
                SET `T1`.`ACTIVE` = (SELECT CASE WHEN `T2`.`COUNT`>0 THEN 'Y' ELSE 'N' END AS `ACTIVE` FROM `sku_active` AS `T2` WHERE `T1`.`XML_ID` = `T2`.`PARENT_XML_ID`)
                WHERE `T1`.`XML_ID` NOT LIKE '%#%'
            ";
            $DB->Query($strSql, true);
        }
    }


p.s. для оптовой компании решение зашло.

Кастомизация импорта каталога из 1С в Bitrix

Для начала ссылки на сторонние статьи:
Итак, из всех статей выше мы можем заключить, что обмен проходит через файл /bitrix/admin/1c_exchange.php
посмотрев этот файл мы понимаем, что импорт каталога происходит через компонент catalog.import.1c

Вынесем этот компонент для кастомизации (перенесём папку /bitrix/components/bitrix/catalog.import.1cв /local/components/bitrix/catalog.import.1c)
Далее смотрим в созданной папке файл component.php и прочитав немного код, понимаем, что вся логика происходит в классе CIBlockCMLImport... значит нам нужно "отпочковаться" от него и откорректировать некоторые методы (например ImportSection и ImportElement - отвечающие за сбору массива из XML)

Собственно делаем вышеописанное, создав в папке /local/components/bitrix/catalog.import.1c/ файл EX_CIBlockCMLImport.php со следующим кодом:
<?php
use Bitrix\Main,
   Bitrix\Iblock,
   Bitrix\Catalog;

IncludeModuleLangFile(__FILE__);

/**
 * дорабатываем класс под свои нужды
 */
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/classes/general/cml2.php");

class EX_CIBlockCMLImport extends CIBlockCMLImport
{
   // Обмен разделами
   function ImportSection($xml_tree_id, $IBLOCK_ID, $parent_section_id)
   {
      
   }
   // Обмен элементами
   function ImportElement($arXMLElement, &$counter, $bWF, $arParent)
   {

   }
}
Расширяемый класс CIBlockCMLImport находится в файле /bitrix/modules/iblock/classes/general/cml2.php
Далее нам следует заменить ВСЕ вызовы класса CIBlockCMLImport в файле /local/components/bitrix/catalog.import.1c/component.php на строку EX_CIBlockCMLImport, и в начале этого файла подключить наш файл строчкой
require_once(__DIR__."/EX_CIBlockCMLImport.php"); // подключаем расширение класса

Всё! Теперь обмен с 1С будет происходить через наш класс EX_CIBlockCMLImport где мы можем легко изменить любую логику скопировав соответствующий метод из файла /bitrix/modules/iblock/classes/general/cml2.php Очень сжато и кратко это и есть весь ужас и недопонимание кастомизации обмена каталогом БУС и 1С.

Если есть вопросы или что-то написано не верно - прошу в комментарии!

Поддерживаемые узлы ecommerce_2 в импорте каталога из 1С в Bitrix

Расположение языковых конструкций в файле:
/bitrix/modules/iblock/lang/ru/classes/general/cml2.php
<?
$MESS["IBLOCK_XML2_SUM_FORMAT"] = "ФорматСуммы";
$MESS["IBLOCK_XML2_SUM_FORMAT_DELIM"] = "ЧРД";
$MESS["IBLOCK_XML2_CATALOG_NAME"] = "1С Каталог";
$MESS["IBLOCK_XML2_CATALOG_SECTION_NAME"] = "Группа";
$MESS["IBLOCK_XML2_CATALOG_ELEMENT_NAME"] = "Товар";
$MESS["IBLOCK_XML2_ATTRIBUTES"] = "Характеристики";
$MESS["IBLOCK_XML2_ITEM_ATTRIBUTES"] = "ХарактеристикиТовара";
$MESS["IBLOCK_XML2_ITEM_ATTRIBUTE"] = "ХарактеристикаТовара";
$MESS["IBLOCK_XML2_TRAITS"] = "Реквизиты";
$MESS["IBLOCK_XML2_TRAITS_VALUES"] = "ЗначенияРеквизитов";
$MESS["IBLOCK_XML2_BASE_UNIT"] = "БазоваяЕдиница";
$MESS["IBLOCK_XML2_BASE_UNIT_NAME"] = "Базовая единица";
$MESS["IBLOCK_XML2_TAXES"] = "Ставки налогов";
$MESS["IBLOCK_XML2_TAXES_VALUES"] = "СтавкиНалогов";
$MESS["IBLOCK_XML2_TAX_VALUE"] = "Ставка";
$MESS["IBLOCK_XML2_ANONS"] = "Анонс";
$MESS["IBLOCK_XML2_DETAIL"] = "Описание";
$MESS["IBLOCK_XML2_ARTICLE"] = "Артикул";
$MESS["IBLOCK_XML2_MANUFACTURER"] = "Изготовитель";
$MESS["IBLOCK_XML2_PROP_MANUFACTURER"] = "Производитель";
$MESS["IBLOCK_XML2_BX_TAGS"] = "БитриксТеги";
$MESS["IBLOCK_XML2_BX_WORKFLOW"] = "БитриксДокументооборот";
$MESS["IBLOCK_XML2_BX_DETAIL_URL"] = "БитриксURLДеталь";
$MESS["IBLOCK_XML2_BX_SECTION_URL"] = "БитриксURLРаздел";
$MESS["IBLOCK_XML2_BX_LIST_URL"] = "БитриксURLСписок";
$MESS["IBLOCK_XML2_BX_CANONICAL_URL"] = "БитриксURLКанонический";
$MESS["IBLOCK_XML2_BX_DEFAULT_VALUE"] = "БитриксЗначениеПоУмолчанию";
$MESS["IBLOCK_XML2_BX_INDEX_SECTIONS"] = "БитриксИндексироватьРазделы";
$MESS["IBLOCK_XML2_BX_INDEX_ELEMENTS"] = "БитриксИндексироватьЭлементы";
$MESS["IBLOCK_XML2_BX_PICTURE"] = "БитриксКартинка";
$MESS["IBLOCK_XML2_BX_DETAIL_PICTURE"] = "БитриксКартинкаДетальная";
$MESS["IBLOCK_XML2_BX_CODE"] = "БитриксКод";
$MESS["IBLOCK_XML2_BX_FIELDS_COUNT"] = "БитриксКоличествоПолей";
$MESS["IBLOCK_XML2_BX_COLUMNS"] = "БитриксКолонок";
$MESS["IBLOCK_XML2_BX_SECTION_NAME"] = "БитриксНазваниеРаздела";
$MESS["IBLOCK_XML2_BX_SECTIONS_NAME"] = "БитриксНазваниеРазделов";
$MESS["IBLOCK_XML2_BX_ELEMENT_NAME"] = "БитриксНазваниеЭлемента";
$MESS["IBLOCK_XML2_BX_ELEMENTS_NAME"] = "БитриксНазваниеЭлементов";
$MESS["IBLOCK_XML2_LABELS"] = "БитриксПодписи";
$MESS["IBLOCK_XML2_LABEL"] = "БитриксПодпись";
$MESS["IBLOCK_XML2_BX_WITH_DESCRIPTION"] = "БитриксОписаниеРазрешено";
$MESS["IBLOCK_XML2_BX_SEARCH"] = "БитриксПоискРазрешен";
$MESS["IBLOCK_XML2_BX_USER_TYPE"] = "БитриксРасширениеТипа";
$MESS["IBLOCK_XML2_BX_USER_TYPE_SETTINGS"] = "БитриксНастройкиРасширенияТипа";
$MESS["IBLOCK_XML2_BX_LINKED_IBLOCK"] = "БитриксСвязанныйИнфоблок";
$MESS["IBLOCK_XML2_BX_SORT"] = "БитриксСортировка";
$MESS["IBLOCK_XML2_BX_ROWS"] = "БитриксСтрок";
$MESS["IBLOCK_XML2_BX_PROPERTY_TYPE"] = "БитриксТипСвойства";
$MESS["IBLOCK_XML2_BX_LIST_TYPE"] = "БитриксТипСписка";
$MESS["IBLOCK_XML2_BX_FILE_EXT"] = "БитриксТипыФайлов";
$MESS["IBLOCK_XML2_BX_FILTER"] = "БитриксФильтрРазрешен";
$MESS["IBLOCK_XML2_BX_IS_REQUIRED"] = "БитриксОбязательное";
$MESS["IBLOCK_XML2_BX_PROPERTY_FEATURE_LIST"] = "БитриксРасширенныеПараметры";
$MESS["IBLOCK_XML2_CURRENCY"] = "Валюта";
$MESS["IBLOCK_XML2_VALUES_TYPES"] = "ТипыЗначений";
$MESS["IBLOCK_XML2_VALUES_TYPE"] = "ТипЗначений";
$MESS["IBLOCK_XML2_TYPE"] = "Тип";
$MESS["IBLOCK_XML2_TYPE_LIST"] = "Справочник";
$MESS["IBLOCK_XML2_TYPE_NUMBER"] = "Число";
$MESS["IBLOCK_XML2_TYPE_STRING"] = "Строка";
$MESS["IBLOCK_XML2_USER_TYPE_DATE"] = "Даты";
$MESS["IBLOCK_XML2_USER_TYPE_DATETIME"] = "ДатаВремя";
$MESS["IBLOCK_XML2_CHOICE"] = "Вариант";
$MESS["IBLOCK_XML2_CHOICE_VALUES"] = "ВариантыЗначений";
$MESS["IBLOCK_XML2_CHOICE_VALUE"] = "ВариантЗначения";
$MESS["IBLOCK_XML2_SCHEMA_VERSION"] = "ВерсияСхемы";
$MESS["IBLOCK_XML2_PARAMS_PACKAGE"] = "ПараметрПакета";
$MESS["IBLOCK_XML2_OWNER"] = "Владелец";
$MESS["IBLOCK_XML2_GROUP"] = "Группа";
$MESS["IBLOCK_XML2_GROUPS"] = "Группы";
$MESS["IBLOCK_XML2_TIMESTAMP"] = "ДатаФормирования";
$MESS["IBLOCK_XML2_MEASURE"] = "Единица";
$MESS["IBLOCK_XML2_VALUE"] = "Значение";
$MESS["IBLOCK_XML2_VALUE_ID"] = "ИдЗначения";
$MESS["IBLOCK_XML2_PROPERTIES_VALUES"] = "ЗначенияСвойств";
$MESS["IBLOCK_XML2_PROPERTY_VALUES"] = "ЗначенияСвойства";
$MESS["IBLOCK_XML2_PROPERTY_VALUE"] = "ЗначениеСвойства";
$MESS["IBLOCK_XML2_ID_1C_SITE"] = "ИдСайта";
$MESS["IBLOCK_XML2_ID_SITE_1C"] = "СистемныйИд";
$MESS["IBLOCK_XML2_ID"] = "Ид";
$MESS["IBLOCK_XML2_CATALOG_ID"] = "ИдКаталога";
$MESS["IBLOCK_XML2_METADATA_ID"] = "ИдКлассификатора";
$MESS["IBLOCK_XML2_PRICE_TYPE_ID"] = "ИдТипаЦены";
$MESS["IBLOCK_XML2_PICTURE"] = "Картинка";
$MESS["IBLOCK_XML2_PICTURES"] = "Картинки";
$MESS["IBLOCK_XML2_PREVIEW_PICTURE"] = "Картинка анонса";
$MESS["IBLOCK_XML2_CATALOG"] = "Каталог";
$MESS["IBLOCK_XML2_METADATA"] = "Классификатор";
$MESS["IBLOCK_XML2_AMOUNT"] = "Количество";
$MESS["IBLOCK_XML2_COMMERCE_INFO"] = "КоммерческаяИнформация";
$MESS["IBLOCK_XML2_COEFF"] = "Коэффициент";
$MESS["IBLOCK_XML2_MULTIPLE"] = "Множественное";
$MESS["IBLOCK_XML2_FOR_CATALOG"] = "ДляТоваров";
$MESS["IBLOCK_XML2_FOR_OFFERS"] = "ДляПредложений";
$MESS["IBLOCK_XML2_NAME"] = "Наименование";
$MESS["IBLOCK_XML2_TAX"] = "Налог";
$MESS["IBLOCK_XML2_START_TIME"] = "Начало активности";
$MESS["IBLOCK_XML2_END_TIME"] = "Окончание активности";
$MESS["IBLOCK_XML2_DESCRIPTION"] = "Описание";
$MESS["IBLOCK_XML2_TITLE"] = "ОфициальноеНаименование";
$MESS["IBLOCK_XML2_OFFER_LIST"] = "ПакетПредложений";
$MESS["IBLOCK_XML2_BY_DEFAULT"] = "ПоУмолчанию";
$MESS["IBLOCK_XML2_FULL_TITLE"] = "ПолноеНаименование";
$MESS["IBLOCK_XML2_FULL_TITLE2"] = "Полное наименование";
$MESS["IBLOCK_XML2_OFFER"] = "Предложение";
$MESS["IBLOCK_XML2_OFFERS"] = "Предложения";
$MESS["IBLOCK_XML2_VIEW"] = "Представление";
$MESS["IBLOCK_XML2_PROPERTIES"] = "Свойства";
$MESS["IBLOCK_XML2_PROPERTY"] = "Свойство";
$MESS["IBLOCK_XML2_SERIALIZED"] = "Сериализовано";
$MESS["IBLOCK_XML2_SYMBOL_CODE"] = "Символьный код";
$MESS["IBLOCK_XML2_UPDATE_ONLY"] = "СодержитТолькоИзменения";
$MESS["IBLOCK_XML2_SORT"] = "Сортировка";
$MESS["IBLOCK_XML2_STATUS"] = "Статус";
$MESS["IBLOCK_XML2_PRICE_TYPE"] = "ТипЦены";
$MESS["IBLOCK_XML2_PRICE_TYPES"] = "ТипыЦен";
$MESS["IBLOCK_XML2_POSITION"] = "Товар";
$MESS["IBLOCK_XML2_POSITIONS"] = "Товары";
$MESS["IBLOCK_XML2_DELETED"] = "Удален";
$MESS["IBLOCK_XML2_IN_SUM"] = "УчтеноВСумме";
$MESS["IBLOCK_XML2_PRICE"] = "Цена";
$MESS["IBLOCK_XML2_PRICE_FOR_ONE"] = "ЦенаЗаЕдиницу";
$MESS["IBLOCK_XML2_QUANTITY_FROM"] = "КоличествоОт";
$MESS["IBLOCK_XML2_QUANTITY_TO"] = "КоличествоДо";
$MESS["IBLOCK_XML2_PRICES"] = "Цены";
$MESS["IBLOCK_XML2_BAR_CODE"] = "ШтрихКод";
$MESS["IBLOCK_XML2_BAR_CODE2"] = "Штрихкод";
$MESS["IBLOCK_XML2_CATALOG_ELEMENT"] = "Элемент каталога";
$MESS["IBLOCK_XML2_PCS"] = "шт";
$MESS["IBLOCK_XML2_RUB"] = "руб";
$MESS["IBLOCK_XML2_TYPE_ADD_ERROR"] = "Ошибка создания типа информационных блоков.";
$MESS["IBLOCK_XML2_CURRENCY_ERROR"] = "При импорте встретилась валюта цены содержащая не латинские буквы. Цена была импортирована с валютой RUB.";
$MESS["IBLOCK_XML2_DISCOUNTS"] = "СкидкиНаценки";
$MESS["IBLOCK_XML2_DISCOUNT_CONDITION"] = "Условие";
$MESS["IBLOCK_XML2_DISCOUNT_COND_VOLUME"] = "Количество одного товара в документе превысило";
$MESS["IBLOCK_XML2_DISCOUNT_COND_VALUE"] = "ЗначениеУсловия";
$MESS["IBLOCK_XML2_DISCOUNT_COND_PERCENT"] = "Процент";
$MESS["IBLOCK_XML2_WEIGHT"] = "Вес";
$MESS["IBLOCK_XML2_BX_ACTIVE"] = "БитриксАктивность";
$MESS["IBLOCK_XML2_FILE"] = "Файл";
$MESS["IBLOCK_XML2_FILE_DESCRIPTION"] = "ОписаниеФайла";
$MESS["IBLOCK_XML2_FILES"] = "Файлы";
$MESS["IBLOCK_XML2_HTML_DESCRIPTION"] = "ОписаниеВФорматеHTML";
$MESS["IBLOCK_XML2_GROUPS_PROPERTIES"] = "СвойстваГрупп";
$MESS["IBLOCK_XML2_BX_SHOW_IN_LIST"] = "БитриксПоказыватьВСписке";
$MESS["IBLOCK_XML2_BX_EDIT_IN_LIST"] = "БитриксРедактироватьВСписке";
$MESS["IBLOCK_XML2_BX_SETTINGS"] = "БитриксНастройки";
$MESS["IBLOCK_XML2_BX_ORIGINAL_NAME"] = "БитриксОригинальноеНазвание";
$MESS["IBLOCK_XML2_BX_URL"] = "БитриксURL";
$MESS["IBLOCK_XML2_BX_FILE_SIZE"] = "БитриксРазмерФайла";
$MESS["IBLOCK_XML2_BX_FILE_WIDTH"] = "БитриксШиринаИзображения";
$MESS["IBLOCK_XML2_BX_FILE_HEIGHT"] = "БитриксВысотаИзображения";
$MESS["IBLOCK_XML2_BX_FILE_CONTENT_TYPE"] = "БитриксТипФайла";
$MESS["IBLOCK_XML2_UF_ERROR"] = "Ошибка импорта пользовательского свойства (xml_id: #XML_ID#): #ERROR_TEXT#";
$MESS["IBLOCK_XML2_STORE"] = "Склад";
$MESS["IBLOCK_XML2_STORES"] = "Склады";
$MESS["IBLOCK_XML2_STORE_ADDRESS"] = "Адрес";
$MESS["IBLOCK_XML2_STORE_AMOUNT_LIST"] = "КоличествоНаСкладах";
$MESS["IBLOCK_XML2_STORE_AMOUNT"] = "КоличествоНаСкладе";
$MESS["IBLOCK_XML2_STORE_ID"] = "ИдСклада";
$MESS["IBLOCK_XML2_STORE_DESCRIPTION"] = "Комментарий";
$MESS["IBLOCK_XML2_STORE_CANTACTS"] = "Контакты";
$MESS["IBLOCK_XML2_STORE_CONTACTS"] = "Контакты";
$MESS["IBLOCK_XML2_MULTI_STORE_IMPORT_ERROR"] = "Количество импортированных складов превышает разрешённое для данной редакции.";
$MESS["IBLOCK_XML2_SECTION_PROPERTIES"] = "СвойстваЭлементов";
$MESS["IBLOCK_XML2_SMART_FILTER"] = "УмныйФильтр";
$MESS["IBLOCK_XML2_SMART_FILTER_DISPLAY_TYPE"] = "ТипОтображения";
$MESS["IBLOCK_XML2_SMART_FILTER_DISPLAY_EXPANDED"] = "ПоказатьРазвёрнутым";
$MESS["IBLOCK_XML2_SMART_FILTER_HINT"] = "Подсказка";
$MESS["IBLOCK_XML2_PRICE_SB_ADD_ERROR"] = "В редакции Малый Бизнес нет возможности иметь более одного типа цены. Настройте выгрузку из 1С или перейдите на другую редакцию БУС.";
$MESS["IBLOCK_XML2_PRICE_DUP_ERROR"] = "В выгрузке настроены цены с одинаковым названием. Продолжение обмена невозможно.";
$MESS["IBLOCK_XML2_STORE_CONTACT"] = "Контакт";
$MESS["IBLOCK_XML2_STORE_PHONE"] = "Телефон";
$MESS["IBLOCK_XML2_PRODUCTS_SETS"] = "НаборыТоваров";
$MESS["IBLOCK_XML2_PRODUCT_SETS"] = "НаборыТовара";
$MESS["IBLOCK_XML2_PRODUCT_SET"] = "Набор";
$MESS["IBLOCK_XML2_PRODUCT_SET_ITEM"] = "ЭлементНабора";
$MESS["IBLOCK_XML2_INHERITED_TEMPLATES"] = "НаследуемыеШаблоны";
$MESS["IBLOCK_XML2_TEMPLATE"] = "Шаблон";
$MESS["IBLOCK_XML2_OFFERS_CHANGE"] = "ИзмененияПакетаПредложений";
$MESS["IBLOCK_XML2_VERSION"] = "НомерВерсии";
$MESS["IBLOCK_XML2_DELETE_MARK"] = "ПометкаУдаления";
$MESS["IBLOCK_XML2_RESTS"] = "Остатки";
$MESS["IBLOCK_XML2_REST"] = "Остаток";
$MESS["IBLOCK_XML2_BASE_UNITS"] = "ЕдиницыИзмерения";
$MESS["IBLOCK_XML2_CODE"] = "Код";
$MESS["IBLOCK_XML2_FULL_NAME"] = "НаименованиеПолное";
$MESS["IBLOCK_XML2_SHORT_NAME"] = "НаименованиеКраткое";
$MESS["IBLOCK_XML2_INTL_SHORT_NAME"] = "МеждународноеСокращение";
$MESS["IBLOCK_XML2_BASE_UNIT_ADD_ERROR"] = "Ошибка добавления новой единицы измерения (код единицы: #CODE#).";
$MESS["IBLOCK_XML2_EXTERNAL"] = "Внешний";
$MESS["IBLOCK_XML2_HBLOCK_NAME_IS_INVALID"] = "Название справочника должно начинаться с буквы и состоять только из латинских букв и цифр.";
$MESS["IBLOCK_XML2_MODULE_CATALOG_IS_ABSENT"] = "Отсутствует модуль \"Торговый каталог\". Импорт торговых предложений и цен невозможен.";
$MESS["IBLOCK_XML2_LINK"] = "Ссылка";
$MESS["IBLOCK_XML2_FULL_DESCRIPTION"] = "ПолноеОписание";
$MESS["IBLOCK_XML2_TEMPORARY_TABLE_EXIST_ERROR"] = "Временная таблица не существует";
?>