Кастомизация обмена товарами 1С с Битрикс24


Битрикс Версия "Интернет-магазин + CRM", 1с УТ11
У заказчика каталог, который используется для интернет-магазина, он же используется в CRM

Данный товарный каталог, поэтому можно загружать из 1С двумя модулями обмена
  •   для интернет-магазина
  •   синхронизация с Битрикс24
Настроен обмен товарами модулем, который для интернет-магазина, он более совершенный, в модуле для Битрикс24 еще есть недоработки, возникают ошибки (например символьный код не генерируется), и используются спец модули для обмена, например, генерируются множественные свойства.

НО:
Связка у модуля обмена, который для интернет-магазина, по полю "Внешний код", а для Битрикс24, связь по ID товара (причем эти связки хранятся в разных местах в 1С), поэтому модуль обмена "Синхронизация с Битрикс24", не видел товары, которые выгружены другим модулем.

Заказы с Битрикс24 в 1С загружаются, товары в заказе есть, и связка образуется. Новый товар в 1С не создается.
НО:
  • если изменить товары в 1С, то обратно на сайт заказ улетит с пустыми товарами.
  • товары из 1С в Битрикс24 будут открываться только те, для которых есть связка, т.е. которые хоть раз прилетали в заказе
Чтобы связь появилась, пришлось доработать ядро битрикс.
ТП Битрикса ответили, что другого варианта пока нет, но тикет для исправления этой проблемы создан.
Или можно вернуть второй каталог для CRM (будет 1 для магазина, второй для работы в CRM)

Было необходимо, чтобы синхронизация с Б24:
  • не добавляла товары, а только получала ID уже существующего товара на сайте
  • не обновляла, не удаляла товары
  • не обновляла, не удаляла, не создавала разделы
На стороне 1С
Чтобы разделы не создавались, в модуле "Синхронизация с Битрикс24" в дереве групп настроено, что все товары грузятся в корневой раздел.

На стороне Битрикс
папка /bitrix/modules/crm/classes/general/ в ней кастомизируем 3 файла

crm_product.php
кастомизируем 3 метода, остальное оставляем
public static function Add($arFields){ //возвращает ID существующего товара или false
        $ID = false;      
   if(isset($arFields['NAME']) && Loader::includeModule('catalog')){
      $dbRes = CIBlockElement::GetList(
                      array(), 
                      array("IBLOCK_ID"=>10,"=NAME"=>$arFields['NAME']), //фильтр по инфоблоку и имени товара
                      false, 
                      array("nTopCount"=>1), //только 1 элемент
                      array("ID","IBLOCK_ID") //выбираем ID
                );
      if($arRes = $dbRes->Fetch()){
            $ID = intval($arRes["ID"]); //обязательно intval             
      }
   }      
   return $ID;
}
public static function Update($ID, $arFields){ //ничего не обновляем, но возвращаем, что все обновили
        return true;   
}
public static function Delete($ID){ //ничего не удаляем, но возвращаем, что все удалили
        return true;
}
crm_product_section.php
кастомизируем 3 метода, остальное оставляем
public static function Add(&$arFields){
       return 248; //ID одного из раздела
}
public static function Update($ID, &$arFields){ //ничего не обновляем, но возвращаем, что все обновили
       return true;
}
public static function Delete($ID){  //ничего не удаляем, но возвращаем, что все удалили
       return true;
}
crm_product_section_helper.php
кастомизируем 1 метод, остальное оставляем
public function ImportSectionArray($arSectionName, $level = 0){
       return 248; //ID одного из раздела
}

Если товарный каталог небольшой и новые товары появляются редко, то лучше настроить соответствия (идентификаторы Битрикс24) в 1С обработкой или вручную, не модифицируя ядро битрикс.