Оптимизация скорости обмена 1С и 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Оптимизация скорости обмена 1С и 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • 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С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Оптимизация скорости обмена 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

Разделение обмена по типу данных

Полный обмен (каталог + цены + остатки) в одном сеансе — избыточно. Разделить на независимые потоки:

Поток Содержимое Периодичность Нагрузка
Полный каталог Описания, свойства, изображения 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 дней