Интеграция 1С с OpenCart

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.
Разработка и обслуживание любых видов сайтов:
Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Интеграция 1С с OpenCart
Сложная
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1214
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    852
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1041
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    823
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    815

Интеграция 1С с OpenCart

Синхронизация каталога, остатков и заказов между 1С и OpenCart — стандартная задача для интернет-магазинов с учётной системой. Данные должны течь в обе стороны: товары из 1С в OpenCart, заказы из OpenCart в 1С.

Подходы к интеграции

CommerceML (стандарт 1С) — 1С умеет генерировать XML-файлы в формате CommerceML 2 и обменивать их с сайтом по HTTP. Самый совместимый метод.

REST API — 1С Предприятие 8.3 поддерживает HTTP-сервисы. OpenCart предоставляет REST API. Более гибко, но требует программирования на обеих сторонах.

Прямое подключение к БД — не рекомендуется в production, но используется для одноразовых миграций.

CommerceML интеграция

Протокол: 1С отправляет POST-запросы к специальному скрипту на сайте. OpenCart должен иметь обработчик /index.php?route=api/1c/....

Установить модуль: 1C-Bitrix Exchange (опенсорс) или ocStore Exchange 1C.

Конфигурация в 1С (Обмен данными с сайтом):
  URL сайта: https://shop.ru/index.php?route=api/1c
  Пользователь: API-пользователь OpenCart
  Пароль: ****
  Периодичность: каждые 15 минут (остатки), раз в час (полный каталог)

Кастомный обработчик CommerceML

// catalog/controller/api/exchange1c.php

class ControllerApi1cExchange extends Controller {
    private function authenticate(): bool {
        $token = $this->request->get['token'] ?? $this->request->server['HTTP_X_API_TOKEN'] ?? '';
        return hash_equals($this->config->get('api_1c_token'), $token);
    }

    public function catalog(): void {
        if (!$this->authenticate()) {
            $this->response->setOutput('failure=Unauthorized');
            return;
        }

        $mode = $this->request->get['mode'] ?? '';

        match ($mode) {
            'checkauth' => $this->checkAuth(),
            'init'      => $this->init(),
            'file'      => $this->receiveFile(),
            'import'    => $this->import(),
            default     => $this->response->setOutput('failure=Unknown mode'),
        };
    }

    private function import(): void {
        $filename = $this->request->get['filename'] ?? '';
        $filePath = DIR_UPLOAD . 'exchange1c/' . basename($filename);

        if (!file_exists($filePath)) {
            $this->response->setOutput('failure=File not found');
            return;
        }

        $xml = simplexml_load_file($filePath);
        $this->processProducts($xml);

        $this->response->setOutput('success=Import completed');
    }

    private function processProducts(\SimpleXMLElement $xml): void {
        foreach ($xml->Каталог->Товары->Товар as $product) {
            $sku = (string)$product->Артикул;
            $name = (string)$product->Наименование;
            $price = (float)$product->ЦенаЗаЕдиницу;

            $existingId = $this->getProductIdBySku($sku);

            if ($existingId) {
                $this->model_catalog_product->editProduct($existingId, [
                    'price' => $price,
                    'quantity' => (int)$product->Остаток,
                ]);
            } else {
                $this->model_catalog_product->addProduct([
                    'sku'      => $sku,
                    'model'    => $sku,
                    'name'     => ['ru' => $name],
                    'price'    => $price,
                    'quantity' => (int)$product->Остаток,
                    'status'   => 1,
                ]);
            }
        }
    }
}

Синхронизация остатков (быстрый режим)

Для частого обновления остатков (каждые 5–15 минут) — отдельный лёгкий эндпоинт:

// POST /api/1c/stock
// Body: JSON [{sku: "ART-001", qty: 15}, ...]

public function updateStock(): void {
    $items = json_decode($this->request->post['data'], true);
    $updated = 0;

    foreach ($items as $item) {
        $productId = $this->getProductIdBySku($item['sku']);
        if ($productId) {
            $this->db->query("UPDATE " . DB_PREFIX . "product SET quantity = '" . (int)$item['qty'] . "'
                WHERE product_id = '" . (int)$productId . "'");
            $updated++;
        }
    }

    $this->response->addHeader('Content-Type: application/json');
    $this->response->setOutput(json_encode(['updated' => $updated]));
}

Выгрузка заказов в 1С

// GET /api/1c/orders?from=2024-01-01&status=2

public function getOrders(): void {
    $dateFrom = $this->request->get['from'] ?? date('Y-m-d', strtotime('-1 day'));
    $statusId = (int)($this->request->get['status'] ?? 2);  // 2 = Processing

    $orders = $this->model_sale_order->getOrders([
        'filter_date_added' => $dateFrom,
        'filter_order_status_id' => $statusId,
    ]);

    $result = [];
    foreach ($orders as $order) {
        $products = $this->model_sale_order->getOrderProducts($order['order_id']);
        $result[] = [
            'id'       => $order['order_id'],
            'date'     => $order['date_added'],
            'total'    => $order['total'],
            'customer' => $order['firstname'] . ' ' . $order['lastname'],
            'phone'    => $order['telephone'],
            'address'  => $order['shipping_address_1'],
            'products' => array_map(fn($p) => [
                'sku' => $p['model'],
                'name' => $p['name'],
                'qty'  => $p['quantity'],
                'price' => $p['price'],
            ], $products),
        ];
    }

    $this->response->addHeader('Content-Type: application/json');
    $this->response->setOutput(json_encode(['orders' => $result]));
}

Обработка ошибок и очередь

Для надёжности — асинхронная очередь. Если 1С недоступна, изменения ставятся в очередь:

// Таблица очереди
CREATE TABLE oc_1c_queue (
    id INT AUTO_INCREMENT PRIMARY KEY,
    type ENUM('product', 'stock', 'order') NOT NULL,
    payload JSON NOT NULL,
    status ENUM('pending', 'processing', 'done', 'failed') DEFAULT 'pending',
    attempts INT DEFAULT 0,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    processed_at DATETIME NULL
);

Сроки

Базовая интеграция (каталог + остатки через CommerceML) — 5–7 дней. Двусторонняя интеграция с заказами и очередью — 10–14 дней.