Парсинг даних з Excel/CSV для імпорту в 1С-Bitrix
Стандартний імпорт 1С-Bitrix через CSV вимагає суворо визначеної структури файлу: конкретні заголовки стовпців, конкретне кодування, конкретний розділювач. Файли від контент-менеджерів, 1С, поставщиків та маркетологів цим вимогам не відповідають. Завдання парсингу — взяти довільний Excel або CSV та привести його до структури, придатної для імпорту в каталог.
Стандартний імпорт Bitrix та його обмеження
Вбудований імпорт товарів: Каталог → Імпорт з CSV. Працює з файлами UTF-8 або Windows-1251, очікує заголовки на кшталт NAME, PRICE, QUANTITY, XML_ID, PROPERTY_ARTICUL.
Проблема: реальні файли мають довільні заголовки («Найменування», «Ціна без ПДВ», «Арт.»), кілька рядків шапки, об'єднані ячейки, зведені аркуші та декоративні елементи на початку файлу.
Рішення: проміжний парсер, який перетворює вхідний файл на формат, який Bitrix готовий прийняти — або безпосередньо вносить дані через API.
Бібліотека PhpSpreadsheet
PhpSpreadsheet — стандартний інструмент для читання Excel у PHP:
use PhpOffice\PhpSpreadsheet\IOFactory;
$spreadsheet = IOFactory::load('/path/to/file.xlsx');
$sheet = $spreadsheet->getActiveSheet();
$rows = $sheet->toArray();
Для великих файлів (> 10 000 рядків) використовуйте режим ReadFilter — читайте лише потрібні стовпці та рядки, без завантаження всього файлу в пам'ять.
Особливості Excel, які ломають наївний парсинг:
- Числа з форматуванням (1 000,50 замість 1000.50) — видаляйте пробіли, замініть кому на крапку.
- Дати зберігаються як числа (серійні дати Excel) — потрібна конвертація.
- Об'єднані ячейки — значення лише у першій ячейці діапазону.
- Приховані рядки та аркуші — ігноруйте.
Маппінг стовпців: підхід із конфігурацією
Замість hardcode «стовпець A — це назва» створіть маппінг у конфігурації:
$mapping = [
'NAME' => 'Найменування товару', // заголовок у файлі
'XML_ID' => 'Артикул',
'PRICE' => 'Ціна без ПДВ',
'QUANTITY' => 'Остаток',
'SECTION' => 'Категорія',
];
Парсер знаходить рядок заголовків (автоматично або за номером рядка), зіставляє з маппінгом та читає дані.
Автоматичне визначення рядка заголовків: сканувати перші 10 рядків, знайти ту, де найбільше збігів з ключами маппінгу.
Трансформація даних
Дані з Excel рідко готові до прямого імпорту. Типові трансформації:
| Трансформація | Приклад |
|---|---|
| Очистка рядка | « Найменування товару » → «Найменування товару» |
| Конвертація чисел | «1 250,00 грн.» → 1250.00 |
| Нормалізація одиниць | «шт.», «шт», «Штука» → уніфікований ID ОМ |
| Транслітерація для CODE | «Кава мелена» → «kava-melena» |
| Обрізка до ліміту | NAME до 255 символів |
| Пусті значення | NULL або порожній рядок → значення за замовчуванням |
Імпорт у каталог через API
Два підходи до запису даних у Bitrix:
1. Через CIBlockElement (класичний API):
$el = new CIBlockElement();
$result = $el->Add([
'IBLOCK_ID' => $iblockId,
'NAME' => $row['NAME'],
'CODE' => $row['CODE'],
'XML_ID' => $row['XML_ID'],
'ACTIVE' => 'Y',
'PROPERTY_VALUES' => [
'ARTICUL' => $row['XML_ID'],
],
]);
2. Через D7 ORM (\Bitrix\Iblock\ElementTable) — лише для читання; запис складніше, для товарів краще CIBlockElement.
Для оновлення існуючих товарів — спочатку знайти за XML_ID, потім $el->Update($id, $fields).
CSV: типові проблеми
Кодування. Файли з 1С приходять у Windows-1251. Перед обробкою: iconv('Windows-1251', 'UTF-8', $content).
Розділювач. Автоматичне визначення: порахуйте кому та крапку з комою в першому рядку — частіше зустрічаються — розділювач.
Переноси рядків у межах ячейки. У CSV значення з переносом беруться у лапки. fgetcsv() правильно обробляє, але лише якщо файл немає проблем із кодуванням лапок.
Графік розробки
| Варіант | Склад | Термін |
|---|---|---|
| Разовий імпорт | Скрипт під один файл | 1 день |
| Налаштовуваний імпортер | Маппінг через конфіг, кілька форматів | 3–4 дні |
| Повна система | UI для завантаження файлів, перегляд до імпорту, історія | 6–8 днів |







