• Где в Bitrix лог обмена заказами с 1С?

    @AndreyS411
    Добрый день.

    Решал такую проблему нижеописанным способом. Нужно было поймать за руку 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'
                            );
                        }
                    }
                }
    
            }
        }
    Ответ написан
    Комментировать