Парсинг данных из Excel/CSV для импорта в 1С-Битрикс
Стандартный импорт 1С-Битрикс через CSV требует строго определённой структуры файла: конкретные заголовки столбцов, конкретная кодировка, конкретный разделитель. Файлы от контент-менеджеров, 1С, поставщиков и маркетологов этим требованиям не отвечают. Задача парсинга — взять произвольный Excel или CSV и привести его к структуре, пригодной для импорта в каталог.
Стандартный импорт Битрикс и его ограничения
Встроенный импорт товаров: Каталог → Импорт из CSV. Работает с файлами UTF-8 или Windows-1251, ожидает заголовки вида NAME, PRICE, QUANTITY, XML_ID, PROPERTY_ARTICUL.
Проблема: реальные файлы имеют произвольные заголовки («Наименование», «Цена без НДС», «Арт.»), несколько строк шапки, объединённые ячейки, сводные листы и декоративные элементы в начале файла.
Решение: промежуточный парсер, который преобразует входной файл в формат, который Битрикс готов принять — или напрямую вносит данные через 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 | «Кофе молотый» → «kofe-molotyi» |
| Обрезка до лимита | NAME до 255 символов |
| Пустые значения | NULL или пустая строка → значение по умолчанию |
Импорт в каталог через API
Два подхода к записи данных в Битрикс:
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 дней |







