CommerceML и протокол обмена с 1С: подробный разбор
Продвинутое3 минРедакция Innovialabs
Коротко
1С сама ходит на сайт HTTP-запросами (checkauth, init, file, import), передаёт каталог в import.xml, цены и остатки в offers.xml и забирает заказы через mode=query; большинство сбоев связано с авторизацией, лимитами загрузки и несовпадением идентификаторов.
Как работает обмен в двух словах
CommerceML — это XML-формат для обмена товарами, ценами и заказами, а протокол обмена — набор HTTP-запросов, которые 1С отправляет на один адрес сайта (например, /1c_exchange.php или /api/1c). Инициатор всегда 1С: сайт только отвечает. Тип обмена задаётся параметром type (catalog для товаров, sale для заказов), этап — параметром mode.
Ответы сайта — простой текст: первая строка success, progress или failure, дальше — дополнительные данные.
Последовательность выгрузки каталога
GET ?type=catalog&mode=checkauth
GET ?type=catalog&mode=init
POST ?type=catalog&mode=file&filename=import.xml
GET ?type=catalog&mode=import&filename=import.xml
POST ?type=catalog&mode=file&filename=offers.xml
GET ?type=catalog&mode=import&filename=offers.xml
- checkauth — 1С передаёт логин и пароль через HTTP Basic Auth. Сайт отвечает
success, затем имя и значение cookie сессии. Все следующие запросы приходят с этой cookie. - init — сайт сообщает, принимает ли он архив (
zip=yes/zip=no) и максимальный размер одного куска (file_limit=...). Здесь же стоит очистить временную папку от прошлого обмена. - file — 1С отправляет файлы телом POST-запроса. Большой файл может прийти частями: их нужно дописывать в конец, а не перезаписывать. Картинки приходят так же, обычно с путями вида
import_files/.... - import — сайт разбирает файл. Если обработка долгая, отвечайте
progress: 1С повторит запрос, и вы продолжите с места остановки. Когда всё готово —success, при ошибке —failureи текст причины.
Структура файлов
import.xml содержит классификатор и каталог:
<КоммерческаяИнформация ВерсияСхемы="2.05">
<Классификатор>
<Группы>...</Группы>
<Свойства>...</Свойства>
</Классификатор>
<Каталог СодержитТолькоИзменения="false">
<Товары>
<Товар>
<Ид>b1f2...</Ид>
<Наименование>Чайник</Наименование>
<Группы><Ид>a7c3...</Ид></Группы>
<Картинка>import_files/b1/b1f2.jpg</Картинка>
</Товар>
</Товары>
</Каталог>
</КоммерческаяИнформация>
offers.xml содержит ПакетПредложений: список ТипыЦен и Предложения. У каждого Предложение есть Ид, Цены (с ИдТипаЦены, ЦенаЗаЕдиницу, Валюта) и Количество. Если у товара есть характеристики (размер, цвет), Ид предложения обычно имеет вид ИдТовара#ИдХарактеристики — разделяйте его по #.
Заказы передаются как набор элементов Документ внутри КоммерческаяИнформация: Ид, Номер, Дата, ХозОперация, Валюта, Сумма, Контрагенты, Товары и ЗначенияРеквизитов (статус оплаты, способ доставки и т.п.).
Точный набор элементов зависит от версии схемы и конфигурации 1С, поэтому сохраняйте реальные файлы из обмена и стройте парсер по ним.
Обмен заказами
checkauthиinitсtype=sale— так же, как для каталога.mode=query— сайт отдаёт XML с новыми или изменёнными заказами.mode=success— 1С подтверждает получение. Только после этого помечайте заказы как выгруженные.- В ряде конфигураций 1С затем отправляет
mode=fileс обновлёнными статусами заказов.
Полный и частичный обмен
Атрибут СодержитТолькоИзменения на Каталог и ПакетПредложений определяет режим:
| Режим | Значение | Что делать на сайте |
|---|---|---|
| Полный | false | Синхронизировать всё; товары, которых нет в файле, можно деактивировать |
| Частичный | true | Обновлять только пришедшие позиции, остальные не трогать |
Частая ошибка — деактивировать отсутствующие товары при частичной выгрузке. В итоге после небольшого изменения в 1С пропадает почти весь каталог.
Отладка типичных сбоев
- Не проходит авторизация. При запуске PHP через CGI/FastCGI заголовок
Authorizationможет не доходить до скрипта — его нужно явно пробросить в настройках веб-сервера. - Сессия теряется. Сайт должен вернуть cookie в
checkauthи принимать её дальше; кэширующий прокси или CDN не должны вмешиваться в этот адрес. - Обрыв на больших файлах. Проверьте лимит тела запроса (например,
client_max_body_sizeв nginx), таймауты иfile_limit. Длинный импорт разбивайте на шаги черезprogress. - Дубли товаров. Сопоставляйте записи только по
Идиз 1С, а не по названию или артикулу. - Заказы выгружаются повторно. Не обрабатывается
mode=success. - Кракозябры. Проверьте кодировку из XML-декларации и кодировку ваших ответов.
Для диагностики логируйте каждый запрос: type, mode, filename, размер тела и ответ. Сохраняйте копии полученных файлов — по ним проще воспроизвести ошибку локально.