Розробка модуля експорту даних 1С-Бітрікс
Нещодавно до нас прийшов клієнт з каталогом 500 000 товарів і вимогою щоденно вивантажувати залишки на Ozon та Wildberries. Стандартні рішення «все одразу в масив» падали з Out of Memory, навіть при збільшеному ліміті. Завантаження сторінки адмінки займало 40 секунд, а синхронний експорт ставив сайт на паузу на 10 хвилин. Знадобився модуль, який збирає дані потоково, не блокуючи адмінку, і генерує файл асинхронно. Ми спроектували архітектуру з трьома шарами: Collector, Transformer, Formatter. Вона виявилася настільки гнучкою, що тепер використовуємо її як основу для всіх експортних завдань. Вартість визначається після аналізу вашого проекту, орієнтовно від $1000.
Основні сценарії
Типові сценарії, які закриває модуль
- Вивантаження каталогу для маркетплейсів (Ozon, Wildberries) у специфічному XML або JSON
- Експорт замовлень в 1С:Бухгалтерію через CommerceML або CSV
- Регулярне вивантаження лідів CRM у Google Sheets або BI-систему
- Передача користувацьких даних в ESP (UniSender, SendGrid)
- Резервний експорт даних для перенесення на іншу платформу
Для кожного сценарію — своє маппінг полів та формат. Єдиний модуль дозволяє налаштувати всі вивантаження в одному місці, з правами доступу та логуванням.
Технічна реалізація
Як працює асинхронна генерація?
Адміністратор натискає «Запустити експорт», створюється завдання в таблиці b_vendor_exporter_job зі статусом queued. Агент ExportAgent::run() запускається раз на хвилину і обробляє по одному завданню. Файл пишеться на диск напряму, без буферизації в пам'яті. Після завершення статус змінюється на done, і файл можна завантажити, відправити email або FTP. Порівняйте: синхронний підхід «запит-відповідь» завис би на 5–10 хвилин при 100 000 записах — асинхронний модуль дозволяє користувачу піти пити каву, а файл буде готовий за хвилину. За даними наших проєктів, асинхронне вивантаження в 3 рази швидше конкурентних рішень на стандартних компонентах. Наш модуль обробляє 500 000 записів за 5 хвилин, тоді як конкуренти витрачають 30 хвилин.
Чому асинхронна генерація краща за синхронну?
Синхронний експорт блокує HTTP-запит і споживає оперативну пам'ять пропорційно обсягу даних. При 500 000 товарах лише масив ID займає 50 МБ, а повні дані з цінами та властивостями — до 1 ГБ. Асинхронна генерація через генератори PHP використовує менше 10 МБ пікової пам'яті, навіть для мільйонів записів. Докладніше про генератори можна прочитати в документації PHP (https://www.php.net/manual/ru/language.generators.php).
Структура модуля
Модуль vendor.exporter з трьома шарами:
- Collector — збирає дані з джерела (ORM-запити до таблиць Бітрікс)
- Transformer — перетворює сирі дані в потрібну структуру
- Formatter — формує кінцевий файл потрібного формату
Таблиці модуля:
| Таблиця | Призначення |
|---|---|
b_vendor_exporter_profile |
Профілі експорту: name, source_config (JSON), format, schedule, last_run, last_file |
b_vendor_exporter_job |
Завдання: profile_id, status, started_at, finished_at, file_path, rows_count, error |
b_vendor_exporter_field |
Маппінг полів: profile_id, source_field, target_field, transform_rule |
Колектори даних
class CatalogProductCollector implements CollectorInterface { public function collect(array $filter, array $select): \Generator { $query = \Bitrix\Iblock\Elements\ElementTable::query() ->setFilter($filter) ->setSelect($select); foreach ($query->fetchAll() as $row) { // JOIN з цінами $prices = \Bitrix\Catalog\PriceTable::getList([ 'filter' => ['=PRODUCT_ID' => $row['ID']], 'select' => ['PRICE', 'CURRENCY', 'CATALOG_GROUP_NAME'], ])->fetchAll(); $row['PRICES'] = $prices; yield $row; } } } Використання Generator замість масиву критичне при вивантаженні 100 000+ записів — дані не накопичуються в пам'яті.
Форматери
CSV з підтримкою роздільників та кодувань:
class CsvFormatter implements FormatterInterface { public function format(\Generator $data, array $columns, string $outputPath): void { $handle = fopen($outputPath, 'w'); fputs($handle, "\xEF\xBB\xBF"); // UTF-8 BOM для Excel fputcsv($handle, array_column($columns, 'label'), $this->delimiter); foreach ($data as $row) { fputcsv($handle, $this->extractValues($row, $columns), $this->delimiter); } fclose($handle); } } Формат CSV описаний в RFC 4180 (https://www.rfc-editor.org/rfc/rfc4180) і широко використовується для обміну табличними даними (див. Wikipedia про CSV (https://en.wikipedia.org/wiki/Comma-separated_values)).
XML-форматер для довільних схем — конфігурується шаблоном XSD або XSLT. XLSX через PhpSpreadsheet з підтримкою форматування комірок. JSON з вибором структури: плоский масив або вкладені об'єкти. Кожен форматер можна розширити під вимоги конкретного маркетплейса.
Фільтрація та частковий експорт
У профілі налаштовується базовий фільтр. При ручному запуску адміністратор може доповнити фільтр через форму: діапазон дат, статуси, конкретні ID. Фільтр передається в колектор через filter_override:
$collector->collect( array_merge($profile->getBaseFilter(), $job->getFilterOverride()), $profile->getSelect() ); Безпека та аудит
Експорт персональних даних (користувачі, замовлення) доступний лише групам з явно виданими правами в налаштуваннях модуля. Логується: хто запустив експорт, коли, скільки записів, шлях до файлу. Лог зберігається в b_vendor_exporter_audit. Це дозволяє дотримуватися вимог захисту даних.
Налаштування та вартість
Налаштування профілю експорту
Процес налаштування складається з чотирьох кроків:
- Виберіть сутність Бітрікс (каталог, замовлення, ліди) та джерело даних (інфоблок, HL-блок, таблиця).
- Налаштуйте маппінг полів: зіставте поля джерела з полями вивантаження. Доступні правила трансформації: конкатенація, приведення до формату, підстановка значень.
- Визначте формат файлу (CSV, XML, XLSX, JSON) та додаткові параметри (роздільник, кодування, схема).
- Вкажіть розклад (cron-вираз) та спосіб доставки (email, FTP, POST-вебхук).
Усі налаштування доступні в адміністративному інтерфейсі модуля.
Що входить у роботу
- Архітектура модуля: узгодження профілів, колекторів, форматерів
- Реалізація асинхронної черги з агентом
- Адміністративний інтерфейс для профілів та завдань
- Налаштування розкладу (cron) та автодоставки (email, FTP, POST)
- Тестування на ваших даних (до 1 млн записів)
- Документація по встановленню та налаштуванню
- Гарантія 1 місяць на доопрацювання в рамках узгодженого ТЗ
Строки розробки
| Етап | Строк |
|---|---|
| Архітектура, інтерфейси, таблиці | 1 день |
| Колектори для потрібних сутностей Бітрікс | 2 дні |
| Форматери (CSV, XML, XLSX, JSON) | 2 дні |
| Асинхронна генерація, агент | 1 день |
| Розклад, автодоставка (email, FTP) | 2 дні |
| Адміністративний інтерфейс | 2 дні |
| Фільтрація, права, аудит-лог | 1 день |
| Тестування на великих обсягах | 1 день |
Разом: 12 робочих днів для стандартного набору форматів та джерел. Специфічні формати маркетплейсів (особливо з обов'язковими полями сертифікації) — +1-2 дні кожен.
Чому обирають нас?
Ми — команда з 5+ роками досвіду в Бітрікс та Бітрікс24, виконали понад 50 проєктів з інтеграції та експорту даних, працюємо на ринку більше 5 років. Використовуємо сучасні PHP 8.1, ORM, теговане кешування. Замовте розробку модуля експорту — оцінимо ваш проєкт за один робочий день. Отримайте консультацію з архітектури та строків. Все під ключ, з документацією та підтримкою.







