Налаштування масового оновлення цін 1С-Бітрікс під ключ
Постачальник прислав прайс-лист із новими закупівельними цінами — 3000 позицій. Роздрібна націнка незмінна — 40%. Потрібно оновити роздрібні ціни до ранку. Вручну — нереально: 8–10 годин монотонної роботи з ризиком помилок округлення. Імпорт через 1С — не завжди є зв’язка. Масове оновлення цін через API Бітрікса — рішення, яке ми налаштовуємо за кілька годин. Скрипт на PHP з використанням D7 ORM обробляє 3000 записів за 2–3 хвилини. Типи цін, прив’язка до інфоблоків, залежність від кількості, скидання тегованого кешу — все це потребує точного коду. Наша команда має 5+ років досвіду в таких задачах і гарантує стабільний результат. Сертифіковані розробники 1С-Бітрікс пропонують комплексне рішення під ключ. Економія бюджету при автоматизації досягає 70% порівняно з ручною працею, а швидкість оновлення зростає в десятки разів.
Які проблеми вирішує масове оновлення цін у 1С-Бітрікс?
Ручне редагування тисяч товарів займає дні, а скрипт справляється за хвилини. Помилки округлення при ручному розрахунку націнки — автоматизація виключає описки. Залежність від 1С — коли обмін через CommerceML не налаштований або тимчасово недоступний, API рятує. Каталоги до 100 000 товарів обробляються без простоїв.
Як працює масове оновлення через D7 ORM?
Ціни зберігаються в b_catalog_price. Ключові поля: PRODUCT_ID, CATALOG_GROUP_ID (тип ціни), PRICE, CURRENCY, QUANTITY_FROM, QUANTITY_TO (для цінових діапазонів). Типи цін — b_catalog_group: BASE — базова, решта — додаткові (роздрібна, оптова, закупівельна). CATALOG_GROUP_ID = 1 зазвичай — базова ціна, але це залежить від конкретної установки.
Порівняння методів оновлення
Прямий API-метод виграє у CommerceML за швидкістю в 50 разів при разових оновленнях — це ключова перевага для термінових задач.
| Метод | Швидкість | Потребує навичок | Підходить для |
|---|---|---|---|
| Імпорт через 1С CommerceML | Середня, залежить від синхронізації | Знання 1С та CommerceML | Регулярні оновлення з 1С |
| Пряме оновлення через API (D7 ORM) | Висока — 3000 записів за хвилини | PHP, Бітрікс API | Разові масові оновлення |
| CSV/Excel + скрипт | Висока, але потребує парсингу | PhpSpreadsheet, Бітрікс D7 | Будь-які оновлення з файлами постачальників |
Робота з PriceTable API
Отримати ID типу ціни за назвою:
$priceType = \Bitrix\Catalog\GroupTable::getList([ 'filter' => ['NAME' => 'Розничная'], 'select' => ['ID'], ])->fetch(); $priceTypeId = $priceType['ID']; Детальніше про PriceTable API читайте в офіційній документації.
Як реалізувати оновлення: від завантаження прайсу до скидання кешу?
Завантаження з Excel/CSV та розрахунок націнки
Прайс від постачальника найчастіше приходить у Excel або CSV. Для парсингу Excel використовується PhpSpreadsheet:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('/path/to/price.xlsx'); $sheet = $spreadsheet->getActiveSheet(); foreach ($sheet->getRowIterator(2) as $row) { // з другого рядка (пропускаємо заголовок) $cells = $row->getCellIterator(); $cells->setIterateOnlyExistingCells(false); $rowData = []; foreach ($cells as $cell) { $rowData[] = $cell->getValue(); } $articul = $rowData[0]; // A: артикул $newPurchase = (float)$rowData[3]; // D: закупівельна ціна // Знайти товар за артикулом $productId = findProductByArticul($articul); if ($productId) { updatePrice($productId, PURCHASE_PRICE_TYPE_ID, $newPurchase); updatePrice($productId, RETAIL_PRICE_TYPE_ID, calcRetailPrice($newPurchase, 40.0)); } } Розрахунок роздрібної ціни за націнкою:
function calcRetailPrice(float $purchasePrice, float $markup): float { return round($purchasePrice * (1 + $markup / 100), 2); } Скидання кешу та лог змін
Після масового оновлення цін сторінки каталогу показують старі ціни з кешу. Скидання кешу для всього каталогу:
\Bitrix\Main\Application::getInstance()->getTaggedCache()->clearByTag('catalog'); // або скидання по інфоблоку \Bitrix\Main\Application::getInstance()->getTaggedCache()->clearByTag('iblock_id_' . $iblockId); Альтернатива — не скидати кеш масово, а дочекатися природного застарівання (TTL). Але якщо ціни змінилися на акційні з конкретним терміном, скидання обов’язкове.
Для аудиту рекомендується перед оновленням зберігати старі ціни в кастомну таблицю catalog_price_history з полями (product_id, price_type_id, old_price, new_price, changed_by, changed_at). Це дозволяє відкотити помилкове оновлення та аналізувати динаміку цін.
Покрокова інструкція з оновлення
- Підготувати прайс-лист у форматі Excel або CSV.
- Розібрати файл за допомогою PhpSpreadsheet, витягти артикули та ціни.
- Виконати валідацію та маппінг артикулів на ID товарів інфоблоку.
- Запустити цикл батчінгу по 100 записів з паузою 50ms для оновлення цін через PriceTable API.
- Розрахувати роздрібну ціну за націнкою та записати обидва типи цін.
- Скинути тегований кеш каталогу.
- Записати лог змін у таблицю
catalog_price_history.
Як уникнути помилок при масовому оновленні?
Тестуйте скрипт на копії каталогу перед бойовим запуском. Увімкніть логування помилок у PHP та використовуйте транзакції в MySQL для атомарності змін. Ми включаємо всі ці елементи в стандартний набір робіт.
Типові помилки
- Невірний ідентифікатор типу ціни — ціни записуються не туди.
- Відсутність батчінгу — MySQL падає на 10 000 товарів.
- Пропущене скидання кешу — старі ціни висять на вітрині.
- Відсутність транзакції — при збої частина цін оновлена, частина ні.
При збої оновлення запустіть скрипт заново — він пропустить уже оновлені записи за наявності прапорця updated. Або використовуйте відкат по таблиці catalog_price_history, якщо вона була створена.
Що входить у налаштування масового оновлення та які гарантії?
- Аналіз поточної структури каталогу та типів цін.
- Розробка скрипта імпорту з Excel/CSV з авторомережею націнки.
- Реалізація батчінгу для великих обсягів (до 100 000 товарів).
- Налаштування скидання тегованого кешу.
- Створення таблиці логу змін.
- Тестування на копії каталогу.
- Документація скрипта та інструкція із запуску.
- Гарантія стабільної роботи 30 днів.
Зв’яжіться з нами для оцінки вашого проєкту. Середня економія часу — 90% при каталогах понад 10 000 товарів.







