Обмен с 1С ломается предсказуемо. В 90% случаев причина — не «глюк Битрикса», а таймаут, неверная привязка свойств, права на каталог или расхождение версий протокола CommerceML. Ниже — типовые ошибки и порядок их устранения.
Как устроен обмен и где он ломается
Обмен между 1С и сайтом идёт по протоколу CommerceML 2 через точку входа /bitrix/admin/1c_exchange.php. 1С поочерёдно вызывает этапы checkauth, init, file и import, передавая XML-файлы import.xml (каталог) и offers.xml (торговые предложения, цены, остатки). На стороне сайта работает модуль catalog, а разбор файлов — компонент bitrix:catalog.import.1c.
Сбой возникает на любом из этапов, и важно понимать, где именно. Первым делом смотрите:
- журнал обмена в 1С (окно «Обмен с сайтом»);
- Рабочий стол → Настройки → Инструменты → Диагностика ошибок в админке Битрикс;
- файлы выгрузки во временной папке
/upload/1c_catalog/.
Ошибки авторизации и прав доступа
Самая частая «стена» — обмен не проходит этап checkauth. В журнале 1С видно «Ошибка авторизации» или пустой ответ вместо строки success. Причины и что проверять:
| Симптом | Причина | Решение |
|---|---|---|
| «Логин или пароль неверны» | Учётка не входит в группу с правом на обмен | Дать пользователю право на модуль «Торговый каталог» и доступ к 1c_exchange.php |
| Обмен обрывается после первой сессии | Не сохраняется cookie сессии | Проверить работу сессий, отключить агрессивное кэширование на прокси |
| HTTP 403 / 500 на точке входа | Права на файлы или блокировка WAF | Проверить права 755 на каталог, добавить URL в исключения проактивной защиты |
1c_exchange.php в исключения фильтра, иначе обмен будет обрываться на больших файлах.Таймауты и обрыв на больших выгрузках
Каталог на 50–100 тысяч позиций почти всегда упирается в лимиты PHP. Симптом — обмен «висит» и обрывается, в логе «Превышено максимальное время выполнения» или белый экран. Работать нужно по двум фронтам — дробление и лимиты.
- В настройках выгрузки в 1С включите пошаговую выгрузку и ограничьте объём файла (например,
1 Мб). Тогда 1С шлёт данные порциями, а не одним гигантским XML. - На сайте увеличьте параметры в
.htaccessилиphp.ini:max_execution_time,memory_limit(от 512M),post_max_sizeиupload_max_filesize. - В настройках модуля задайте «Интервал сохранения» и «Максимальное время выполнения шага» меньше серверного лимита — тогда Битрикс сам разобьёт импорт на шаги.
Если сервер за nginx, проверьте client_max_body_size — иначе большой offers.xml вернёт 413 Request Entity Too Large ещё до PHP.
Дубли товаров и слетевшая привязка
После обмена в каталоге появляются задвоенные товары или создаётся новый раздел вместо обновления старого. Корень проблемы — идентификация элементов. Битрикс сопоставляет товар из 1С с элементом инфоблока по внешнему коду XML_ID, который берётся из Ид в XML.
- Если в 1С перезаливали номенклатуру или меняли GUID, внешние коды не совпадут — Битрикс создаст дубли.
- Если импорт руками (CSV) перезаписал
XML_ID, следующая выгрузка из 1С не найдёт «свои» элементы. - Разделы двоятся, когда группы номенклатуры в 1С получили новые идентификаторы.
Лечение: не менять XML_ID вручную; при миграции — выгрузить соответствие «Ид 1С ↔ XML_ID» и восстановить его. Для разовой чистки помогает выгрузка каталога в CSV, дедупликация по внешнему коду и повторная привязка.
CML2_LINK для торговых предложений) связывает SKU с родительским товаром. Если оно пустое — предложения «отвалятся» от товара и цена/остаток не подтянутся.Не обновляются свойства, цены и остатки
Обмен «зелёный», но на витрине старые цены или пустые характеристики. Здесь виноват не сам обмен, а сопоставление данных.
- Свойства не заполняются — в 1С характеристика не выгружается как свойство CommerceML, либо в инфоблоке нет свойства с совпадающим кодом. Битрикс создаёт свойства автоматически по первому обмену; если инфоблок настроили заранее с другими кодами — совпадения не будет.
- Цены не меняются — тип цены в 1С не сопоставлен с типом цены каталога. Проверьте раздел Магазин → Настройки → Типы цен и соответствие имён.
- Остатки нулевые — в 1С не включена выгрузка остатков по складам, либо на сайте не включён учёт по складам, а данные приходят складские.
Отдельная ловушка — очистка полей: если из 1С перестало выгружаться свойство, при полной выгрузке Битрикс может его обнулить. Для критичных полей (сделанных на сайте вручную) держите отдельные свойства, которые 1С не трогает.
Сбои встречной выгрузки заказов
Обмен двусторонний: сайт отдаёт заказы в 1С файлом orders, 1С возвращает статусы и номера. Типовые проблемы этого направления:
- Заказы не уходят в 1С — в настройках модуля выключен обмен заказами, либо у заказа статус, не попадающий в фильтр выгрузки.
- Товар в заказе не находится — 1С не может сопоставить позицию по
XML_ID(тот же корень, что у дублей каталога). - Двойное списание остатка — резервирование ведётся и на сайте, и в 1С без согласования правил.
- Не подтягиваются свойства покупателя — свойства заказа на сайте не сопоставлены с реквизитами контрагента в 1С.
Порядок диагностики: чек-лист
Чтобы не гадать, идите по этапам обмена сверху вниз. Такой порядок закрывает большинство инцидентов за один заход:
- Смотрим журнал в 1С — на каком этапе (
checkauth/init/file/import) обрыв. - Открываем детальный лог модуля и «Диагностику ошибок» в админке.
- Проверяем права пользователя обмена и исключения проактивного фильтра.
- Смотрим лимиты PHP/nginx и размер файлов в
/upload/1c_catalog/. - Сверяем
XML_ID, типы цен и коды свойств — то, что чаще всего «не сходится». - Повторяем обмен с одним товаром — так проще локализовать проблему.
Ведите изменения по одному: поменяли параметр — прогнали обмен — зафиксировали результат. Массовые правки «на всякий случай» только запутывают картину.
Итог
Почти все ошибки обмена с 1С сводятся к пяти узлам: авторизация и права, лимиты и таймауты, идентификация по XML_ID, сопоставление цен, свойств и остатков и встречная выгрузка заказов. Если двигаться по этапам протокола и по чек-листу, источник почти всегда находится за одну-две итерации.
Когда каталог большой, а обмен двусторонний и нагруженный, мы в B2Bsite настраиваем CommerceML «под ключ»: чиним привязку номенклатуры, разбиваем выгрузку на шаги, согласуем цены, склады и статусы заказов, а затем ставим обмен на регулярный мониторинг, чтобы сбой было видно раньше, чем его заметит клиент.
Частые вопросы
Почему обмен обрывается на большом каталоге?
Чаще всего упираетесь в лимиты PHP: max_execution_time и memory_limit. Включите пошаговую выгрузку в 1С с ограничением размера файла и поднимите лимиты на сервере.
Откуда берутся дубли товаров после обмена?
Битрикс сопоставляет товары по внешнему коду XML_ID. Если в 1С сменились идентификаторы номенклатуры или XML_ID перезаписали вручную, система не находит старый элемент и создаёт новый.
Обмен проходит успешно, но цены не обновляются. В чём дело?
Тип цены из 1С не сопоставлен с типом цены каталога на сайте. Проверьте раздел Магазин → Настройки → Типы цен и совпадение имён типов цен.
Почему не проходит авторизация на этапе checkauth?
Обычно у пользователя обмена нет прав на модуль торгового каталога или проактивный фильтр блокирует запрос. Дайте права и добавьте 1c_exchange.php в исключения фильтра.
Что делать, если после обмена очищаются заполненные вручную свойства?
При полной выгрузке Битрикс может обнулить свойство, которое перестало приходить из 1С. Держите ручные данные в отдельных свойствах, которые обмен не затрагивает.
Заказы с сайта не попадают в 1С — почему?
Проверьте, включён ли обмен заказами в настройках модуля и попадает ли статус заказа в фильтр выгрузки. Также заказ не уйдёт, если товар в нём не сопоставляется по XML_ID.
Где смотреть причину ошибки обмена?
Сначала в журнале обмена в самой 1С — он показывает этап обрыва. Затем в детальном логе модуля и в разделе Диагностика ошибок в админке Битрикс.
Почему торговые предложения отвязываются от товара?
За связь SKU с родительским товаром отвечает внешний код CML2_LINK. Если он пустой или не совпадает, предложения теряют привязку и цены с остатками не подтягиваются.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.