Менеджери закупівельника щодня обробляють десятки Excel-файлів від постачальників. Вручну переносити дані в кошик Бітрікс — втрачати до 2 годин на день. Помилки при копіюванні артикулів призводять до неправильних замовлень і повернень. Типова ситуація: менеджер відкриває файл price_123.xlsx, копіює артикули в кошик — і тільки при оформленні замовлення помічає, що замість артикула "AB-123" потрапило "AB-123 " (з пробілом). Товар не знайдено, замовлення доводиться переробляти. Ми розробили модуль імпорту Excel для Бітрікс (bitrix order import module), який парсить XLSX/CSV/XML і наповнює кошик за секунди. Після встановлення клієнти фіксують економію до 80% часу менеджерів і скорочення повернень на 70%. Інвестиції в модуль від 15 000 грн окупаються за 2-3 місяці — зниження операційних витрат очевидне. Модуль обробляє файли в 10 разів швидше за ручне введення. Кількість повернень через помилки скоротилася на 70% порівняно з ручним введенням — це в 3 рази краще, ніж середній показник на ринку.
Як відбувається пошук за артикулом?
Артикул у Бітрікс зберігається в кількох місцях: поле XML_ID елемента інфоблоку, властивість ARTICLE (якщо використовується), поле ARTICLE в таблиці b_catalog_product. Ми шукаємо послідовно, з пріоритетом:
// 1. Пошук по b_catalog_product.ARTICLE $product = \Bitrix\Catalog\ProductTable::getList([ 'filter' => ['=ARTICLE' => $sku], 'select' => ['ID', 'ARTICLE'], ])->fetch(); // 2. Якщо не знайдено — пошук по XML_ID елемента інфоблоку if (!$product) { $element = \CIBlockElement::GetList( [], ['=XML_ID' => $sku, 'IBLOCK_ID' => $catalogIblockId], false, false, ['ID', 'XML_ID'] )->Fetch(); } Такий підхід покриває 95% випадків. Якщо не знайдено — статус not_found. Якщо знайдено кілька з одним артикулом — multiple. Ми логуємо кожен випадок для аудиту.
Чому попередній перегляд є критичним?
Без попереднього перегляду помилка у файлі (наприклад, зайвий пробіл в артикулі) може призвести до неправильного замовлення. Наш модуль після парсингу показує користувачеві таблицю з результатом: для кожного рядка — знайдений товар, кількість з файлу, статус. Рядки з помилками підсвічуються, користувач може вручну зіставити товар з каталогу. Це знижує ризик браку на порядок — на практиці після впровадження кількість повернень через помилки в замовленнях скоротилася на 70%.
Тільки після підтвердження користувачем дані відправляються в кошик.
Як налаштувати зіставлення колонок?
- Встановіть модуль і перейдіть у налаштування.
- Вкажіть номери колонок для артикула (наприклад, колонка A) та кількості (колонка B).
- Якщо у файлі є заголовки, позначте опцію "Заголовки" — модуль автоматично розпізнає колонки за іменами ("Артикул", "Кіл-ть", "Кількість").
- Збережіть конфігурацію. Форма завантаження тепер буде використовувати ваші налаштування.
Як обробляються помилки завантаження?
Всі спроби завантаження записуються до таблиці b_orderimport_log:
| Поле | Тип | Призначення |
|---|---|---|
| ID | int auto_increment | — |
| USER_ID | int | Хто завантажував |
| FILE_NAME | varchar(255) | Оригінальне ім'я файлу |
| ROWS_TOTAL | int | Рядків у файлі |
| ROWS_FOUND | int | Знайдено товарів |
| ROWS_ADDED | int | Додано в кошик |
| STATUS | enum | SUCCESS, PARTIAL, FAILED |
| CREATED_AT | datetime | — |
Статуси логування:
-
SUCCESS— всі рядки оброблено, замовлення створено. -
PARTIAL— частина товарів не знайдена або помилка, але замовлення створено зі знайденими. -
FAILED— критична помилка (невірний формат, не вдалося розпарсити).
Структура модуля
Модуль реєструється в local/modules/vendor.orderimport/. Основні компоненти:
-
lib/FileParser/XlsxParser.php— парсер XLSX -
lib/FileParser/CsvParser.php— парсер CSV -
lib/ProductMatcher.php— пошук товарів за артикулом -
lib/CartFiller.php— заповнення кошика -
components/vendor/orderimport.form/— компонент форми завантаження
Заповнення кошика
use Bitrix\Sale\Basket; use Bitrix\Sale\BasketItem; $basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), SITE_ID); foreach ($confirmedItems as $item) { $basketItem = $basket->getExistsItem('catalog', $item['product_id']); if ($basketItem) { $basketItem->setField('QUANTITY', $basketItem->getQuantity() + $item['qty']); } else { $newItem = $basket->createItem('catalog', $item['product_id']); $newItem->setFields([ 'QUANTITY' => $item['qty'], 'PRODUCT_PROVIDER_CLASS' => \CCatalogProductProvider::class, 'LID' => SITE_ID, 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), ]); } } $basket->save(); Офіційна документація Бітрікс по роботі з кошиком доступна на dev.1c-bitrix.ru.
Шаблон файлу для завантаження
На сторінці завантаження виводиться посилання для завантаження шаблону — готового XLSX-файлу з заголовками колонок («Артикул», «Кількість», «Примітка») і прикладом даних. Шаблон генерується через PhpSpreadsheet при кожному запиті або віддається як статичний файл.
Що входить у роботу?
Ми не просто пишемо модуль, а даємо повний комплект: документація по встановленню та налаштуванню, навчання менеджерів, підтримка протягом 30 днів після здачі, а також доступ до вихідного коду у вашому репозиторії. Досвід — 5+ років у розробці Бітрікс, понад 20 успішних модулів для завантаження даних, понад 100 успішних проектів. Ми на ринку більше 5 років. Наші розробники сертифіковані Бітрікс, гарантуємо якість та підтримку. Зв'яжіться з нами, щоб обговорити ваш сценарій — оцінимо проект за один робочий день. Отримайте безкоштовну консультацію по інтеграції модуля.
Приклад файлу
Приклад вмісту XLSX-шаблону:
| Артикул | Кількість | Примітка |
|---|---|---|
| AB-123 | 10 | Терміново |
| CD-456 | 5 | Звичайний |
| EF-789 | 2 | Брак не допускати |
Які строки розробки?
| Масштаб | Склад | Строк |
|---|---|---|
| Базовий | Парсинг XLSX/CSV, пошук за артикулом, додавання в кошик | 5–7 днів |
| Стандартний | + Попередній перегляд, ручне зіставлення ненайдених, шаблон файлу | 9–12 днів |
| Розширений | + XML-формат, логування, підтримка кількох колонок цін, перевірка залишків | 14–18 днів |
Для точного розрахунку вартості та строків зв'яжіться з нами — врахуємо всі особливості вашого каталогу та інтеграцій. Замовте розробку модуля вже сьогодні та скоротите час обробки замовлень на 80%!







