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

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

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация импорта товаров из 1С (CommerceML/XML)
Сложная
~5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • 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С (CommerceML/XML)

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

Стандарт CommerceML

1С выгружает данные в ZIP-архивах с XML-файлами нескольких типов:

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

Структура import.xml:

<?xml version="1.0" encoding="UTF-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.10">
  <Каталог>
    <Группы>
      <Группа>
        <Ид>f47ac10b-58cc-4372-a567-0e02b2c3d479</Ид>
        <Наименование>Электроника</Наименование>
        <Группы>
          <Группа>
            <Ид>6ba7b810-9dad-11d1-80b4-00c04fd430c8</Ид>
            <Наименование>Смартфоны</Наименование>
          </Группа>
        </Группы>
      </Группа>
    </Группы>
    <Товары>
      <Товар>
        <Ид>550e8400-e29b-41d4-a716-446655440000</Ид>
        <Артикул>IPH-15-PRO-256</Артикул>
        <Наименование>iPhone 15 Pro 256GB Natural Titanium</Наименование>
        <ЗначенияСвойств>
          <ЗначениеСвойства>
            <Ид>color-property-id</Ид>
            <Значение>Natural Titanium</Значение>
          </ЗначениеСвойства>
        </ЗначенияСвойств>
        <Картинка>images/iphone15pro.jpg</Картинка>
      </Товар>
    </Товары>
  </Каталог>
</КоммерческаяИнформация>

Протокол обмена

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
    {
        // 1С отправляет логин/пароль в Basic Auth
        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), // 32MB
        ]));
    }

    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

XML из 1С — это кириллические теги в пространстве имён. Парсинг через SimpleXML/DOMDocument прямолинеен:

class CommerceMLParser
{
    public function parseImport(string $xmlPath): void
    {
        $xml = simplexml_load_file($xmlPath, 'SimpleXMLElement', LIBXML_NOCDATA);
        $catalog = $xml->Каталог;

        // Рекурсивно обрабатываем дерево категорий
        $this->processGroups($catalog->Группы->Группа);

        // Товары
        foreach ($catalog->Товары->Товар as $item) {
            $this->processProduct($item);
        }
    }

    private function processProduct(SimpleXMLElement $item): void
    {
        $guid = (string) $item->Ид;
        $sku  = (string) $item->Артикул;
        $name = (string) $item->Наименование;

        // Свойства товара
        $attributes = [];
        foreach ($item->ЗначенияСвойств->ЗначениеСвойства as $prop) {
            $attributes[(string)$prop->Ид] = (string)$prop->Значение;
        }

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

Обработка offers.xml (цены и остатки)

public function parseOffers(string $xmlPath): void
{
    $xml = simplexml_load_file($xmlPath);
    $packageOffers = $xml->ПакетПредложений;

    foreach ($packageOffers->Предложения->Предложение 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 / Celery
  • Прогресс доступен через отдельный endpoint или административный интерфейс

Изображения

1С выгружает пути к картинкам относительно архива. Обработка:

  1. Распаковка архива во временную директорию
  2. Обработка изображений (ресайз, конвертация в WebP)
  3. Загрузка в CDN/S3
  4. Обновление записей в БД

Типичные проблемы

  • Encoding — 1С выгружает в UTF-8, но иногда попадаются файлы в Windows-1251
  • Большие файлы — XML на 100+ МБ, нужен потоковый парсинг через XMLReader вместо SimpleXML
  • Конфликты GUID — при работе нескольких баз 1С GUID может пересекаться
  • Неполные выгрузки — 1С может отправлять только изменения, не весь каталог

Сроки

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