Парсинг прайс-листов поставщиков для 1С-Битрикс
Прайс-лист поставщика — это Excel-файл, CSV-таблица или PDF, который приходит раз в день, раз в неделю, иногда несколько раз в день. В нём могут быть тысячи позиций с ценами, остатками, характеристиками. Вручную переносить это в каталог 1С-Битрикс невозможно — слишком долго и слишком много ошибок. Задача парсинга — читать прайс поставщика и обновлять данные в каталоге автоматически.
Форматы прайс-листов и стратегии парсинга
Прайс-листы поставщиков редко бывают стандартными. Каждый — своя структура, свои столбцы, своя кодировка.
| Формат | Особенности парсинга |
|---|---|
| Excel (.xlsx, .xls) | PhpSpreadsheet для чтения; нужно найти строку заголовков, пропустить рекламные блоки |
| CSV | fgetcsv(), учитывать разделитель (; или ,) и кодировку (Windows-1251 у российских поставщиков) |
| ODS (OpenDocument) | PhpSpreadsheet поддерживает |
| Сложнее всего: pdftotext или API сервиса OCR; структура теряется |
Главная проблема Excel-прайсов: каждый поставщик делает свой формат. У одного артикул в колонке A, у другого — в E. У одного три строки шапки, у другого — одна. Парсер должен быть настраиваемым: для каждого поставщика задаётся маппинг столбцов.
Архитектура системы импорта
Хранение настроек поставщиков лучше вынести в отдельную структуру (инфоблок или кастомная таблица):
Поставщик:
- Название
- Способ получения прайса (FTP / email / HTTP / Telegram)
- Формат файла
- Маппинг колонок: {артикул: A, название: B, цена: C, остаток: D}
- Правила трансформации: {цена: умножить на 1.3, название: префикс "Бренд X"}
- Расписание обновления
- Тип цены в Битрикс (ID прайс-листа)
Маппинг колонок в коде представляется массивом, который передаётся в универсальный класс-парсер. Это позволяет добавлять новых поставщиков без изменения кода.
Получение прайс-листа
Способы получения файла:
-
FTP/SFTP — поставщик выкладывает файл на сервер, скрипт скачивает по расписанию. Используется
ftp_connect()или библиотекаphpseclib. -
HTTP ссылка —
file_get_contents()илиcurl. Некоторые поставщики требуют авторизацию — HTTP Basic или cookie-сессию. -
Email — письмо с вложением. Парсер подключается к IMAP-ящику (
imap_open()), ищет письма от поставщика, скачивает вложение. - Telegram-бот поставщика — редко, но встречается: забирать файл через Telegram Bot API.
Обновление цен и остатков в 1С-Битрикс
После парсинга файла данные нужно внести в каталог. Ключевой идентификатор — артикул (ARTICLE или XML_ID в инфоблоке).
Обновление цены:
\Bitrix\Catalog\PriceTable::update($priceId, [
'PRICE' => $newPrice,
'CURRENCY' => 'RUB',
]);
// или массовое через CCatalogProduct::SetOptimalPrice()
Обновление остатков:
\Bitrix\Catalog\StoreProductTable::update($storeProductId, [
'AMOUNT' => $newAmount,
]);
// или если работаете без складов:
CCatalogProduct::Update($productId, ['QUANTITY' => $newQty]);
Поиск товара по артикулу:
$result = \Bitrix\Iblock\ElementTable::getList([
'filter' => ['IBLOCK_ID' => $catalogIblockId, 'CODE' => $article],
'select' => ['ID', 'NAME'],
]);
Если артикул не найден — логировать как «неопознанный товар» (не создавать автоматически, это риск мусора в каталоге).
Логирование и контроль качества
Критически важная часть, которую часто игнорируют. Каждый запуск импорта должен писать в лог:
- Количество строк в файле.
- Количество обновлённых товаров.
- Количество не найденных артикулов (с перечнем).
- Ошибки чтения файла.
- Время выполнения.
Лог хранится в инфоблоке «Журнал импорта» или в отдельной таблице. Уведомление на email администратора при ненулевом количестве ошибок.
Производительность при больших прайсах
Прайс-лист на 50 000 позиций при наивном подходе (запрос к БД на каждую строку) будет обрабатываться часами. Правильная стратегия:
- Пакетное чтение: читать Excel блоками по 1000 строк, не загружать весь файл в память.
-
Кэш артикулов: перед импортом загрузить все существующие артикулы в массив
['ARTICLE' => 'BITRIX_ID']. Поиск по массиву в памяти вместо запроса к БД на каждую позицию. -
Массовые обновления: вместо
UPDATEна каждую строку — использовать транзакцию или пакетный API.
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Один поставщик, Excel/CSV | Парсер + импорт цен и остатков | 2-3 дня |
| Несколько поставщиков | Конфигурируемая система маппинга | 4-6 дней |
| Полная система | Все форматы, UI управления поставщиками, логи | 7-10 дней |







