Каждый новый проект с 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 Последовательность:
-
checkauth— 1С проверяет авторизацию -
init— получает лимиты (максимальный размер файла, zip или нет) -
file— загружает XML-файлы -
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С выгружает пути к картинкам относительно архива. Обработка:
- Распаковка архива во временную директорию
- Обработка изображений (ресайз, конвертация в WebP)
- Загрузка в CDN/S3
- Обновление записей в БД
Пример обработки изображения
$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С в пределах гарантийного срока.
Для точного расчёта сроков и бюджета свяжитесь с нашими инженерами. Получить консультацию можно через форму на сайте или по телефону. Мы бесплатно проанализируем вашу выгрузку и предложим оптимальное решение.







