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

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

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

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 2062 услуг
Реализация импорта товаров из 1С (CommerceML/XML)
Сложный
~5 дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1358
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    956
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    947

Каждый новый проект с 1С приносит сюрприз: XML-структура отличается от предыдущей конфигурации. Поле Наименование может быть обязательным, а Артикул — отсутствовать. Группы товаров вложены неравномерно, а изображения лежат в ZIP-архиве с непредсказуемыми путями. Универсального парсера не существует — нужен механизм, адаптирующийся под конкретную выгрузку. Мы специализируемся на интеграциях 1С более 8 лет, выполнили свыше 100 проектов. Опыт позволяет предвидеть проблемные места до начала разработки и гарантировать стабильный обмен даже при изменении конфигурации. Если вам нужен надёжный импорт товаров из 1С, обратитесь к нам — мы проанализируем вашу выгрузку за один день.

CommerceML — это стандарт обмена данными, рекомендованный 1С для передачи каталогов и заказов между системами. Далее разберём, что он из себя представляет.

Почему CommerceML-импорт требует доработки?

Даже при стандартной выгрузке возможны отклонения: отсутствие GUID, нестандартные имена свойств, вложенность групп более 3 уровней. Без маппинга полей сайт либо потеряет часть данных, либо упадёт с ошибкой. Мы настраиваем соответствие между полями 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. Обновление записей в БД
Пример обработки изображения
$image = Image::make(storage_path("tmp/{$path}"));
$image->fit(800, 800);
$image->encode('webp', 80);
$s3->put("products/{$guid}.webp", $image->encoded);
Product::where('onec_guid', $guid)->update(['image' => "products/{$guid}.webp"]);

Как обрабатывать каталоги >10 000 позиций?

Для больших каталогов используем потоковый парсинг через XMLReader. Это позволяет обрабатывать XML-файлы размером до 500 МБ без переполнения памяти. Фоновые очереди (RabbitMQ, Redis) гарантируют, что импорт не заблокирует работу сайта. Кастомная интеграция в 3 раза снижает количество ошибок обмена по сравнению с типовыми модулями.

Сроки и стоимость

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

Что входит в работу

Этап Результат
Анализ выгрузки 1С Описание структуры XML, маппинг полей
Разработка обработчика Контроллер с маршрутами, парсеры
Настройка очередей Фоновый импорт через Laravel Queue
Обработка изображений Ресайз, WebP, загрузка в S3
Тестирование Импорт реального каталога, проверка edge-cases
Документация Инструкция для администратора по запуску обмена
Обучение Демонстрация процесса импорта, ответы на вопросы
Поддержка после запуска 30 дней мониторинга и исправления ошибок

Сравнение подходов: готовые модули vs кастомная разработка

Критерий Готовый модуль (например, «1С-Битрикс: Обмен данными») Кастомная интеграция
Адаптация к конфигурации 1С Ограничена стандартом, часты расхождения Полный контроль над маппингом
Производительность Зависит от реализации модуля Оптимизируется под ваш каталог
Поддержка нестандартных полей Только стандартные свойства Любые поля, дополнительные преобразования
Стоимость Бесплатно или недорого Инвестиция, окупаемая стабильностью
Срок внедрения От 1 дня 8–12 дней

Кастомная разработка часто оказывается дешевле в долгосрочной перспективе — особенно для компаний со сложной номенклатурой (1000+ позиций, множеством характеристик). Мы гарантируем стабильный обмен даже при изменении конфигурации 1С в пределах гарантийного срока.

Для точного расчёта сроков и бюджета свяжитесь с нашими инженерами. Получить консультацию можно через форму на сайте или по телефону. Мы бесплатно проанализируем вашу выгрузку и предложим оптимальное решение.

Интеграция с 1С:Предприятие: обмен товарами, заказами, остатками

Утро понедельника. Менеджер открывает сайт и видит, что позиция, которую распродали в пятницу, до сих пор «в наличии». Три клиента уже оплатили товар, которого нет. Мы сталкиваемся с этой болью регулярно: отсутствие синхронизации между 1С и интернет-магазином бьёт по деньгам и репутации. Решаем проблему под ключ — настраиваем обмен так, чтобы учётная система и витрина обновлялись синхронно, без потери данных и с гарантией консистентности.

1С — учётная система большинства российских компаний. Сайт — витрина. Они должны говорить на одном языке и делать это регулярно, надёжно и без потери данных. Наш опыт — более 50 успешных интеграций для заказчиков с каталогами от 500 до 200 000 SKU.

Почему стандартный CommerceML не всегда спасает?

CommerceML — стандартный протокол обмена, который поддерживают 1С:Управление торговлей, 1С:Комплексная автоматизация и ряд других конфигураций. WooCommerce, Shopify и другие CMS имеют плагины для работы с CommerceML (например, «1С-Битрикс» для своих продуктов, отдельные плагины для WordPress). Поток: 1С инициирует обмен → отправляет ZIP-архив с XML на endpoint сайта → сайт разбирает, обновляет каталог.

Формат CommerceML — XML со своей схемой: КоммерческаяИнформация, Классификатор, Каталог, ПакетПредложений. Категории, товары, характеристики, изображения, цены, остатки. Главная сложность — иерархия характеристик в 1С и атрибуты товаров на сайте не всегда совпадают один к одному. Нужен маппинг. Для глубокого понимания протокола рекомендуем документацию на WikipediaWikipedia: CommerceML.

Как мы обходим ограничения CommerceML

