Когда интеграторы 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С его не увидит. А «Способ оплаты» в выгрузке — это название платёжной системы, которое видит покупатель, а не эквайринг: если бухгалтерии нужен провайдер, его стоит передать отдельным реквизитом.
Краткий чеклист отладки
- Повторите
checkauth → init → queryв одной сессии браузера. - Убедитесь, что заказ менялся после последнего
mode=success(или пересохраните его). - Сверьте карту реквизитов экспорта для нужного типа плательщика.
- Откройте сохранённый XML в windows-1251 и поищите имя свойства латиницей/кириллицей как в настройках.
- Не жмите
successна проде, пока разбираете проблему.
Заключение
Файл выгрузки заказов на диске искать бессмысленно: Битрикс отдаёт CommerceML в HTTP-ответе на mode=query. Повторив цепочку запросов 1С в браузере или через HttpClient+Uri, вы за минуту видите тот же XML, что уйдёт в учётную систему, и сразу отделяете «поле не попало в экспорт» от «1С его не разобрала». Держите отладку на тестовой копии и не подтверждайте порцию через mode=success, пока не закончите разбор.

