Каждое утро — новый прайс-лист от поставщика. Excel, CSV или PDF с тысячами позиций. Переносить вручную? Ошибки неизбежны, время уходит. Недавно обратился клиент с 15 поставщиками — менеджеры тратили 4 часа в день на ручное обновление цен. Мы автоматизируем этот процесс: пишем парсер, который читает прайс и обновляет каталог в 1С-Битрикс. За 2-3 дня получаете готовую систему импорта под одного поставщика. Для нескольких — настраиваемая конфигурация без переписывания кода. Экономия времени достигает 80%.
Почему парсинг прайс-листов — это не просто загрузка CSV?
Прайс-листы поставщиков редко бывают стандартными. Каждый — своя структура, свои столбцы, своя кодировка. У одного артикул в колонке A, у другого — в E. У одного три строки шапки, у другого — одна. Парсер должен быть настраиваемым: для каждого поставщика задаётся маппинг столбцов.
| Формат | Особенности парсинга |
|---|---|
| Excel (.xlsx, .xls) | PhpSpreadsheet для чтения; нужно найти строку заголовков, пропустить рекламные блоки |
| CSV | fgetcsv(), учитывать разделитель (; или ,) и кодировку (Windows-1251 у российских поставщиков) |
| ODS (OpenDocument) | PhpSpreadsheet поддерживает |
| Сложнее всего: pdftotext или API сервиса OCR; структура теряется |
Как настроить маппинг для каждого поставщика?
Хранение настроек поставщиков лучше вынести в отдельную структуру (инфоблок или кастомная таблица):
Поставщик:
- Название
- Способ получения прайса (FTP / email / HTTP / Telegram)
- Формат файла
- Маппинг колонок: {артикул: A, название: B, цена: C, остаток: D}
- Правила трансформации: {цена: умножить на 1.3, название: префикс "Бренд X"}
- Расписание обновления
- Тип цены в Битрикс (ID прайс-листа)
Маппинг колонок в коде представляется массивом, который передаётся в универсальный класс-парсер. Это позволяет добавлять новых поставщиков без изменения кода.
$mapping = [
'article' => 'A',
'name' => 'B',
'price' => 'C',
'stock' => 'D',
'transformations' => ['price' => 'multiply(1.3)']
];
Получение прайс-листа
Способы получения файла:
- 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 в инфоблоке). Официальная документация: D7 API для цен
Обновление цены:
\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'],
]);
Если артикул не найден — логировать как неопознанный товар (не создавать автоматически, это риск мусора в каталоге).
Как настроить систему импорта: пошагово
- Анализ прайса поставщика. Определяем структуру, формат, разделители. Собираем образцы файлов.
- Настройка маппинга. Создаём конфигурацию: колонка артикула, цены, остатка. Указываем правила преобразования (умножение, префикс).
- Интеграция получения файла. Настраиваем FTP, email или HTTP. Тестируем скачивание.
- Тестирование импорта. Запускаем на тестовом каталоге. Проверяем точность обновлений (целевая — 99.5%).
- Деплой и мониторинг. Разворачиваем на боевом сервере, настраиваем уведомления об ошибках.
Логирование и контроль качества
Критически важная часть, которую часто игнорируют. Каждый запуск импорта должен писать в лог:
- Количество строк в файле.
- Количество обновлённых товаров.
- Количество не найденных артикулов (с перечнем).
- Ошибки чтения файла.
- Время выполнения.
Лог хранится в инфоблоке "Журнал импорта" или в отдельной таблице. Уведомление на email администратора при ненулевом количестве ошибок. При обработке 50000 позиций мы обеспечиваем точность до 99.5%.
Производительность при больших прайсах
Прайс-лист на 50000 позиций при наивном подходе (запрос к БД на каждую строку) будет обрабатываться часами. Правильная стратегия:
- Пакетное чтение: читать Excel блоками по 1000 строк, не загружать весь файл в память.
- Кэш артикулов: перед импортом загрузить все существующие артикулы в массив
['ARTICLE' => 'BITRIX_ID']. Поиск по массиву в памяти вместо запроса к БД на каждую позицию. - Массовые обновления: вместо
UPDATEна каждую строку — использовать транзакцию или пакетный API.
Благодаря этим методам импорт 50000 позиций занимает менее 5 минут — ускорение в 10 раз по сравнению с построчной обработкой.
Что входит в работу
- Анализ формата и структуры прайс-листа поставщика.
- Разработка парсера с настраиваемым маппингом.
- Интеграция с каталогом 1С-Битрикс (обновление цен, остатков, свойств).
- Настройка получения файла (FTP, email, HTTP).
- Система логирования и уведомлений об ошибках.
- Документация и инструкция по добавлению новых поставщиков.
- Обучение администратора и поддержка в течение месяца.
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Один поставщик, Excel/CSV | Парсер + импорт цен и остатков | 2-3 дня |
| Несколько поставщиков | Конфигурируемая система маппинга | 4-6 дней |
| Полная система | Все форматы, UI управления поставщиками, логи | 7-10 дней |
За нашими плечами более 100 проектов. Оценим ваш случай — свяжитесь с нами, и мы предложим решение под ключ с гарантией результата. Получите консультацию инженера уже сегодня.







