Yandex Metrika
sanches.free 1 просмотр

Пошаговый импорт 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 дней гарантии