Кожен новий проєкт з 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С в межах гарантійного терміну.
Для точного розрахунку строків і бюджету зв'яжіться з нашими інженерами. Отримати консультацію можна через форму на сайті або по телефону. Ми безкоштовно проаналізуємо ваше вивантаження та запропонуємо оптимальне рішення.







