Оптимізація швидкості обміну 1С і 1С-Бітрікс
Обмін із 50 000 товарами, що займає 4 години та гальмує весь сайт у робочий час — це не норма, це діагноз. Типова причина: обмін налаштовувався давно під 5 000 товарів, каталог виріс у 10 разів, налаштування ніхто не переглядав. Оптимізація обміну — комплексна робота на стороні обох систем.
Профілювання: знайти вузьке місце
Перш ніж щось оптимізувати — виміряти. Додати часові мітки в лог обміну:
// В обробнику OnIBlockElementImport
$timings[] = [
'step' => 'element_import',
'element' => $elementXmlId,
'time' => microtime(true) - $startTime,
];
Після обміну — проаналізувати: де проходить 80% часу. Варіанти:
- Розбір XML — файли надто великі, не розбиті на частини
- Запис у БД — індекси, тригери, неоптимальні INSERT
- Перерахунок цін — якщо включений автоперерахунок цін за правилами
- Оновлення пошуку — переіндексація пошукового індексу при кожній зміні
Оптимізація розбору XML
Розбити вивантаження на пакети. У налаштуваннях 1С встановити «Кількість елементів у файлі» = 1000–2000. Кожен файл обробляється окремим HTTP-запитом. Бітрікс обробляє файл за 30–60 секунд замість зависання на 2+ години.
Увімкнути ZIP-стиснення. Файл із 2000 товарів без стиснення — 8–15 МБ, зі стисненням — 1–3 МБ. Для каналу між 1С і хостингом це суттєво, особливо при повільному з'єднанні.
У налаштуваннях публікації 1С:
Використовувати стиснення даних: Так
Поріг стиснення: 1024 байт
Оптимізація запису в базу даних
Стандартний імпорт Бітрікс викликає CIBlockElement::Add/Update для кожного елемента — це повний цикл із перевірками, обробниками подій та інвалідацією кешу. Для 50 000 елементів — 50 000 окремих транзакцій.
Вимкнути зайві події на час імпорту:
// Перед імпортом
define('BX_BUFFER_MESS', true); // не надсилати поштові сповіщення
$GLOBALS['STOP_STATISTICS'] = true; // не оновлювати статистику
define('NO_AGENT_STATISTIC', true);
Відкладена переіндексація. Пошук переіндексується після кожної зміни елемента. Для пакетного імпорту — вимкнути автоіндексацію та запустити переіндексацію окремим агентом після завершення обміну:
// Тимчасово вимкнути індексацію
\Bitrix\Main\Config\Option::set('search', 'indexer_auto_mode', 'N');
// Після обміну запустити переіндексацію
CSearch::ReIndexAll(true, CATALOG_IBLOCK_ID);
Відкладена інвалідація кешу. Замість BXClearCache при кожному оновленні елемента — зібрати змінені елементи в масив і інвалідувати кеш батчем у кінці обміну.
Оптимізація запитів до БД при імпорті
При оновленні елемента Бітрікс робить SELECT для перевірки існування, потім UPDATE або INSERT. При пакетному імпорті можна попередньо завантажити всі XML_ID у пам'ять і не робити SELECT на кожен елемент:
// Одним запитом отримати всі існуючі елементи
$existing = [];
$res = CIBlockElement::GetList(
[],
['IBLOCK_ID' => CATALOG_IBLOCK_ID],
false,
false,
['ID', 'XML_ID']
);
while ($el = $res->Fetch()) {
$existing[$el['XML_ID']] = $el['ID'];
}
// Тепер при імпорті: isset($existing[$xmlId]) замість SELECT
Розділення обміну за типом даних
Повний обмін (каталог + ціни + залишки) в одному сеансі — надлишково. Розділити на незалежні потоки:
| Потік | Вміст | Periodичність | Навантаження |
|---|---|---|---|
| Повний каталог | Описи, властивості, зображення | 1 раз/ніч | Висока, вночі |
| Ціни | Тільки offers*.xml з цінами |
Кожну годину | Низька |
| Залишки | Тільки offers*.xml із залишками |
Кожні 15 хв | Мінімальна |
| Замовлення | orders.xml |
Кожні 15–30 хв | Мінімальна |
У 1С можна налаштувати декілька незалежних регламентних завдань для різних типів вивантаження.
Кешування на стороні Бітрікс
Перевірити налаштування кешу модуля каталогу:
Налаштування → Налаштування продуктів → Продуктивність:
- Кеш елементів каталогу: увімкнути, TTL 3600 секунд
- Кеш властивостей: увімкнути
- Кеш торгових пропозицій: увімкнути для магазинів із варіантами
При обміні кеш інвалідується автоматично для змінених елементів. Якщо інвалідація займає багато часу — перевірити розмір кешу на диску (/bitrix/cache/iblock/), при необхідності збільшити memory_limit для обробки.
Кейс: скорочення часу обміну з 4 годин до 25 хвилин
Інтернет-магазин запчастин, 65 000 позицій. Обмін запускався раз на добу та займав 4+ години, блокуючи перерахунок цін на весь цей період.
Виявлені проблеми:
- Весь каталог в одному XML-файлі (240 МБ)
- Переіндексація пошуку при кожному елементі
- Перерахунок цін за 12 правилами при кожній зміні ціни
-
BXClearCacheдля всього інфоблоку на кожні 100 елементів
Після оптимізації:
- Розбивка на файли по 2000 елементів
- Відкладена переіндексація в окремому агенті
- Перерахунок цін — тільки після завершення імпорту, не в процесі
- Батчева інвалідація кешу в кінці сеансу
Результат: повний обмін — 25 хвилин. Обмін тільки залишками та цінами (щогодини) — 3–4 хвилини.
Терміни оптимізації
| Завдання | Термін |
|---|---|
| Профілювання та аналіз поточного обміну | 4–8 годин |
| Розбивка на пакети + ZIP | 2–4 години |
| Відкладена переіндексація + кеш | 1 день |
| Розділення на незалежні потоки | 1–2 дні |
| Повний аудит + кастомний імпорт із батч-записом | 3–5 днів |







