Оптимизация импорта больших объемов данных 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Оптимизация импорта больших объемов данных 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Оптимизация импорта больших объемов данных 1С-Битрикс

Стандартный обмен с 1С через CommerceML обрабатывает 50 000 товаров за 4 часа. Для каталога в 200 000 позиций с 30 свойствами и 5 типами цен — обмен не завершается вообще: упирается в max_execution_time, исчерпывает память или блокирует таблицы на часы. Оптимизация импорта — это работа на трёх уровнях: настройка PHP и БД, доработка процедуры обмена и переход на инкрементальный импорт.

Почему стандартный обмен тормозит

CommerceML-обмен работает так: 1С выгружает полный XML-файл (import.xml + offers.xml), Битрикс парсит его и для каждого элемента вызывает CIBlockElement::Add() или CIBlockElement::Update(). Каждый вызов:

  1. Проверяет права доступа
  2. Вызывает обработчики событий OnBefore*
  3. Записывает элемент в b_iblock_element
  4. Записывает свойства в b_iblock_element_property (отдельный INSERT/UPDATE для каждого свойства)
  5. Записывает цены в b_catalog_price
  6. Обновляет поисковой индекс
  7. Инвалидирует кеш
  8. Вызывает обработчики OnAfter*

Для одного элемента — 10–20 SQL-запросов. Для 200 000 элементов — 2–4 миллиона запросов. Плюс пересоздание фасетного индекса на каждое изменение.

Настройка PHP

Параметр Значение для импорта По умолчанию
max_execution_time 0 (без ограничения) 30
memory_limit 2048M 128M
post_max_size 200M 8M
upload_max_filesize 200M 2M

Эти параметры задаются либо глобально в php.ini, либо для конкретного скрипта обмена через .htaccess или виртуальный хост. Для PHP-FPM — через отдельный пул с увеличенными лимитами для URL /bitrix/admin/1c_exchange.php.

Настройка MySQL

Во время импорта:

  • Отключение sync_binlog (если не используется репликация) — каждый INSERT не будет синхронно записываться на диск: SET GLOBAL sync_binlog = 0;
  • Увеличение innodb_log_file_size до 1–2 ГБ — уменьшает частоту checkpoint и ускоряет запись
  • innodb_flush_log_at_trx_commit = 2 — запись лога транзакций раз в секунду вместо каждой транзакции
  • innodb_autoinc_lock_mode = 2 — ускоряет bulk INSERT (interleaved lock)

После импорта верните настройки к боевым значениям. Для автоматизации — скрипт-обёртка, который меняет параметры перед импортом и возвращает после.

Отключение обработчиков и индексов

Главный ускоритель — отключение лишней работы на время импорта:

  • Обработчики событий. Если на OnAfterIBlockElementUpdate висит отправка уведомлений или обновление внешней системы — при импорте 200 000 товаров это 200 000 HTTP-запросов. Отключайте через флаг: проверяйте defined('CATALOG_IMPORT_RUNNING') в обработчике.
  • Поисковой индекс. Отключить модуль search на время импорта: \Bitrix\Main\ModuleManager::deActivate('search') — радикально, но эффективно. Альтернатива — отключить индексацию инфоблока каталога в настройках модуля поиска.
  • Фасетный индекс. Пересоздание при каждом обновлении товара — бессмысленно при массовом импорте. Отключите автоматическое обновление, после импорта запустите пересоздание один раз.
  • URL-транслитерация и генерация ЧПУ. Если CODE генерируется при сохранении элемента — это дополнительные вычисления. Передавайте CODE из 1С или генерируйте пакетно после импорта.

Пакетный импорт через D7 API

Вместо поэлементного CIBlockElement::Update() — прямая работа с таблицами через D7 ORM:

// Пакетное обновление цен
$connection = Application::getConnection();
$connection->queryExecute("
    INSERT INTO b_catalog_price (PRODUCT_ID, CATALOG_GROUP_ID, PRICE, CURRENCY)
    VALUES (1, 1, 100.00, 'RUB'), (2, 1, 200.00, 'RUB'), ...
    ON DUPLICATE KEY UPDATE PRICE = VALUES(PRICE), CURRENCY = VALUES(CURRENCY)
");

INSERT ... ON DUPLICATE KEY UPDATE позволяет обновлять пакетами по 1000 строк за один запрос вместо 1000 отдельных UPDATE. Ускорение — в 10–50 раз.

Ограничение: при прямой записи в таблицы обработчики событий не вызываются, кеш не инвалидируется, фасетный индекс не обновляется. Всё это нужно сделать вручную после импорта.

Инкрементальный импорт

Полный импорт 200 000 товаров каждую ночь — расточительство, если изменилось 500 позиций. Инкрементальный подход:

  1. На стороне 1С — выгружать только изменённые элементы (по дате модификации)
  2. На стороне Битрикс — принимать дельту через REST API или кастомный endpoint
  3. Сравнение хешей — для каждого товара хранить MD5 от набора ключевых полей. При импорте сравнивать хеш — если не изменился, пропускать

Для проектов с обменом чаще раза в час инкрементальный импорт — единственный рабочий вариант.

Мониторинг и диагностика

  • Лог импорта — Битрикс пишет в /bitrix/catalog_export/. Анализируйте время каждого шага.
  • Slow query log — включите в MySQL на время импорта (long_query_time = 1). Покажет проблемные запросы.
  • ПрофилированиеBitrix\Main\Diag\SqlTracker считает количество и время SQL-запросов. Включите на тестовом прогоне, найдите узкие места.

Сроки оптимизации

Задача Эффект Срок
Настройка PHP + MySQL + отключение обработчиков Ускорение в 2–5 раз 1–2 дня
Пакетный импорт через прямые SQL-запросы Ускорение в 10–50 раз 3–5 дней
Инкрементальный импорт (дельта + хеши) Импорт за минуты вместо часов 1–1.5 недели
Полный комплекс (все три уровня + мониторинг) Каталог 200K+ работает штатно 1.5–2 недели

Ключевой принцип: стандартный обмен CommerceML — это удобство разработки ценой производительности. Для каталогов свыше 50 000 товаров нужно осознанно решать, где стандартный механизм приемлем, а где — прямой SQL и инкрементальная логика.