Реклама
Реклама
Реклама
Реклама. Zarub Zarub - зарубежные сервисы, оплата в рублях

Как посмотреть, что Битрикс отдаёт 1С при обмене заказами

Когда интеграторы 1С говорят «в выгрузке не приходит поле», первый вопрос — что именно сайт отдал. Многие ищут файл выгрузки на сервере, но при обмене заказами его там нет: 1С сама запрашивает у сайта заказы по HTTP, а Битрикс собирает XML прямо в ответ на запрос. Этот ответ можно получить в обычном браузере и посмотреть глазами.

Смежные разборы на karoche: HttpClient D7, Web\Uri — разбор и сборка URL, логирование модулей. Ниже — пошаговое повторение запросов 1С и типичные ловушки.

Как устроен обмен заказами

Модуль «Интернет-магазин» обслуживает обмен через /bitrix/admin/1c_exchange.php. 1С проходит три шага:

  • mode=checkauth — авторизация, в ответ сайт выдаёт сессию и sessid;
  • mode=init — согласование параметров обмена (версия схемы, архивирование, лимит размера файла);
  • mode=query — получение заказов в формате CommerceML.

После успешной загрузки 1С отправляет mode=success, и сайт запоминает время обмена. В следующий раз уйдут только заказы, изменённые после этого момента.

Повторяем запросы в браузере

Войдите на сайт пользователем, которому разрешён обмен с 1С (группы задаются в настройках модуля «Интернет-магазин» → обмен с 1С; администратор подходит). Все запросы делайте в одной вкладке — нужна одна сессия. Вместо example.ru подставьте свой домен, лучше тестовый.

1. Авторизация

https://example.ru/bitrix/admin/1c_exchange.php?type=sale&mode=checkauth

Ответ примерно такой — из последней строки нужен sessid:

success
PHPSESSID
<идентификатор сессии>
sessid=<значение>

Если в настройках включена защита обмена, без sessid следующие запросы сайт отклонит.

2. Инициализация. Версию схемы возьмите ту, с которой работает ваша 1С — её видно в логе веб-сервера по запросам к 1c_exchange.php (часто version=3.1).

https://example.ru/bitrix/admin/1c_exchange.php?type=sale&mode=init&version=3.1&sessid=<значение>

3. Заказы — ровно то, что получит 1С:

https://example.ru/bitrix/admin/1c_exchange.php?type=sale&mode=query&version=3.1&sessid=<значение>

Сайт вернёт XML в кодировке windows-1251 с правильным заголовком, браузер покажет его нормально. Сохранить можно через Ctrl+S.

Тот же запрос через HttpClient и Uri

В браузере удобно смотреть глазами. Для автотеста или скрипта на стейдже тот же сценарий собирают через Bitrix\Main\Web\Uri и HttpClient — без ручной склейки query:

<?php
use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\Web\Uri;

$base = 'https://example.ru/bitrix/admin/1c_exchange.php';
$http = new HttpClient(['socketTimeout' => 10, 'streamTimeout' => 60]);
$http->setRedirect(true);

// 1) checkauth
$u = new Uri($base);
$u->addParams(['type' => 'sale', 'mode' => 'checkauth']);
$authBody = (string)$http->get($u->getUri());
// распарсите sessid из ответа (последняя строка вида sessid=...)

$sessid = 'PASTE_SESSID';
$cookies = $http->getCookies(); // сохраните сессию для следующих вызовов

// 2) init
$u = new Uri($base);
$u->addParams([
    'type' => 'sale',
    'mode' => 'init',
    'version' => '3.1',
    'sessid' => $sessid,
]);
$http->get($u->getUri());

// 3) query — тело ответа = CommerceML
$u = new Uri($base);
$u->addParams([
    'type' => 'sale',
    'mode' => 'query',
    'version' => '3.1',
    'sessid' => $sessid,
]);
$xml = $http->get($u->getUri());
file_put_contents('/tmp/orders-1c.xml', $xml);

Важно перенести cookies после checkauth на следующие запросы (иначе sessid не поможет). Не вызывайте mode=success из скрипта отладки. Подробнее про сборку URL — в статье про Uri, про таймауты — в HttpClient.

Что ещё проверить в XML

После сохранения ответа откройте файл в windows-1251 и пробегитесь по чеклисту:

  • есть ли узел нужного заказа (Номер / Ид) — если нет, заказ не попал в выборку по дате обмена;
  • есть ли нужный реквизит внутри документа — если нет, смотрите карту экспорта типа плательщика;
  • совпадает ли значение свойства с тем, что в карточке заказа в админке (часто путают код свойства и название);
  • не обрезан ли ответ по лимиту размера из mode=init — тогда 1С ходит несколькими порциями.

Подводные камни

  • Не вызывайте mode=success. Он отмечает порцию как принятую, и эти заказы уже не уйдут в 1С при настоящем обмене. Пока его нет, query можно повторять сколько угодно.
  • Пустой ответ — не ошибка. Отдаются только заказы, изменённые после последнего успешного обмена. Нужен конкретный заказ — пересохраните его в админке.
  • Кракозябры в редакторе. Сохранённый файл в windows-1251, а VS Code по умолчанию открывает UTF-8. Переоткройте файл с кодировкой Cyrillic (Windows 1251).
  • Где искать файлы. Папка upload/1c_exchange/ — для файлов, которые 1С загружает на сайт, выгрузки заказов там нет. Протоколы обмена, если 1С их присылает, обычно лежат в upload/1c_catalog/Reports/.
  • Лучше на тестовой копии. В ответе персональные данные покупателей — не пересылайте такие файлы в открытые чаты.

Почему поле не доходит до 1С

Свойство заказа попадает в XML, только если оно указано в настройках экспорта для типа плательщика (реквизиты документа). Свойство может быть заполнено в заказе, но пока его нет в этой карте, 1С его не увидит. А «Способ оплаты» в выгрузке — это название платёжной системы, которое видит покупатель, а не эквайринг: если бухгалтерии нужен провайдер, его стоит передать отдельным реквизитом.

Краткий чеклист отладки

  1. Повторите checkauth → init → query в одной сессии браузера.
  2. Убедитесь, что заказ менялся после последнего mode=success (или пересохраните его).
  3. Сверьте карту реквизитов экспорта для нужного типа плательщика.
  4. Откройте сохранённый XML в windows-1251 и поищите имя свойства латиницей/кириллицей как в настройках.
  5. Не жмите success на проде, пока разбираете проблему.

Заключение

Файл выгрузки заказов на диске искать бессмысленно: Битрикс отдаёт CommerceML в HTTP-ответе на mode=query. Повторив цепочку запросов 1С в браузере или через HttpClient+Uri, вы за минуту видите тот же XML, что уйдёт в учётную систему, и сразу отделяете «поле не попало в экспорт» от «1С его не разобрала». Держите отладку на тестовой копии и не подтверждайте порцию через mode=success, пока не закончите разбор.