Как ускорить выгрузку товаров и предложений из 1С:Управление торговлей в Битрикс и исправить ошибку Lock wait timeout exceeded

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Интеграция 1С:Управление торговлей с CMS 1С-Битрикс — стандартная задача для интернет-магазинов, однако при росте базы товаров до десятков тысяч позиций обмен может замедлиться вплоть до полной остановки. Особенно остро эта проблема проявляется при выгрузке торговых предложений (характеристик товаров), объем которых часто в разы превышает количество базовых номенклатурных позиций. Выгрузка каталога из 7 000 товаров и 42 000 предложений не должна занимать сутки — при правильной настройке этот процесс длится не более нескольких десятков минут.

В этой статье мы подробно разберем, почему зависает обмен, проанализируем критическую ошибку СУБД Lock wait timeout exceeded и по шагам настроим систему на максимальную производительность.

Шаг 1. Локализуем узкое место обмена

Прежде чем приступать к оптимизации кода или настроек сервера, нам необходимо четко понять, на чьей стороне происходит задержка: на стороне 1С при формировании файлов выгрузки или на стороне сайта при их обработке. Проанализируем логи и выполним простую диагностику:

  1. Выгрузим данные из 1С в локальный каталог (на диск компьютера/сервера), минуя отправку на сайт. Для этого в настройках узла интеграции временно сменим режим отправки с «На сайт» на «В каталог на диске».
  2. Замерим время формирования файлов import.xml и offers.xml. Если 1С генерирует файлы быстро (в пределах 10–20 минут для нашей базы), значит, проблема на 100% лежит на стороне веб-сервера и базы данных Битрикс.
  3. Если же 1С формирует локальные файлы часами, проблему нужно искать в запросах 1С, производительности дисковой подсистемы сервера 1С или в некорректно настроенных отборах. В нашей ситуации 1С выгружает 6 822 элемента номенклатуры и 43 218 предложений в XML примерно за час, а основное «залипание» и последующие ошибки происходят уже на этапе обработки файлов сервером Битрикс.

Шаг 2. Разбор ошибки Lock wait timeout exceeded

При обработке предложений на стороне Битрикс часто возникает критическая ошибка, которая прерывает импорт:


[Bitrix\Main\DB\SqlQueryException] 
Mysql query error: (1205) Lock wait timeout exceeded; try restarting transaction (400)
DELETE FROM b_cache_tag WHERE TAG = 'iblock_id_28'

Проанализируем эту ситуацию. Ошибка Lock wait timeout exceeded означает, что один из SQL-запросов ожидал освобождения блокировки таблицы дольше, чем разрешено настройками СУБД (параметр innodb_lock_wait_timeout, который по умолчанию равен 50 секундам).

Запрос пытается очистить тегированный кэш для инфоблока предложений (ID 28): DELETE FROM b_cache_tag WHERE TAG = 'iblock_id_28'. При обновлении каждого из 42 000 торговых предложений Битрикс пытается сбросить связанный с ним кэш. Таблица b_cache_tag при этом может содержать миллионы записей. В условиях высокой нагрузки и медленного диска один шаг импорта блокирует таблицу, а параллельный процесс (или следующий шаг импорта) пытается выполнить аналогичное удаление, упирается в блокировку и падает по таймауту.

Шаг 3. Оптимизация работы с управляемым кэшем Битрикс

Чтобы избавиться от блокировок таблицы b_cache_tag, выполним следующие действия:

  1. Очистим и оптимизируем таблицу кэша в СУБД. Выполним в панели управления базой данных (например, через phpMyAdmin или консоль MySQL) следующие запросы:

DELETE FROM b_cache_tag WHERE SITE_ID IS NULL AND CACHE_SALT IS NULL;
OPTIMIZE TABLE b_cache_tag;

Это удалит устаревшие теги кэша и дефрагментирует таблицу, существенно ускорив операции чтения и удаления.

  1. Отключим запись управляемого кэша инфоблоков на время импорта. Для этого откроем конфигурационный файл /bitrix/php_interface/dbconn.php (или аналогичный файл настроек) и добавим инструкцию, которая запретит кэширование инфоблоков при вызовах скрипта обмена:

