Интересный кейс принесли на днях: внезапно отвалился импорт товаров из 1С у магазина на Битриксе
Один кейс по интеграции сайта с 1С
Сибирикс

Один кейс по интеграции сайта с 1С

Интересный кейс принесли на днях: сидели себе ребята с интернет-магазином на битриксе, потихоньку торговали, и вдруг — бабах — отвалился импорт товаров из 1С


Фото с сайта: www.goodfon.ru
Тоска. Работа встала, клиент не идет, в офис можно не приходить. Скоро жрать нечего будет. Версия Битрикса — ну ооочень старая (шестая), техподдержка — кормит отписками. Нужно звать человека с буквой S на груди.

Формальная постановка задачи

CMS: Bitrix, Интеграция с 1С Основная проблема: при выгрузке товаров через файл CommerceML возникает ошибка базы данных:
FILE: /www/bitrix/modules/iblock/classes/mysql/iblockproperty.php LINE:324
MySQL Query Error: ALT ER TABLE b_iblock_element_prop_s209 ADD PROPERTY_7389 int(11),
ADD DESCRIPTION_7389 varchar(255)
[Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535.
You have to change some columns to TEXT or BLOBs

Задачи

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

Результат анализа

  1. Используется сервер баз данных MySQL
  2. В нем технически есть ограничение на суммарную длину строки данных в таблице — 64K (поля типа text и blob — не учитываются, т.к. хранятся отдельно)
  3. Если используется кодировка UTF-8 (как в нашем случае), то на одно поле типа varchar уходит 3×255=765 байт (итого, в базе может быть не более 85 таких столбцов!)
  4. В Битриксе группа товаров хранится в инфоблоках. Конкретно в данной инсталляции — каждый инфоблок хранится в отдельной таблице (это рекомендуемый способ, т.к. снижает нагрузку на базу, за счет уменьшения количества JOIN)
  5. Каждая характеристика товара в базе данных MySQL формируется Битриксом из двух полей в базе данных
  6. Одно из этих двух полей – «description» – по сути не нужно для работы сайта (но архитектурно формируется Битриксом) // Вывод: в качестве быстрой полумеры можно поудалять все такие поля.
  7. Для некоторых разделов в инфоблоке количество характеристик оказалось таково, что мы уперлись в ограничения MySQL
Кто виноват: да никто.

Что решили сделать

Переделать модуль импорта из 1С таким образом, чтобы большая часть характеристик товаров хранилась в сериализованном виде, в одном поле. Способ хранения некоторых ключевых характеристик, необходимых для работы фильтров в каталоге товаров, а также поля-связки (например, связь с производителем) — оставить без изменения.

Минус: в принципе, способ универсальный, но во всех компонентах, где происходит вывод свойств, нужно дополнительно выполнять десериализацию. Нельзя сделать поиск средствами Битрикса по полю, хранимому в сериализации (однако полнотекстовый поиск работать будет).

Решение довольно тривиально, но завязано на структуру инфоблоков клиента.