WordPress · 6 мин чтения

Интеграция 1С с интернет-магазином: как настроить обмен

За последний год у меня было десяток проектов, где интеграция 1С с интернет-магазином делалась не для галочки, а потому что менеджер руками переносил по 40-60 заказов в день в учётную систему и регулярно путал остатки. Обмен между сайтом и 1С снимает эту рутину: цены и остатки подтягиваются в магазин автоматически, а заказы падают в 1С без участия человека. Ниже разбираю, как это устроено технически, какие способы обмена подходят под разные платформы и сколько такая настройка стоит на практике.

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

В основе большинства решений лежит формат CommerceML, протокол обмена коммерческой информацией, который 1С понимает «из коробки» ещё с версии 8.1. Каталог, цены и остатки выгружаются из 1С в виде XML-файлов import.xml и offers.xml, сайт их разбирает и обновляет карточки товаров. Обратно, из сайта в 1С, идёт файл orders.xml с новыми заказами и покупателями.

Есть два варианта передачи этих файлов. Файловый обмен: 1С кладёт XML в сетевую папку или на FTP, сайт периодически их забирает. Работает надёжно, но задержка обычно 15-30 минут. HTTP-обмен: тот же CommerceML, но поверх HTTP-запросов, без промежуточной папки, так работает нативный обмен 1С-Битрикса и большинства готовых модулей для WooCommerce.

Для самописного бэкенда и для Tilda в сценариях сверх штатной синхронизации по CommerceML я обычно ухожу от классического CommerceML и поднимаю HTTP-сервис или OData в самой базе 1С:Предприятие 8.3. Это свой REST API поверх учётной системы: сайт дергает конкретные методы и получает только нужные поля, без лишнего веса файлового обмена.

curl -u exchange_user:exchange_pass \
  "https://1c.example.ru/base/hs/stock/v1/remains?sku=SKU-10245"

Ответ приходит в JSON с остатком по складам, и уже логика на сайте решает, показывать товар в наличии или нет.

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

Полная выгрузка всего каталога имеет смысл раз в сутки, ночью, когда нагрузка на сервер минимальна. Остатки и цены меняются чаще, поэтому под них делаю частичный, дифференциальный обмен: 1С отдаёт только то, что изменилось с прошлой синхронизации. На среднем магазине в 3-5 тысяч позиций это сокращает время выгрузки с нескольких минут до 10-15 секунд.

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

Отдельно слежу за идентификаторами товаров. Если сопоставление между базами идёт по названию, а не по артикулу или GUID, после первой же смены названия в 1С на сайте появляется задвоенная карточка. Поэтому всегда завязываю связку на уникальный код номенклатуры, а не на текст.

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

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

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

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

Выгрузка заказов из интернет-магазина в 1С

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

Важный момент - идемпотентность. Если обмен запускается повторно после сбоя сети, заказ не должен продублироваться в 1С. Решаю это либо через номер заказа сайта как уникальный ключ поиска, либо через отдельное поле «ID заказа на сайте» в справочнике заказов 1С, по которому проверяю, был ли документ уже создан.

Персональные данные покупателей, телефон, адрес, email, в этой цепочке нигде не должны оседать во внешних облачных таблицах вроде Google Sheets, только сама 1С и сервер на площадке в РФ. Это не только вопрос удобства, но и требование 152-ФЗ по хранению персональных данных.

Настройка обмена на популярных платформах

Готовность к обмену у разных движков разная, и от этого сильно меняется объём работы.

1С-Битрикс

Здесь CommerceML встроен и на стороне сайта, и на стороне 1С:Управление торговлей. Обычно моя работа - настроить сопоставление свойств каталога, расписание и фильтры, например не выгружать снятые с продажи позиции, а не писать обмен с нуля.

WordPress и WooCommerce

Нативного обмена нет, но есть плагины уровня WP-CommerceML, которые разбирают те же XML-файлы. В большинстве проектов плагин приходится дорабатывать под конкретную структуру каталога в 1С: свои характеристики, несколько складов, нестандартные единицы измерения.

Tilda и самописные сайты

