Добрый день.
Решал такую проблему нижеописанным способом. Нужно было поймать за руку 1С'ника, который утверждал что выгружает всё как положено.
Можно получить все обмены, к примеру, таким образом: создать событие "OnEndBufferContent" с обработчиком "save1CExchangeToFile" в init.php. В обработчике проверять User Agent на соответствие 1C. В случае успешной проверки:
- сохранить запрос 1С
- сохранить ответ сайта на запрос 1С
- сохранить файлы присланные 1С
Код оформлен в одном файле, чтобы вставить и получить результат. Красиво оформить можно в зависимости от архитектуры проекта.
Единственное не помню почему используется при формировании $filename функция str_replace слешей. Вероятно, когда тестировал это, то 1С разносила файлы по подпапкам. Сейчас такого не встречается, но лучше оставить.
В init.php:
use Bitrix\Main\Application,
Bitrix\Main\Diag\Debug,
Bitrix\Main\EventManager;
#...
EventManager::getInstance()->addEventHandler('main', 'OnEndBufferContent', 'save1CExchangeToFile');
function save1CExchangeToFile(&$content)
{
if (php_sapi_name() == 'cli') {
return false;
}
$requestHeaders = getallheaders();
$is1CRequest = strpos($requestHeaders['User-Agent'], '1C+Enterprise/') !== false;
if ($is1CRequest) {
$docuemntRoot = Application::getDocumentRoot();
$request = Application::getInstance()->getContext()->getRequest();
# запись запроса 1С и ответа Bitix в файл
Debug::writeToFile(
[
'request' => [
'get' => $request->getQueryList()->toArray(),
'post' => $request->getPostList()->toArray()
],
'response' => $content
],
date('Y-m-d H:i:s'),
'__bx_log_1c_exchange_' . date('Y-m-d') . '.log'
);
# сохранить файл пришедший из 1С
$filePath = '';
if ($fileName = trim(str_replace('\\', '/', $request->get('filename')), '/')) {
if ($request->get('type') === 'catalog') {
$filePath = $docuemntRoot . '/upload/1c_catalog/' . $fileName;
} elseif ($request->get('type') === 'sale') {
$filePath = $docuemntRoot . '/upload/1c_exchange/' . $fileName;
}
if ($filePath) {
if (file_exists($filePath)) {
$c1FileCopyPath = $docuemntRoot . '/upload/1c_catalog_xml_copy/' . $fileName;
$c1FileCopyDir = dirname($c1FileCopyPath);
if (! is_dir($c1FileCopyDir)) {
mkdir($c1FileCopyDir, 0755, true);
}
if (! copy($filePath, $c1FileCopyPath)) {
Debug::writeToFile(
[
'error' => error_get_last()
],
date('Y-m-d H:i:s'),
'__bx_log_1c_exchange_copy_err_' . date('Y-m-d') . '.log'
);
}
} else {
Debug::writeToFile(
[
'dir' => dirname($filePath),
'files' => scandir(dirname($filePath))
],
date('Y-m-d H:i:s'),
'__bx_log_1c_exchange_copy_error-exists_' . date('Y-m-d') . '.log'
);
}
}
}
}
}