Главная » Обмен с 1С » Обработчики событий обмена с 1С в Битрикс

Обработчики событий обмена с 1С в Битрикс

Схема обработчиков событий обмена с 1С для собственной бизнес-логики в 1С-Битрикс

Стандартный обмен по CommerceML закрывает базовый сценарий синхронизации, но реальный бизнес-процесс часто требует дополнительной логики — уведомить менеджера о новых товарах, пересчитать связанные данные, отфильтровать нежелательные изменения. Разберём, через какие события можно встроиться в процесс обмена с 1С в 1С-Битрикс.

Событие OnBeforeCatalogImport1C и подобные

<?php

use Bitrix\Main\EventManager;

EventManager::getInstance()->addEventHandler(
    'catalog',
    'OnBeforeCatalogImport1C',
    function (&$arFields) {
        // возможность изменить данные до фактического импорта
        if (isset($arFields['NAME'])) {
            $arFields['NAME'] = trim($arFields['NAME']);
        }
    }
);

Обработчики, срабатывающие перед фактическим сохранением данных от 1С, позволяют модифицировать или проверить входящие данные — например, нормализовать формат текстовых полей или отклонить импорт записи, не соответствующей ожидаемому формату, прежде чем она попадёт в базу в неправильном виде.

Событие после успешного импорта элемента

<?php

EventManager::getInstance()->addEventHandler(
    'catalog',
    'OnAfterCatalogImport1C',
    function ($elementId) {
        // логика, выполняемая после того, как элемент сохранён
        recalculateRelatedData($elementId);
    }
);

Событие после сохранения элемента полезно для запуска связанной логики, зависящей от актуальных данных, — например, пересчёт агрегированного рейтинга раздела при изменении входящих в него товаров, или отправка уведомления о появлении принципиально нового товара, которого раньше не было в каталоге.

Нужна помощь с Битрикс?





    Точный набор доступных событий зависит от версии и конфигурации

    Названия и точный набор событий обмена варьируются между версиями модуля обмена и типом используемой конфигурации 1С — прежде чем писать обработчик, стоит свериться с актуальной документацией или явно найти нужное событие через поиск в коде модуля обмена конкретной установленной версии, а не полагаться на названия событий из устаревших или чужих примеров, которые могли измениться между релизами.

    Фильтрация нежелательных изменений от 1С

    <?php
    
    EventManager::getInstance()->addEventHandler(
        'catalog',
        'OnBeforeCatalogImport1C',
        function (&$arFields) {
            // не позволять обмену деактивировать товары
            // с активным резервом на складе
            if (isset($arFields['ACTIVE']) && $arFields['ACTIVE'] === 'N') {
                if (hasActiveReservations($arFields['XML_ID'])) {
                    $arFields['ACTIVE'] = 'Y';
                    AddMessage2Log('Заблокирована деактивация товара с резервом', '1c.import');
                }
            }
        }
    );

    Для бизнес-правил, не выражаемых стандартными настройками обмена, обработчик события даёт точку контроля над конкретным полем перед его фактическим применением — это позволяет реализовать логику, специфичную для проекта, не изменяя сам протокол CommerceML или модуль обмена, а встраиваясь в предоставленные им точки расширения.

    Производительность обработчиков на массовом обмене

    Обработчик, зарегистрированный на событие обмена, вызывается на каждый обрабатываемый элемент — тяжёлая логика внутри такого обработчика (например, отдельный SQL-запрос или обращение к внешнему API на каждый элемент) многократно умножается на весь объём обмениваемых данных, заметно замедляя весь процесс. Логику внутри обработчика событий обмена стоит держать максимально лёгкой, вынося тяжёлые операции в отдельный агент, запускаемый после завершения самого обмена, а не выполняемый синхронно на каждый элемент внутри самого процесса синхронизации.

    Логирование для диагностики нестандартного поведения обмена

    При использовании кастомных обработчиков стоит явно логировать их срабатывание — при последующем расследовании неожиданного поведения обмена (товар пришёл не с тем значением, чем ожидалось) журнал позволит быстро понять, было ли это результатом работы собственного обработчика или проблемой на стороне самого протокола обмена и данных из 1С.

    Частые ошибки

    • Названия событий взяты из устаревшего примера без проверки актуальной версии. Обработчик не срабатывает, поскольку событие переименовано или отсутствует в текущей конфигурации.
    • Тяжёлая логика выполняется синхронно внутри обработчика на каждый элемент. Заметное замедление всего процесса обмена, умноженное на объём данных.
    • Срабатывание кастомных обработчиков не логируется. Затруднённая диагностика неожиданного поведения при последующем расследовании.

    Итог

    Обработчики событий обмена дают точку расширения для бизнес-логики, не покрытой стандартными настройками CommerceML, — от модификации входящих данных до реализации специфичных правил вроде запрета деактивации товара с активным резервом. Тяжёлую логику внутри таких обработчиков стоит избегать, вынося её в отдельный агент после завершения обмена, чтобы не замедлять сам процесс синхронизации, умноженный на весь объём обрабатываемых данных.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний