Июнь 23, 2026
Теги: Магазин
Заказы из битрикс в 1с выгружаются через папку /upload/1c_exchange, при этом папка очищается после процесса выгрузки. В отличие от выгрузки каталога из 1с в битрикс, нет какой-то константы наподобие BX_CATALOG_IMPORT_1C_PRESERVE, которая позволяла бы сохранять копии папки /upload/1c_exchange.
Данный метод не претендует на полную точность, т.к. название файла и прочее, что находится в папке /upload/1c_exchange не сохраняется, но он использует тот же метод создания xml, что и компонент "bitrix:sale.export.1c", используемый при выгрузке заказов.
Константы задают папку для выгрузки заказов от корня сайта и максимальное количество заказов для сохранения, файлы сверх указанного количества автоматически удаляются.
<?php
namespace Partner;
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderSaved',
'Partner\OrderXmlLog::onSaleOrderSaved'
);
class OrderXmlLog
{
const orderXmlLogFolder = '1c_logs';
const orderXmlLogMax = 10;
public static function onSaleOrderSaved(\Bitrix\Main\Event $event)
{
if(!$event->getParameter("IS_NEW"))
return;
if(!static::orderXmlLogFolder || !is_dir($_SERVER['DOCUMENT_ROOT'].'/'.static::orderXmlLogFolder))
return;
$order = $event->getParameter("ENTITY");
ob_start();
\CSaleExport::ExportOrders2Xml(array('ID' => $order->getId()));
$xml = ob_get_contents();
ob_end_clean();
file_put_contents($_SERVER['DOCUMENT_ROOT'].'/'.static::orderXmlLogFolder.'/'.$order->getId().'.xml',$xml);
static::clearOldLogs();
}
public static function clearOldLogs()
{
if(!static::orderXmlLogFolder || !is_dir($_SERVER['DOCUMENT_ROOT'].'/'.static::orderXmlLogFolder))
return;
$files = scandir($_SERVER['DOCUMENT_ROOT'].'/'.static::orderXmlLogFolder);
$fileList = [];
foreach($files as $file)
{
if(in_array($file,['.','..','.htaccess']))
continue;
$fileList[pathinfo($file,PATHINFO_FILENAME)] = $file;
}
krsort($fileList);
$i=static::orderXmlLogMax;
foreach($fileList as $file)
{
if($i>0)
{
$i--;
continue;
}
unlink($_SERVER['DOCUMENT_ROOT'].'/'.static::orderXmlLogFolder.'/'.$file);
}
}
}