if (strpos($_SERVER['REQUEST_URI'], '/bitrix/admin/1c_exchange.php') !== false) {
    define("CACHED_b_iblock", false);
    define("CACHED_b_iblock_bucket_size", 0);
}

Это предотвратит лавинообразную запись и удаление тегов кэша в процессе парсинга XML-файлов.

  1. Перенесем кэш в оперативную память. Если ваш проект развернут на VPS, настоятельно рекомендуется перевести хранение кэша с файловой системы или MySQL на Redis или Memcached. Настройка выполняется в файле /bitrix/.settings.php. Это полностью уберет операции записи кэша из базы данных MySQL, разгрузив дисковую подсистему.

Шаг 4. Настройка параметров импорта в панели 1С-Битрикс

Перейдем в административную панель сайта в раздел Магазин -> Интеграция с 1С на вкладку Каталог (или «Экспорт каталога») и отрегулируем параметры пошаговой загрузки:

Шаг 5. Очистка неактивных элементов каталога

Большое количество старых, неактивных товаров и предложений, которые давно не продаются, но хранятся в базе данных «на всякий случай», колоссально замедляют операции сравнения при импорте. При каждом обмене Битрикс сопоставляет пришедшие из XML данные с уже существующими записями в таблицах b_iblock_element и b_catalog_product.

Выясним количество неактивных товаров:

  1. Перейдем в раздел Контент -> Инфоблоки -> Типы инфоблоков -> Каталоги.
  2. Выберем инфоблок товаров и инфоблок предложений.
  3. Включим фильтр по активности: Активность = Нет.
  4. Если обнаружены тысячи неактивных позиций, которые больше никогда не будут поставляться, их необходимо удалить. Перед удалением обязательно создайте резервную копию базы данных сайта!
  5. После удаления неактивных позиций выполним оптимизацию базы данных через административный раздел Битрикса: Настройки -> Инструменты -> Оптимизация БД, нажав кнопку «Оптимизировать».

Шаг 6. Тонкая настройка СУБД MySQL на сервере

Часто виртуальные серверы (VPS) поставляются со стандартными настройками MySQL, которые ориентированы на минимальное потребление оперативной памяти и совершенно не подходят для тяжелых транзакционных систем вроде связки 1С и Битрикс. Разберем три ключевых параметра конфигурационного файла СУБД (my.cnf):

  1. innodb_buffer_pool_size — важнейший параметр для движка таблиц InnoDB. Он определяет объем оперативной памяти, выделяемый под кэширование данных и индексов таблиц. По умолчанию он может быть равен всего 128 МБ. Увеличьте его значение так, чтобы в него помещалась вся ваша активная база данных (рекомендуется выделять до 60-70% от общего объема RAM сервера, например, innodb_buffer_pool_size = 4G на сервере с 8 ГБ RAM).
  2. innodb_flush_log_at_trx_commit — по умолчанию этот параметр равен 1, что требует записи лога транзакции на диск при каждом коммите. Это гарантирует сохранность данных при сбое, но создает колоссальную нагрузку на диски при массовом импорте предложений. Установка значения 2 заставит MySQL сбрасывать лог на диск раз в секунду, что ускорит запись данных в таблицы Битрикса в несколько раз.
  3. innodb_lock_wait_timeout — увеличим время ожидания блокировок с дефолтных 50 до 120-180 секунд (innodb_lock_wait_timeout = 150). Это позволит шагам импорта дожидаться завершения предыдущих тяжелых транзакций без генерации ошибки 1205.

Шаг 7. Настройка планов обмена на стороне 1С

Проанализируем настройки выгрузки в самой «1С:Управление торговлей». Главная ошибка администраторов — регулярный запуск **полной выгрузки** вместо дельта-выгрузки (только изменений).

Выясним причину, почему 1С каждый раз пытается выгрузить все 42 000 предложений:

Применение этих комплексных мер позволит сократить время обработки предложений с десятков часов до нескольких минут, ликвидирует взаимные блокировки таблиц MySQL и обеспечит стабильную и быструю работу интернет-магазина.

← На главную