Перейти к содержанию
Innovialabs

CommerceML и протокол обмена с 1С: подробный разбор

Продвинутое3 мин

Коротко

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
  1. checkauth — 1С передаёт логин и пароль через HTTP Basic Auth. Сайт отвечает success, затем имя и значение cookie сессии. Все следующие запросы приходят с этой cookie.
  2. init — сайт сообщает, принимает ли он архив (zip=yes/zip=no) и максимальный размер одного куска (file_limit=...). Здесь же стоит очистить временную папку от прошлого обмена.
  3. file — 1С отправляет файлы телом POST-запроса. Большой файл может прийти частями: их нужно дописывать в конец, а не перезаписывать. Картинки приходят так же, обычно с путями вида import_files/....
  4. import — сайт разбирает файл. Если обработка долгая, отвечайте progress: 1С повторит запрос, и вы продолжите с места остановки. Когда всё готово — success, при ошибке — failure и текст причины.

Структура файлов

import.xml содержит классификатор и каталог:

<КоммерческаяИнформация ВерсияСхемы="2.05">
  <Классификатор>
    <Группы>...</Группы>
    <Свойства>...</Свойства>
  </Классификатор>
  <Каталог СодержитТолькоИзменения="false">
    <Товары>
      <Товар>
        <Ид>b1f2...</Ид>
        <Наименование>Чайник</Наименование>
        <Группы><Ид>a7c3...</Ид></Группы>
        <Картинка>import_files/b1/b1f2.jpg</Картинка>
      </Товар>
    </Товары>
  </Каталог>
</КоммерческаяИнформация>

offers.xml содержит ПакетПредложений: список ТипыЦен и Предложения. У каждого Предложение есть Ид, Цены (с ИдТипаЦены, ЦенаЗаЕдиницу, Валюта) и Количество. Если у товара есть характеристики (размер, цвет), Ид предложения обычно имеет вид ИдТовара#ИдХарактеристики — разделяйте его по #.

Заказы передаются как набор элементов Документ внутри КоммерческаяИнформация: Ид, Номер, Дата, ХозОперация, Валюта, Сумма, Контрагенты, Товары и ЗначенияРеквизитов (статус оплаты, способ доставки и т.п.).

Точный набор элементов зависит от версии схемы и конфигурации 1С, поэтому сохраняйте реальные файлы из обмена и стройте парсер по ним.

Обмен заказами

  1. checkauth и init с type=sale — так же, как для каталога.
  2. mode=query — сайт отдаёт XML с новыми или изменёнными заказами.
  3. mode=success — 1С подтверждает получение. Только после этого помечайте заказы как выгруженные.
  4. В ряде конфигураций 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, размер тела и ответ. Сохраняйте копии полученных файлов — по ним проще воспроизвести ошибку локально.

Частые вопросы

В стандартном протоколе инициатор — 1С: она сама отправляет запросы по расписанию или вручную. Сайт может только корректно отвечать.

Поможем с этим

Если хотите не разбираться самим, а получить результат — этим мы занимаемся каждый день.

Обсудить проект

Читайте также

Есть идея или задача? Расскажите нам

Ответим в течение рабочего дня и предложим решение. Консультация бесплатная.