После синхронизации CRM с сайтом компонент bitrix:sale.export.1c (проверить можно site.ru/bitrix/admin/1c_exchange.php?type=sale&mode=query) начинает отдавать ошибку: «failure Ошибка проверки источника запроса. Обновите модуль обмена»

Быстрым решением является установка опций:

COption::SetOptionString('catalog', 'DEFAULT_SKIP_SOURCE_CHECK', 'Y'); 
COption::SetOptionString('sale', 'secure_1c_exchange', 'N');

и отказ от синхронизации заказов со сделками CRM bitrix24.

Техническая поддержка битрикса заявляется следующее: «Чтобы не возникало данной проблемы, вам надо в 1с установить новое дополнение модуля обмена версии 4.х.х.х со страницы http://1c.1c-bitrix.ru/ecommerce/download.php».

Как вам? По-моему — круто. А если у вас сильно кастомизирован модуль обмена в 1С и вы не можете так просто обновить его? То есть, ставь новый модуль обмена и всё будет работать — отличный маркетинг.

Конечно, можно плюнуть и поискать другую CRM. Но мы не ищем лёгкий путей.

Решение

В общем, я придумал способ как эти 2 настройки держать в нужным мне флагах. То есть, что бы не устанавливали — DEFAULT_SKIP_SOURCE_CHECK всегда будет равен Y, а secure_1c_exchangeN.

Как вы могли догадаться, решение — обработчик.

Вот код:

class OptionSetHandler {
 
    private static $prefixNameEvent = 'OnAfterSetOption_';
 
    protected static $setOptions = array();
 
    /**
     * @param \Bitrix\Main\Event $e
     */
    public static function onAfterSetOption(\Bitrix\Main\Event $e)
    {
        $optionValues = array(
            'secure_1c_exchange' => array('sale', 'N'),
            'DEFAULT_SKIP_SOURCE_CHECK' => array('catalog', 'Y')
        );
 
        $optionName = str_replace(self::$prefixNameEvent, '', $e->getEventType());
 
        if(!isset(self::$setOptions[$optionName]) && isset($optionValues[$optionName])) {
            self::$setOptions[$optionName] = 1;
            \Bitrix\Main\Config\Option::set($optionValues[$optionName][0], $optionName, $optionValues[$optionName][1]);
        }
    }
 
}

Ну и подвесим обработчики на него:

\Bitrix\Main\EventManager::getInstance()->addEventHandler('main', 'OnAfterSetOption_secure_1c_exchange',
    array('OptionSetHandler', 'onAfterSetOption'));
 
\Bitrix\Main\EventManager::getInstance()->addEventHandler('main', 'OnAfterSetOption_DEFAULT_SKIP_SOURCE_CHECK',
    array('OptionSetHandler', 'onAfterSetOption'));