1С Битрикс · 8 мин чтения

Интеграция сайта на Битрикс с 1С: обмен товарами и заказами

Интеграция сайта на Битрикс с 1С обычно упирается не в код, а в договорённости между отделами: какая система считается источником правды по остаткам, кто закрывает заказ, что делать с товарами, которых больше нет в 1С, но ещё висят на сайте. Модуль «1С-Битрикс: Управление сайтом» умеет обмениваться данными по протоколу CommerceML из коробки, но настройка типового обмена под конкретный магазин с 8-10 тысячами SKU и несколькими складами у меня занимает 3-5 рабочих дней, а не 20 минут, как обещают мануалы 1С.

Как работает обмен данными между Битрикс и 1С

Обмен построен на протоколе CommerceML 2.04, иногда 2.05 в свежих релизах 1С. С точки зрения файлов это набор XML: import.xml с классификатором и структурой каталога, offers.xml с ценами и остатками по торговым предложениям, orders.xml с заказами, которые уходят с сайта обратно в 1С. Файлы передаются либо через типовой обработчик по HTTP, либо через промежуточный каталог на сервере, если прямого доступа к базе 1С нет.

Направления обмена всегда два, и они не равнозначны. Каталог, цены и остатки идут из 1С на сайт - 1С считается источником правды. Заказы идут в обратную сторону: сайт создаёт заказ, 1С его получает, обрабатывает и присваивает номер и статус, при необходимости резервирует товар на складе. Дальше статус (оплачен, собран, отгружен) снова летит на сайт, чтобы клиент видел актуальную информацию в личном кабинете, а не звонил на почту с вопросом «где мой заказ».

Настройка выгрузки каталога из 1С на сайт

На стороне 1С (Управление торговлей 11, Розница 2.3 или ERP) в разделе НСИ и администрирование добавляется узел обмена с типом «Сайт на 1С-Битрикс»: указывается адрес сайта, логин и пароль для авторизации на обмене. Для этого я всегда завожу отдельного технического пользователя, а не использую администратора магазина.

На стороне Битрикс в модуле «Торговый каталог» есть готовый обработчик по стандартному пути, но в проде я его всегда переношу на отдельный URL с basic-авторизацией и ограничением по IP - дефолтный адрес регулярно сканируют боты, и туда можно случайно залить мусорный XML.

Дальше выбирается тип обмена: полный, который перезаписывает структуру разделов и товаров целиком, или частичный - только цены и остатки, без реструктуризации каталога. Для магазинов, где категории редактируют руками на сайте, использую частичный: полный обмен сносит ручные правки структуры при каждой синхронизации.

Отдельно настраиваются свойства товаров: какие поля 1С мапятся на инфоблок (артикул, бренд, вес, единица измерения), как передаются картинки - по ссылке или бинарно внутри XML. Для каталога больше 500 картинок бинарная передача добавляет по 20-30 минут на прогон, поэтому для крупных магазинов переключаю на выгрузку по URL со статического сервера.

CommerceML, REST API или n8n: как выбираю способ

Способ обмена Когда использую Ограничение
CommerceML (типовой модуль) 1С и сайт в одной сети, стандартная структура каталога Нужны регламентные задания в 1С, плохо переживает конфликты одновременной записи
REST API Битрикс + OData 1С 1С в облаке, прямого файлового доступа нет, обмен нужен ближе к реальному времени Пишется вручную, готового модуля под эту связку нет
n8n как прослойка Нужно завести в тот же поток обмена вебхуки от эквайринга или СДЭК Ещё один сервис, который приходится администрировать и мониторить отдельно

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Синхронизация остатков, цен и складов

Остатки и цены - самая частая причина расхождений между сайтом и 1С. У большинства клиентов несколько типов цен (розница, опт, отдельный тип с уже учтённой наценкой для сайта) и несколько складов. В обмене нужно явно указать, какой тип цены 1С выгружается на сайт и как считать остаток, если товар лежит на трёх складах: суммировать всё или показывать только основной.

Для каталога от 5000 позиций полный обмен по расписанию раз в час не успевает отработать в стандартный лимит времени выполнения PHP-скрипта - обычно 30-60 секунд на общем хостинге. Решение простое: увеличиваю max_execution_time для конкретного обработчика обмена и прошу дробить выгрузку в 1С на порции по 500‑1000 товаров вместо одного большого файла.

Отдельная проблема - остатки в момент высокой нагрузки. Если обмен идёт раз в 30 минут, а заказов за это время оформили 40, часть клиентов увидит в наличии то, чего уже нет. Для магазинов с высоким оборотом здесь помогает резервирование прямо на сайте: при оформлении заказа остаток по позиции временно блокируется на стороне Битрикс, а не только пересчитывается по факту следующего обмена.

Обмен заказами между сайтом и 1С

Заказ, оформленный на сайте, попадает в 1С как документ «Заказ клиента» с привязкой к контрагенту - новому или найденному по телефону и email. Дальше заказ проходит по внутренним статусам 1С, и часть из них нужно возвращать на сайт: клиент должен видеть «в обработке», «собран», «передан в СДЭК» без звонка на почту.

На практике сопоставление статусов - отдельная задача, не часть типового обмена. Обычно завожу таблицу соответствия «статус 1С - статус сайта» и прописываю её в обработчике события сохранения заказа. То же самое с оплатой: если магазин принимает деньги через эквайринг T‑Bank, оплата подтверждается вебхуком раньше, чем сработает следующий обмен с 1С, и заказ на сайте должен смениться на «оплачен» сразу, а не через 30 минут ожидания синхронизации.

