Обмен 1С CommerceML не работает - сталкивался с этим на проектах на WooCommerce и на самописных модулях чаще, чем хотелось бы: 1С формирует выгрузку, в логе стоит «Выгрузка завершена успешно», а на сайте каталог как будто заморожен на прошлой неделе или новые товары вообще не появляются. Причина редко бывает одна - обычно это комбинация настроек 1С, лимитов хостинга и особенностей конкретной CMS, и разбираться приходится по шагам, а не гадать наугад.
Как устроен обмен 1С и CommerceML и где рвётся цепочка
1С обменивается с сайтом по протоколу CommerceML поверх HTTP, и происходит это в четыре шага: checkauth проверяет логин-пароль и открывает сессию, init сообщает сайту параметры - версию протокола, лимит размера файла, кодировку, file закачивает сами XML-файлы каталога и предложений частями, import запускает разбор загруженных файлов на стороне сайта. Если сайт правильно отвечает на первые два запроса, но падает на третьем или четвёртом - 1С в логе честно напишет «завершено», хотя по факту импорта не произошло, потому что с точки зрения модуля обмена ошибка случилась уже после подтверждения авторизации.
На практике 90% обращений «обмен не работает» - это не поломка самого протокола, а несовпадение ожиданий между 1С и хостингом: 1С шлёт файл в 40 МБ, а сервер режет запросы больше 8 МБ, и оба логируют это по-своему невнятно.
Обмен 1С CommerceML не работает: ищем причину в самой 1С
Первым делом смотрю настройки узла обмена в самой 1С:
- Версия CommerceML - 1С:Управление торговлей 11 и УНФ по умолчанию генерируют CommerceML 2.10 или 2.11, а старый модуль обмена на сайте понимает только 2.03-2.05. Внешне всё грузится, но часть тегов (например, характеристики или несколько единиц измерения) сайт просто игнорирует как неизвестные.
- Фильтр по номенклатурным группам - если в настройках правил обмена выбраны не все группы каталога, часть товаров физически не попадает в выгрузку, и это не ошибка, а осознанная (часто случайно оставленная) настройка.
- Галочка «Выгружать только измененные с даты» - если дата почему-то уехала в будущее (например, после переноса базы или смены часового пояса на сервере 1С), новые и изменённые товары перестают выгружаться, а полная выгрузка не запускается месяцами.
- Ограничение размера сообщения в настройках плана обмена - 1С сама режет файл на части, но если указано слишком маленькое значение, файлов становится по 200-300 штук, и на слабом хостинге часть из них не успевает докачаться за таймаут.
Ошибки на стороне сайта: WordPress, Bitrix и самописные обработчики
Со стороны сайта чаще всего ловил три класса проблем.
Первый - права доступа на папку обмена (обычно /bitrix/1c_exchange/ в Bitrix или /wp-content/uploads/1c_exchange/ в WooCommerce-плагинах вроде 1C-Битрикс: Управление сайтом или WP Commerce ML): 1С не может создать временный файл, потому что папке выставлены права 644 вместо 755, и запрос file тихо возвращает 500‑ю ошибку.
Второй - защитные плагины и WAF. Wordfence, встроенный файрвол хостинга или режим Bot Fight Mode в Cloudflare воспринимают серию быстрых POST-запросов с юзер-агентом «1C+Enterprise» как подозрительную активность и режут их 403‑й ошибкой. Решается добавлением IP или user-agent 1С в белый список конкретно для пути обмена - это легитимный клиент, а не что-то, что нужно скрывать от защиты сайта.
Третий - сессии. Модуль обмена держит состояние между запросами checkauth и file через куки или GET-параметр сессии, и если на сайте несколько серверов за балансировщиком без sticky-сессий, каждый следующий запрос 1С может улетать на другой сервер, где сессии просто нет - обмен рвётся ровно после авторизации.
| Симптом | Где искать |
|---|---|
| Обмен «успешно», но каталог не меняется | Дата последнего обмена в 1С, фильтр по группам, версия CommerceML |
| Ошибка 403 сразу на checkauth | WAF, файрвол хостинга, .htaccess |
| Обмен обрывается на середине списка товаров | Таймаут PHP, лимит памяти, размер файла offers.xml |
| Остатки не обновляются, а карточки товаров - да | Отдельный узел обмена для остатков, права на папку выгрузки цен |
Бесплатный материал
🎁 Полезный скрипт в подарок
Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.
Без спама. Отписка в 1 клик.
Лимиты хостинга, которые тихо режут выгрузку
Шаред-хостинг - самая частая причина, почему обмен 1С commerceml не работает стабильно: каталог на 3-5 тысяч товаров генерирует файлы по 20-60 МБ, а типовые настройки PHP на недорогом тарифе рассчитаны на блог, а не на импорт XML.
| Параметр | Типичное значение на шаред-хостинге | Нужно для обмена 1С |
|---|---|---|
| upload_max_filesize | 2-8 МБ | 64-256 МБ |
| post_max_size | 8 МБ | чуть больше upload_max_filesize |
| memory_limit | 128 МБ | 256-512 МБ |
| max_execution_time | 30 секунд | 300 секунд и больше |
| Свободное место под /tmp и папку обмена | не контролируется | минимум х2 от размера полной выгрузки |
Отдельно проверяю квоту на inodes - на некоторых тарифах хостер ограничивает не мегабайты, а количество файлов, и обмен, который создаёт временные файлы на каждый шаг импорта, упирается именно в это, а не в размер диска.
Кодировка, GUID и дубли товаров - почему каталог теряет часть позиций без ошибок
1С по умолчанию отдаёт XML в Windows-1251, а часть современных модулей обмена и парсеров XML на сайте ждут UTF‑8 - если конвертация настроена криво, парсер либо падает на первом же кириллическом символе за пределами ASCII, либо молча обрубает файл в точке, где встретил байт, не укладывающийся в ожидаемую кодировку. Внешне это выглядит как «половина каталога загрузилась, половина - нет», и без сверки количества товаров в логе 1С и в базе сайта такую потерю легко не заметить месяцами.
Вторая частая причина пропажи товаров - дубли GUID. Если карточка товара в 1С создавалась через копирование элемента без переопределения уникального идентификатора, или если в интернет-магазин заведены две базы 1С с пересекающимся диапазоном GUID (частая ситуация после слияния компаний или переноса с одной версии 1С на другую), сайт видит два товара с одинаковым ключом и либо перезаписывает один другим, либо, в зависимости от логики модуля, просто отбрасывает второй как повторную запись.
Третья - превышение лимита элементов в одном файле offers.xml. Часть модулей обмена жёстко ограничивает число предложений в одном файле (например, 1000 или 5000), и если 1С не режет файл автоматически из-за неверной настройки, сайт обрабатывает файл только до лимита и тихо игнорирует остаток без явной ошибки в логе.
Когда проще не чинить CommerceML, а собрать отдельную интеграцию
Bыше какого-то порога сложности - нестандартная конфигурация 1С без штатной поддержки CommerceML (часто бывает в 1С:Розница с самописными доработками), или сайт на конструкторе вроде Tilda, где нет своего PHP-бэкенда для приёма XML-запросов - гонять товары через классический обмен просто нечем. В таких случаях я обычно делаю выгрузку из 1С через OData или во внешний файл и синхронизацию товаров и остатков отдельным скриптом на своей стороне, иногда с прослойкой на n8n для расписания и уведомлений о сбоях в Telegram. Если нужен именно такой обходной путь для конструктора сайтов или для CRM, у меня есть отдельная услуга по интеграции 1С с сайтом - обычно это дешевле и надёжнее, чем пытаться подружить нестандартную 1С со штатным модулем CommerceML, который на такую конфигурацию не рассчитан.
Чек-лист диагностики обмена 1С и CommerceML
- Открыть URL обмена в браузере с параметрами
?type=catalog&mode=checkauth- если вместоsuccessи куки в ответе White screen или 500‑я ошибка, проблема на сайте, а не в 1С. - Сверить версию CommerceML в настройках плана обмена 1С с версией, которую поддерживает модуль на сайте - обычно указана в документации плагина или в первых строчках лога импорта.
- Проверить права на папку обмена: 755 на директории, 644 на файлы, владелец - пользователь, от которого работает PHP, а не root.
- Временно отключить WAF/защитные плагины и повторить обмен - если он проходит, добавлять IP или user-agent 1С в исключения для конкретного пути, а не отключать защиту целиком.
- Поднять php.ini под значения из таблицы выше и перезапустить PHP-FPM - на части хостингов правки в .htaccess для этого не применяются, нужен php.ini или личный кабинет хостера.
- Сравнить число товаров в логе 1С после выгрузки с числом товаров в базе сайта - расхождение больше пары процентов почти всегда указывает на дубли GUID или обрыв по лимиту файла.
- Включить подробный лог обмена на сайте (в большинстве модулей это отдельная галочка в настройках), если такого лога нет - временно логировать сырые запросы через простой PHP-обработчик, чтобы увидеть, на каком шаге протокол реально обрывается.
Интернет-магазин под ключ
Интернет-магазин
от 80 000 ₽
Подробнее →Частые вопросы
Почему в логе 1С обмен успешный, а товары на сайте не появились?
Лог 1С показывает статус запроса import, а не результат разбора файла на сайте - если сайт вернул 200‑й код, но упал уже при парсинге XML (например, из-за кодировки или дубля GUID), 1С об этом не узнает и запишет успешное завершение. Проверять нужно логи самого сайта, а не только 1С.
Что делать, если обмен обрывается на середине списка товаров?
Обычно это таймаут PHP или нехватка памяти на большом файле offers.xml. Поднимаю max_execution_time до 300+ секунд и memory_limit минимум до 256 МБ, а если хостинг не даёт это сделать - уменьшаю размер одного файла обмена в настройках 1С, чтобы каждая часть укладывалась в лимиты сервера.
Можно ли настроить обмен 1С по CommerceML с сайтом на Tilda?
Штатно нет - у Tilda нет своего серверного обработчика для приёма XML-запросов протокола. Рабочий вариант - выгружать товары из 1С отдельным скриптом через API Tilda или через прослойку на n8n, минуя классический CommerceML целиком.
Как часто должен запускаться обмен, чтобы не терять заказы?
Для остатков и цен обычно ставлю расписание раз в 15-30 минут, для полного каталога с картинками и описаниями хватает одного раза в сутки ночью, когда нагрузка на сервер и в 1С, и на сайте минимальна.