Пошаговый импорт CommerceML через HTTP: curl и расшифровка ответов
Где живёт точка входа
Коммерческий обмен между «1С:Предприятие» и сайтом идёт обычно в /bitrix/admin/1c_exchange.php; отдельный файл 1c_import.php используется для ручного импорта из административной панели и не подменяет сам протокол обмена. Ниже речь о том же сценарии, который дергает типовая выгрузка: последовательные GET/POST с режимами checkauth, init, file и import.
Параметры запроса
Пара type и mode переключает ветку логики. Для каталога достаточно type=catalog; для потока заказов симметрично используют type=sale, где после авторизации участвует ещё mode=query. Базовые режимы приёма файла:
mode=checkauth— проверка логина и выдача связки с сессией;mode=init— «рукопожатие»: лимиты размера, признак zip, подготовка каталога приёма;mode=file&filename=…— заливка тела файла методом POST;mode=import&filename=…— порционная обработка уже загруженного файла до строки соsuccess.
Сообщения во второй строке и шаг SESSION
Пока обработчик не закончил файл, первая строка тела чаще всего progress, а пояснение следует ниже. Когда файл полностью обработан, появится success и финальное пояснение. Таблица связывает характерные фразы с индексом шага во внутреннем массиве ($NS['STEP'] на стороне класса импорта) — это удобно при логировании без отладчика PHP.
| Фрагмент ответа | Шаг STEP |
|---|---|
| Распаковка архива завершена | — |
| Временные таблицы удалены | — |
| Временные таблицы созданы | 1 |
| Обработано …% файла / Файл импорта прочитан | 2 |
| Временные таблицы проиндексированы | 3 |
| Метаданные импортированы успешно | 4 |
| Группы импортированы | 5 |
| Деактивация/удаление групп завершено | 6 |
| Обработано N из M элементов / загрузка элементов завершена | 7 |
| Деактивация/удаление элементов завершены | 8 |
| Импорт успешно завершен | — |
Минимальный сценарий на curl
Сохраняйте куки между вызовами и передавайте Basic-заголовок для служебного пользователя портала. Если вместо плоского текста прилетает HTML, чаще всего виноваты неверные учётные данные или отраслевой антибот вроде капчи — сначала пройдите вход под тем же логином в браузере.
cookiePath="var/exchange_cookie.txt"
basicHeader=$(printf '%s' 'integration_user:sekret' | base64)
baseUrl='https://example.org/bitrix/admin/1c_exchange.php'
curl -sS -c "$cookiePath" -b "$cookiePath" \
"${baseUrl}?type=catalog&mode=checkauth" \
-H "Authorization: Basic ${basicHeader}"
curl -sS -c "$cookiePath" -b "$cookiePath" \
"${baseUrl}?type=catalog&mode=init" \
-H "Authorization: Basic ${basicHeader}"Передача файла выполняется потоком в тело POST; заголовок Expect: обнуляют, чтобы не ловить лишний паузирующий ответ прокси.
exchangeFile='upload/offers.xml'
curl -sS -c "$cookiePath" -b "$cookiePath" -X POST --data-binary "@${exchangeFile}" \
"${baseUrl}?type=catalog&mode=file&filename=offers.xml" \
-H "Authorization: Basic ${basicHeader}" \
-H 'Content-Type: application/octet-stream' \
-H 'Expect:'Дальше в цикле повторяйте один и тот же mode=import, пока первая строка остаётся progress. Как только увидите success, обработка файла завершена. Строка failure с продолжением текста — сигнал остановиться и читать расшифровку ошибки; сырой HTML обычно означает фатальный сбой PHP или базы на сервере.
while true; do
resp=$(curl -sS -c "$cookiePath" -b "$cookiePath" \
"${baseUrl}?type=catalog&mode=import&filename=offers.xml" \
-H "Authorization: Basic ${basicHeader}")
head=$(printf '%s' "$resp" | head -n1)
printf '%s\n' "$resp"
case "$head" in success*) break ;; failure*) exit 1 ;; esac
doneЗачем это инженеру
Такой ручной прогон полезен, когда нужно отделить сетевой слой от конфигурации 1С: достаточно выгрузки в XML или архив и повторяемых запросов. Для автоматизации на bash удобны готовые обёртки в открытых репозиториях или собственная оболочка, которая пишет сырой журнал каждого ответа — по нему быстрее объяснять заказчикам, какой именно шаг STEP «залип». Более глубокий разбор классов парсера и состава типовых XML описан в отдельных материалах по CommerceML для Битрикс.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии