1С интеграция интернет-магазина — синхронизация остатков, цен, заказов 2026

Коротко (TL;DR)1С интеграция через CommerceML 2 протокол — стандарт для Битрикс и корпоративных магазинов. Синхронизация товаров, остатков, цен каждые 15 минут или по событию. Заказы из магазина → в 1С для обработки. Стоимость разработки 200-300k ₸, ROI за 3 месяца (экономия на ручных вводах). Типовые проблемы: дубли товаров, отставание остатков, ошибки в маппинге — решаются предварительной инвентаризацией.

Почему 1С интеграция критична для магазина

В Казахстане ~80% оптовых и B2B магазинов используют 1С для учёта: складские остатки, себестоимость, налоги, финансовые отчёты. Без синхронизации с сайтом вы гарантируете:

Правильная интеграция решает это за 15 минут: обновили цену в 1С → она обновилась в магазине → покупатель видит актуальную цену.

CommerceML 2 — протокол синхронизации

CommerceML — это XML-формат, разработанный 1С для обмена данными. Работает как FTP: 1С кладёт файлы в папку, ваш магазин их парсит и обновляет БД.

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

exchange/
├── offers.xml (товары, цены, остатки)
├── import.xml (справочники: категории, параметры)
├── rests.xml (остатки по складам)
└── orders/ (заказы из магазина → в 1С)

Пример offers.xml (товары и цены)

<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.05">
  <Каталог>
    <Товары>
      <Товар>
        <Ид>SKU_12345</Ид>
        <Наименование>Samsung Galaxy S25</Наименование>
        <Описание>Флагман 2026 года</Описание>
        <Картинка>http://example.com/img/12345.jpg</Картинка>
        <ОписаниеДляСайта>Премиум-смартфон</ОписаниеДляСайта>
        <СтруктураПродукта>
          <Свойство>
            <Наименование>Цвет</Наименование>
            <Значение>Чёрный</Значение>
          </Свойство>
        </СтруктураПродукта>
      </Товар>
    </Товары>
  </Каталог>
  <ПредложениеВерсияСхемы="2.05">
    <Предложения>
      <Предложение>
        <Ид>SKU_12345</Ид>
        <Артикул>GAL-S25-001</Артикул>
        <Наименование>Samsung Galaxy S25 Чёрный</Наименование>
        <Цены>
          <Цена>
            <ИдТипаЦены>розница</ИдТипаЦены>
            <Значение>750000</Значение> <!-- цена в тенге -->
            <Валюта>KZT</Валюта>
          </Цена>
        </Цены>
        <Остатки>
          <Остаток>
            <ИдСклада>Almaty_Main</ИдСклада>
            <Количество>47</Количество>
          </Остаток>
        </Остатки>
      </Предложение>
    </Предложения>
  </ПредложениеВерсияСхемы>
</КоммерческаяИнформация>

Как работает синхронизация

Сценарий 1: Импорт (1С → Магазин)

  1. 1С автоматизм или вручную выгружает комплект в /exchange/ на SFTP сервер магазина
  2. Ваш cronjob каждые 15 мин проверяет новые файлы: curl https://yourshop.kz/api/commerce-sync/import
  3. PHP парсит XML, маппит товары: SKU 1С → product_id в БД
  4. Обновляет цены, остатки, описания
  5. Генерирует отчёт синхронизации (успешно / ошибки) → отправляет на email

Сценарий 2: Экспорт (Магазин → 1С)

  1. Покупатель делает заказ → данные сохраняются в БД
  2. Cronjob экспортирует заказы в 1С CommerceML формат
  3. Файл попадает в /incoming/orders/ на 1С
  4. 1С парсит, создаёт документ "Заказ", привязывает контрагента
  5. Оператор процессирует заказ: комплектует, печатает УПД, отправляет доставщику

Синхронизация остатков (рассинхрон-fix)

Типовая проблема: магазин показывает товар в наличии, а на складе его нет. Почему? Потому что:

Решение: резервирование товара. Когда заказ создан, вы отправляете в 1С "зарезервировать 5 шт Galaxy S25" — и 1С убирает это из доступного остатка. Когда заказ отменён — отпускаете резерв.

Примеры реальных кейсов A-LUX

Кейс 1: Электроника. 5000 товаров, 3 склада (синхронизация каждый час)

Клиент: крупный дистрибьютор электроники в Алматы. 1С: "Управление торговлей" (УТ 11.4). Задача: онлайн-магазин с live остатками по каждому складу. Каждый клиент видит откуда будет доставлен товар (Алматы / Астана / Актау).

Решение: CommerceML импорт по складам. В маппер добавили логику: если остаток на Алматы-складе > 0 → показать опцию "Доставка 1 день". Если на Актау → "Доставка 4 дня".

Результат: конверсия +18%, задержки по наличию −95%, ручная работа −40%. Стоимость разработки: 280k ₸, ROI: 4 месяца.

Кейс 2: Мебель. Динамические цены по скидкам (синхронизация в реальном времени)

Клиент: сеть мебельных магазинов (15 филиалов). Задача: в 1С настроены скидки "VIP клиент -20%, Опт -15%, Розница 0%". Нужно чтобы цены на сайте менялись в зависимости от роли покупателя (личный кабинет).

Решение: вместо单один offers.xml мы парсим несколько типов цен из 1С. При входе в ЛК типируем цену: SELECT price FROM products WHERE type='vip'.

Результат: B2B заказы +45%, покупатели видят свою цену. Стоимость: 320k ₸.

Архитектура синхронизации (примеры кода)

Node.js + PHP для парсинга CommerceML

// commerce-sync.js — cronjob для импорта
const cron = require('node-cron');
const xml2js = require('xml2js');
const fs = require('fs');

const xmlParser = new xml2js.Parser();

// Запускаем каждые 15 минут
cron.schedule('*/15 * * * *', async () => {
  try {
    // Читаем offers.xml с SFTP
    const offerXml = fs.readFileSync('/sftp/exchange/offers.xml', 'utf8');
    const parsed = await xmlParser.parseStringPromise(offerXml);

    const offers = parsed.КоммерческаяИнформация.ПредложениеВерсияСхемы[0].Предложения[0].Предложение;

    for (const offer of offers) {
      const sku1c = offer.Ид[0];
      const price = parseFloat(offer.Цены[0].Цена[0].Значение[0]);
      const rest = parseInt(offer.Остатки[0].Остаток[0].Количество[0]);

      // Обновляем в БД магазина
      await db.query(
        'UPDATE products SET price = ?, rest = ?, updated_at = NOW() WHERE sku1c = ?',
        [price, rest, sku1c]
      );
    }

    console.log(`[${new Date().toISOString()}] Синхронизация успешна: ${offers.length} товаров`);
  } catch (error) {
    console.error('Ошибка синхронизации:', error);
    // Отправляем email алерт
    sendAlert(`[CRITICAL] CommerceML sync failed: ${error.message}`);
  }
});

// Экспорт заказов → 1С
cron.schedule('0 * * * *', async () => { // каждый час
  const orders = await db.query(
    'SELECT * FROM orders WHERE status = ? AND synced_to_1c = 0 LIMIT 100',
    ['confirmed']
  );

  if (orders.length === 0) return;

  // Генерируем XML
  const xml = generateOrdersXml(orders);
  fs.writeFileSync('/sftp/exchange/orders.xml', xml);

  // Отмечаем как синхронизированные
  await db.query(
    'UPDATE orders SET synced_to_1c = 1, synced_at = NOW() WHERE id IN (?)',
    [orders.map(o => o.id)]
  );

  console.log(`Экспортировано ${orders.length} заказов в 1С`);
});

Частые проблемы и решения

Проблема Причина Решение
Дубли товаров SKU в 1С и БД магазина не совпадают Создать таблицу маппинга SKU: unique constraint на (sku1c, product_id)
Остатки не синхронизируются 1С не выгружает остатки (ошибка в DataExchange) Проверить задачи в 1С: "Обмен с интернет-магазинами", включить экспорт остатков
Цены не обновляются Кеш БД магазина не инвалидируется После UPDATE: redis.del(`product:${sku1c}`) или вообще убрать кеш для цен
Заказы не попадают в 1С SFTP доступ заблокирован, неправильный XML Проверить логи парсинга, валидировать XML через XSD схему
Рассинхронизация остатков Несколько магазинов из одного склада Добавить резервирование товара в 1С при создании заказа

Нужна интеграция 1С с вашим интернет-магазином в Алматы?

Мы подключили 150+ магазинов к 1С. Знаем типовые ошибки и как их избежать.

Создать магазин с интеграцией 1С