Оптимізація швидкості обміну 1С та 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Оптимізація швидкості обміну 1С та 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • 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
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Оптимізація швидкості обміну 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+ години, блокуючи перерахунок цін на весь цей період.

Виявлені проблеми:

  1. Весь каталог в одному XML-файлі (240 МБ)
  2. Переіндексація пошуку при кожному елементі
  3. Перерахунок цін за 12 правилами при кожній зміні ціни
  4. BXClearCache для всього інфоблоку на кожні 100 елементів

Після оптимізації:

  • Розбивка на файли по 2000 елементів
  • Відкладена переіндексація в окремому агенті
  • Перерахунок цін — тільки після завершення імпорту, не в процесі
  • Батчева інвалідація кешу в кінці сеансу

Результат: повний обмін — 25 хвилин. Обмін тільки залишками та цінами (щогодини) — 3–4 хвилини.

Терміни оптимізації

Завдання Термін
Профілювання та аналіз поточного обміну 4–8 годин
Розбивка на пакети + ZIP 2–4 години
Відкладена переіндексація + кеш 1 день
Розділення на незалежні потоки 1–2 дні
Повний аудит + кастомний імпорт із батч-записом 3–5 днів