Реалізація імпорту товарів з 1С (CommerceML/XML)

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

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Пропоновані послуги
Показано 1 з 1 послугУсі 2065 послуг
Реалізація імпорту товарів з 1С (CommerceML/XML)
Складна
~5 робочих днів
Часті питання
Наші компетенції:
Етапи розробки
Останні роботи
  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    874
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851

Реалізація імпорту товарів з 1С (CommerceML/XML)

Обмін даними між 1С і сайтом — одна з найбільш затребуваних і технічно неоднозначних задач у веб-розробці. Стандарт CommerceML існує з 2000-х років, але кожна конфігурація 1С реалізує його по-своєму: структура XML, наповнення полів, логіка виповугрузки категорій і характеристик різняться. Універсального рішення не має — потрібна інтеграція під конкретну конфігурацію.

Стандарт CommerceML

1С выгружає дані в ZIP-архівах з XML-файлами:

import.zip
├── import.xml      — каталог товарів, категорії, властивості
├── offers.xml      — склади, ціни, залишки
└── import0.xml     — продовження каталогу (при розбивці на файли)

Приклад структури:

<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.10">
  <Каталог>
    <Группы>
      <Группа>
        <Ид>f47ac10b-58cc-4372-a567-0e02b2c3d479</Ід>
        <Наименование>Електроніка</Наименование>
      </Группа>
    </Группы>
    <Товары>
      <Товар>
        <Ід>550e8400-e29b-41d4-a716-446655440000</Ід>
        <Артикул>IPH-15-PRO-256</Артикул>
        <Наименование>iPhone 15 Pro 256GB</Наименование>
      </Товар>
    </Товары>
  </Каталог>
</КоммерческаяИнформация>

Протокол обміну

1С ініціює обмін через HTTP-запити до сайту. Сайт реалізує обробник на певних URL:

GET  /1c-exchange/?type=catalog&mode=checkauth
GET  /1c-exchange/?type=catalog&mode=init
POST /1c-exchange/?type=catalog&mode=file&filename=import.zip
GET  /1c-exchange/?type=catalog&mode=import&filename=import.xml

Послідовність:

  1. checkauth — 1С перевіряє авторизацію
  2. init — отримує ліміти (максимальний розмір файлу, zip або ні)
  3. file — завантажує XML-файли
  4. import — запрошує імпорт конкретного файлу

Реалізація обробника (PHP/Laravel)

class OnecExchangeController extends Controller
{
    public function handle(Request $request)
    {
        $mode = $request->query('mode');

        return match($mode) {
            'checkauth' => $this->checkAuth($request),
            'init'      => $this->init(),
            'file'      => $this->uploadFile($request),
            'import'    => $this->importFile($request),
            default     => response('failure', 400),
        };
    }

    private function checkAuth(Request $request): Response
    {
        if (!$this->validateCredentials($request)) {
            return response("failure\nНеверний логін або пароль");
        }
        $cookie = Str::random(32);
        Cache::put("1c_session_{$cookie}", true, 600);
        return response("success\nCOOKIE\n1c_session={$cookie}");
    }

    private function init(): Response
    {
        return response(implode("\n", [
            'zip=yes',
            'file_limit=' . (32 * 1024 * 1024),
        ]));
    }

    private function uploadFile(Request $request): Response
    {
        $filename = $request->query('filename');
        $request->file('file')->storeAs('1c-exchange', $filename);
        return response('success');
    }

    private function importFile(Request $request): Response
    {
        $filename = $request->query('filename');
        ImportFrom1cJob::dispatch($filename);
        return response('success');
    }
}

Парсинг XML

class CommerceMLParser
{
    public function parseImport(string $xmlPath): void
    {
        $xml = simplexml_load_file($xmlPath, 'SimpleXMLElement', LIBXML_NOCDATA);

        foreach ($xml->Каталог->Товары->Товар as $item) {
            $guid = (string) $item->Ід;
            $sku  = (string) $item->Артикул;
            $name = (string) $item->Наименование;

            Product::updateOrCreate(
                ['onec_guid' => $guid],
                ['sku' => $sku, 'name' => $name]
            );
        }
    }
}

Обробка offers.xml (ціни та залишки)

public function parseOffers(string $xmlPath): void
{
    $xml = simplexml_load_file($xmlPath);

    foreach ($xml->ПакетПредложений->Предложения->Предложение as $offer) {
        $guid  = (string) $offer->Ід;
        $price = (float)  $offer->Цены->Цена->ЦенаЗаЕдиницу;
        $stock = (int)    $offer->Количество;

        Product::where('onec_guid', $guid)->update([
            'price' => $price,
            'stock' => $stock,
        ]);
    }
}

Асинхронний імпорт

Великі каталоги (10 000+ товарів) не можна обробляти синхронно — 1С очікує відповіді впродовж кількох секунд. Рішення:

  • Файл зберігається відразу (uploadFile)
  • importFile повертає success негайно
  • Обробка запускається в фоні через Laravel Queue
  • Прогрес доступний через окремий endpoint

Лінія часу

Імпорт товарів з однієї конфігурації 1С (каталог + ціни + залишки): 8–12 робочих днів. Включає тестування на реальних даних клієнта та відладку edge-cases конкретної конфігурації 1С.