Похожая история с доставкой. Когда заказ уходит в СДЭК, трек-номер сначала появляется в 1С - именно она формирует заказ на доставку через API СДЭК или вручную, и его нужно протащить обратно на сайт через то же поле файла заказов, которое уже используется для статусов. В типовой структуре обмена отдельного поля под трек-номер нет, приходится расширять формат и обработчик под кастомное свойство заказа.

Автоматизация обмена по расписанию

На стороне 1С обмен запускается регламентным заданием (для серверных версий) или агентом, который проверяет расписание при каждом входе пользователя в базу - для файловых версий это значит, что обмен зависит от того, открыта ли база хоть у кого-то, и по ночам синхронизация регулярно не срабатывает вовсе. Для файловых баз советую переходить на серверный вариант именно из-за этого.

Частоту обмена развожу по типу данных: заказы и статусы синхронизирую каждые 10-15 минут, остатки и цены - раз в час, полную структуру каталога - раз в сутки ночью, когда нагрузка на сайт минимальна. Гнать полный обмен каждые 15 минут смысла нет, он тяжелее и для сервера 1С, и для сайта.

Если прямого сетевого доступа между сайтом и сервером 1С нет - типичная ситуация, когда 1С стоит в закрытом контуре клиента, связываю их через n8n: с одной стороны сценарий забирает файлы обмена по SFTP или через промежуточное хранилище, с другой - кладёт их туда, откуда их читает обработчик Битрикс. Это стабильнее самописных bash-скриптов на cron, потому что видна история запусков и легко настроить уведомление в Telegram при сбое.

Частые проблемы при интеграции 1С и сайта на Битрикс

За несколько лет таких интеграций типовой набор проблем почти не меняется:

  • Кодировка. 1С по умолчанию отдаёт XML в windows-1251, а часть самописных обработчиков на сайте ждут utf‑8 - товары с кириллицей в характеристиках превращаются в кракозябры.
  • Дубли товаров. Если артикул в 1С меняли вручную или у одной позиции несколько кодов, обмен создаёт вторую карточку вместо обновления существующей.
  • Слетающая структура каталога. Полный обмен перезаписывает разделы по данным 1С, и ручные правки категорий на сайте пропадают при следующем прогоне.
  • Таймауты на хостинге. Обмен по 8-10 тысяч товаров с картинками упирается в лимит времени выполнения PHP-скрипта и обрывается на середине, оставляя каталог в неконсистентном состоянии.
  • Дублирование заказов. Без проверки на уже переданный заказ по внешнему идентификатору при сбое сети один и тот же заказ может уйти в 1С дважды.

Часть этого лечится настройками, часть - переписыванием обработчика под конкретную бизнес-логику клиента. Когда типовой обмен не тянет специфику - скидки, привязанные к статусу клиента в 1С, или несколько юрлиц с разными прайсами на одном сайте, проще сразу заказать доработку модуля обмена под 1С-Битрикс, чем пытаться натянуть стандартную схему.

Сколько стоит настройка обмена между Битрикс и 1С

Разброс в стоимости обычно объясняется не сложностью протокола, а объёмом кастомизации:

Задача Что входит Стоимость
Настройка типового обмена CommerceML Подключение готового модуля, каталог, остатки, заказы без кастомной логики от 40 000 ₽
Доработка обмена под бизнес-логику Кастомные статусы, несколько юрлиц, трек-номера СДЭК, синхронизация оплаты T‑Bank от 40 000 ₽
Интеграция через n8n / REST API 1С в облаке или закрытом контуре, обмен ближе к реальному времени, мониторинг сбоев от 25 000 ₽

На рынке за типовую настройку встречаются расценки и в 15 000-20 000 ₽ у частных разработчиков, но обычно это означает установку модуля без адаптации под реальный каталог - потом всё равно приходится доплачивать за исправление структуры разделов и повторную выгрузку остатков.

Отдельно закладывайте время на тестирование: минимум 2-3 полных цикла обмена на тестовом контуре перед тем, как переключать боевой каталог, иначе первая же ошибка в сопоставлении свойств уронит карточки товаров на живом сайте.

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

Сколько времени занимает настройка обмена между Битрикс и 1С?

Типовой обмен без кастомной логики - 3-5 рабочих дней, включая тестирование на реальном каталоге. С доработкой под статусы заказов, несколько юрлиц или синхронизацию оплаты - от 2 до 3 недель, в зависимости от того, сколько кастомных полей нужно провести через XML.

Можно ли синхронизировать заказы без модуля «1С-Битрикс: Управление сайтом»?

Да, через REST API Битрикс и OData или веб-сервисы 1С, но тогда мэппинг статусов, контрагентов и оплаты пишется с нуля - готового решения под такую связку нет, и по деньгам это, как правило, дороже настройки готового CommerceML-обмена.

Что делать, если каталог выгружается не полностью?

Почти всегда причина в таймауте PHP на стороне сайта или лимите на размер файла. Проверяю max_execution_time и upload_max_filesize в php.ini обработчика обмена и прошу 1С дробить выгрузку на порции по 500‑1000 товаров вместо одного большого файла.

Нужен ли доступ к серверу 1С для настройки обмена?

Для файлового обмена по CommerceML достаточно доступа к базе 1С и к сайту. Если 1С работает в закрытом контуре без выхода в интернет, обмен приходится строить через промежуточное хранилище или n8n на стороне, откуда есть доступ и туда, и туда.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно