Владимир Завертайлов

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

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

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

CMS: Bitrix, Интеграция с 1С Основная проблема: при выгрузке товаров через файл CommerceML возникает ошибка базы данных:

 FILE: /www/bitrix/modules/iblock/classes/mysql/iblockproperty.php LINE:324 MySQL Query Error: ALTER 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С таким образом, чтобы большая часть характеристик товаров хранилась в сериализованном виде, в одном поле. Способ хранения некоторых ключевых характеристик, необходимых для работы фильтров в каталоге товаров, а так же поля-связки (например, связь с производителем) — оставить без изменения.

Минусы

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

Решение

Довольно тривиально, но завязано на структуру инфоблоков клиента. Пример реализации.

Комментарии

У вас есть проект?

Давайте обсудим его. Продумаем. И сделаем!

Заказать клёвый проект
Заявка отправлена
Спасибо, ваша заявка отправлена. Эксперт студии Сибирикс свяжется с вами в ближайшее время для уточнения подробностей.