У Tilda HTTP-обмен CommerceML есть штатно: в разделе «Товары» магазина включается «Синхронизация через CommerceML», 1С:Управление торговлей (10.3.4 и выше) выгружает туда товары, цены и остатки и забирает заказы, склад при этом один, а по CommerceML одновременно подключается либо 1С, либо МойСклад. Обмен через HTTP-сервис 1С и n8n строю сверх этого: когда складов несколько, конфигурация нетиповая или облачная без доступа к узлу обмена, либо данные нужно обогащать. Тогда n8n забирает остатки из 1С по расписанию, собирает из них offers.xml и отдаёт файл в тот же приёмник CommerceML Тильды по стандартному протоколу обмена 1С, а Tilda API для этого не подходит, он работает только на чтение. Если самостоятельно поднимать такую связку некогда, настройку обмена 1С с сайтом можно заказать отдельно.

Ошибки, из-за которых обмен 1С и сайта ломается

На практике причины сбоев почти всегда одни и те же:

  • Рассинхронизация остатков при резком всплеске заказов: сайт продал больше, чем реально осталось на складе, потому что обмен ещё не подтянул актуальные цифры
  • Смешение CommerceML 2 и 3: готовый плагин ждёт одну версию схемы, 1С выгружает другую, и часть полей, например характеристики товара, теряется
  • Таймауты на больших выгрузках: при каталоге от 20-30 тысяч позиций полная синхронизация не укладывается в лимит выполнения скрипта на хостинге, обмен рвётся на середине
  • Кодировка windows-1251 вместо utf‑8 в файлах от старых версий 1С: тексты характеристик превращаются в кракозябры на сайте
  • Тихие сбои без уведомлений: обмен упал ночью, а заметили это только через два дня по жалобам клиентов на несуществующий товар

Последний пункт закрываю проще всего: ставлю в n8n или в сам скрипт обмена проверку кода ответа и телеграм-бота, обычно на aiogram, который присылает сообщение в рабочий чат при первом же сбое, а не постфактум.

Сколько стоит и сколько занимает интеграция 1С с интернет-магазином

Цена зависит от того, что уже готово на стороне 1С и сайта, и от объёма данных, которые гоняются туда-обратно. Ориентиры по моим проектам:

Задача Цена Срок
Кастомный скрипт обмена для Tilda (каталог, остатки, заказы, статусы оплаты) от 40 000 ₽ 7-10 дней
Обмен через n8n без изменения кода сайта от 25 000 ₽ 5-7 дней
Свой модуль CommerceML на Python (файловый обмен) от 20 000 ₽ 5-10 дней
Интернет-магазин под ключ с готовой интеграцией 1С от 80 000 ₽ от 3 недель
Техподдержка обмена (мониторинг, донастройка) от 15 000 ₽/мес -

На рынке за похожую доработку под Tilda или WooCommerce часто просят 60 000-120 000 ₽ у студий, потому что закладывают время на разбор чужой архитектуры 1С с нуля. У меня цена ниже за счёт того, что часть модулей обмена, парсинг CommerceML, шаблон HTTP-сервиса, я переиспользую и адаптирую под конкретную базу, а не пишу заново.

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

Какой формат обмена лучше - CommerceML или свой HTTP-сервис?

Если сайт уже поддерживает CommerceML, как 1С-Битрикс или готовые плагины WooCommerce, использую его, переписывать нет смысла. Свой HTTP-сервис оправдан, когда сайт кастомный или нужны нестандартные поля, которых в CommerceML просто нет.

Можно ли настроить обмен 1С с Tilda?

Да, и коробочное решение есть у самой Tilda: «Синхронизация через CommerceML» в разделе «Товары» для 1С:Управление торговлей. Обмен через HTTP-сервис 1С и n8n собираю, когда штатного не хватает: несколько складов, нетиповая или облачная 1С, обогащение данных; прослойка приводит данные к формату CommerceML и отдаёт их в штатный приёмник Тильды.

Что делать, если после синхронизации задвоились товары?

Почти всегда причина в сопоставлении по названию вместо уникального кода. Проверяю, на каком поле завязан поиск совпадений в скрипте обмена, и переключаю его на артикул или GUID номенклатуры из 1С.

Как часто должны обновляться остатки на сайте?

Для магазина с активными продажами - каждые 15-30 минут. А для заказов в обратную сторону, из сайта в 1С, такая задержка не годится: тут нужна передача сразу по событию, иначе менеджер увидит новый заказ позже клиента, который уже написал в поддержку.

Есть задача?

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

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

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