При настройке обмена заказами между сайтом на 1С-Битрикс и типовой конфигурацией 1С:Управление торговлей 11.4 часто возникает необходимость передачи дополнительных данных, таких как артикул товара. Многие начинающие разработчики совершают ошибку, пытаясь найти «компонент», отвечающий за выгрузку заказа, и редактировать файлы ядра. Давайте разберем, как правильно реализовать эту задачу, не рискуя работоспособностью вашего интернет-магазина.
Первое, что важно усвоить: обмен заказами и обмен каталогом — это два принципиально разных процесса в Битриксе. Компоненты, которые вы видите в публичной части сайта (например, bitrix:catalog.import.1c), отвечают за импорт каталога на сайт. Обмен заказами, в свою очередь, полностью управляется модулем sale (Интернет-магазин).
Файл /bitrix/admin/1c_exchange.php является лишь входной точкой (контроллером). Вся логика формирования XML-пакета, который отправляется в 1С, скрыта внутри модуля. Любые изменения, внесенные вами в файлы внутри папки /bitrix/modules/, будут полностью удалены при первом же автоматическом обновлении системы. Поэтому мы будем использовать только официально рекомендованный способ — механизм событий.
Перед внесением изменений, давайте проанализируем, что именно уходит из Битрикса. Обмен происходит по стандарту CommerceML. Чтобы понять, передается ли артикул, нам нужно перехватить XML-ответ.
sale его не формирует.Самый безопасный и правильный способ «добавить» артикул в выгрузку — использовать событие OnSaleOrderBeforeExport. Это событие позволяет перехватить XML-объект заказа в момент его формирования и добавить в него необходимые данные до того, как они будут отправлены в 1С.
Вам необходимо создать (или отредактировать, если уже есть) файл /bitrix/php_interface/init.php. В нем мы пропишем обработчик:
// Пример логики обработчика события
AddEventHandler('sale', 'OnSaleOrderBeforeExport', 'MyOnSaleOrderBeforeExport');
function MyOnSaleOrderBeforeExport($order, &$xmlDocument) {
// Получаем список товаров в заказе
$basket = $order->getBasket();
foreach ($basket as $basketItem) {
// Логика получения артикула по ID товара или предложения
$productId = $basketItem->getProductId();
$article = GetArticleById($productId); // Ваша функция получения артикула
// Находим нужный узел в XML и добавляем артикул
// Работа с объектом $xmlDocument производится через DOMDocument или SimpleXMLElement
}
}
Рассмотрим важные аспекты, которые часто упускают из виду:
SKU, а не к родительскому товару. Убедитесь, что вы выбираете правильный ID при поиске артикула.GetProperty соответствующего инфоблока.Заказ клиента.Мы выяснили, что поиск «файла, который нужно исправить» в ядре — это тупиковый путь. Правильный подход — это использование событийного программирования. Это позволит вам гибко изменять данные выгрузки, сохраняя при этом возможность обновления Битрикса без потери ваших наработок. Если вы не имеете опыта в написании обработчиков событий, рекомендуем привлечь специалиста по разработке на 1С-Битрикс, который поможет реализовать логику модификации XML-пакета согласно вашим бизнес-требованиям.