Для нестандартных конфигураций 1С или когда CommerceML не подходит — пишем HTTP-сервис в 1С (встроенная возможность начиная с версии 8.3) и взаимодействуем через REST JSON. Это даёт полный контроль над структурой данных и частотой синхронизации, но требует разработки со стороны 1С-программиста.

Для enterprise-задач с несколькими учётными системами — Message Broker (RabbitMQ, Apache Kafka) как посредник. 1С публикует события в очередь, сайт подписывается и обрабатывает. Гарантированная доставка, буферизация при недоступности одной из сторон.

Что синхронизируем и как

Каталог (товары, категории, характеристики). Самая объёмная часть. Полная выгрузка при первом запуске, дельта-обновления в дальнейшем. При импорте CommerceML: парсим XML через PHP SimpleXML или XMLReader (для больших файлов — только XMLReader, иначе memory limit). Сопоставляем товары по GUID из 1С, который храним в отдельном поле БД. Если товар удалён в 1С — скрываем на сайте, не удаляем (история заказов может ссылаться).

Остатки и цены. Это отдельный ПакетПредложений в CommerceML, обновляется чаще каталога. Критично делать атомарно: не обновлять остаток по одному, а транзакцией. Иначе в момент обновления пользователь может увидеть неконсистентное состояние. Частота: раз в час для спокойного режима, раз в 5–15 минут для активной торговли.

Заказы. Двусторонний обмен. Сайт → 1С: новый заказ передаётся с номенклатурой, количеством, ценами, контактными данными покупателя. 1С → сайт: статус заказа (оплачен, собран, отгружен, доставлен). Для передачи заказов — либо тот же CommerceML (блок Документы), либо прямой REST-вызов при создании заказа на сайте.

Типичные проблемы, которые решаем

Дублирование товаров. 1С-оператор создал позицию с опечаткой в артикуле, потом исправил. На сайте — два товара. Решение: сопоставление по GUID из 1С (не по артикулу), GUID неизменен.

Кириллица в XML и кодировки. 1С исторически работает с Windows-1251. CommerceML файл может прийти в CP1251, PHP ожидает UTF-8. mb_convert_encoding() или iconv() в первых строках парсера — обязательно.

Таймауты при большой выгрузке. Каталог из 100 000 позиций — это 50–200MB XML. PHP default execution time 30s не хватит. Решение: CLI-команда (Laravel Artisan или Symfony Console), запускаемая через cron, без HTTP timeout. Либо chunked processing через XMLReader с частичными коммитами в БД.

Изображения. 1С может передавать изображения Base64 внутри XML (раздувает файл в 1.3 раза) или ссылками на файлы. Второй вариант предпочтительнее. Скачиваем асинхронно, конвертируем в WebP, кладём в медиабиблиотеку.

Кейс: интернет-магазин запчастей, 85 000 SKU. Синхронизация через CommerceML каждые 30 минут. Проблема: полная выгрузка занимала 18 минут, в итоге новая выгрузка начиналась, пока старая ещё шла. Решение: lock через Redis (SET nx ex), дельта-выгрузка (только изменённые позиции за последние 2 часа через фильтр в 1С), обработка через очередь с 20 параллельными workers. Время синхронизации: 18 минут → 2.5 минуты, конфликтов нет.

Сравнение методов интеграции

Метод Скорость синхронизации Гибкость настройки Ресурсоёмкость
CommerceML Высокая (бинарный XML) Низкая (фиксированная схема) Низкая (почти не давит на сервер)
REST API напрямую Средняя (JSON) Высокая (любая модель) Средняя (нужны 2 Http-сервера)
Message Broker (RabbitMQ/Kafka) Очень высокая (асинхронно) Средняя (событийная архитектура) Высокая (нужен кластер брокера)

CommerceML в типовых сценариях быстрее REST для синхронизации каталога в 2-3 раза за счёт бинарной упаковки XML и компактного формата. Однако, если требуется кастомная логика обмена, REST даёт полную гибкость.

Процесс и сроки

Аудит конфигурации 1С (версия, тип конфигурации, возможности выгрузки) → проектирование маппинга данных → разработка приёмника на сайте и отправщика в 1С → тестирование на реальных данных → настройка расписания → мониторинг первых обменов.

Участие 1С-программиста со стороны клиента — обязательно или мы привлекаем проверенного специалиста.

Сценарий Срок
CommerceML, каталог + остатки, WooCommerce 2–4 недели
Двусторонний обмен заказами +2–3 недели
Кастомная конфигурация 1С, REST API 4–8 недель
Enterprise: несколько баз 1С, шина данных 2–4 месяца

Что входит в результат (deliverables)

  • Документация: схема маппинга, форматы данных, логика обработки ошибок.
  • Настроенное расписание синхронизации с логами выполнения.
  • Доступ к мониторингу (Grafana/ELK — по договорённости).
  • Обучение менеджеров: как запускать ручной обмен, как читать логи.
  • Гарантийная поддержка после запуска — 2 недели (исправление инцидентов).

Получите консультацию

Оценим ваш проект за один рабочий день — пишите на почту или в чат. Стоимость интеграции рассчитывается индивидуально, бюджет начинается от 50 000 ₽ для простых сценариев. При комплексной настройке с REST и брокером — до 300 000 ₽. Свяжитесь с нами, чтобы обсудить детали. Более 7 лет опыта в интеграциях с 1С — гарантируем стабильную синхронизацию без сюрпризов.