Кейс Fashion Fabrique × MWI: как перевести работающий магазин с OpenCart на Битрикс и не сломать приложение, бонусы и доставку

Fashion Fabrique — интернет-магазин женской одежды, который клиент решил перевести с OpenCart на 1С-Битрикс, не останавливая продажи. Параллельно он своими силами развивал мобильное приложение на imshop*, работавшее на его же боевом ядре Битрикса, и вел бонусы с промокодами через программу лояльности MAXMA.

Из-за этого задача «перенести сайт на Битрикс» довольно быстро перестала быть миграцией. Она превратилась в пересборку участка системы, где одно изменение могло задеть сразу три связанных контура.

За 5 месяцев MWI отработала 404 часа: 214 ушло на программирование и интеграции, 93 на дизайн, 55 на тестирование. Только этап приемки дал 209 итераций отладки.

Кейс интернет-магазина fashionfabrique.com
01

Почему нельзя было просто перенести сайт

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

Магазин продолжал работать и продавать каждый день, поэтому остановить его на время миграции было нельзя. При этом мобильное приложение на imshop клиент развивал самостоятельно, но оно работало с тем же боевым Битриксом. В этот же контур была встроена MAXMA — через нее сайт и приложение получали бонусы и промокоды.

Получился треугольник: сайт, приложение и MAXMA. Они использовали общие данные, но развивались независимо друг от друга. Рассинхрон между ними стал самым повторяющимся источником ошибок за все пять месяцев — и самым трудоемким участком проекта.

Кейс интернет-магазина fashionfabrique.com

Первым это подтвердил инцидент, к которому MWI не имел никакого отношения.

02

Одна строка

В октябре 2025 года клиент сменил тариф на хостинге. После этого его боевой Битрикс перестал открываться: база данных отвалилась с ошибкой прав доступа.

Причину нашли за 8 минут. В файле bitrix/php_interface/after_connect_d7.php при каждом подключении к базе выполнялась команда SET innodb_strict_mode=0 — обходной прием, оставшийся от прежних настроек. На старом тарифе привилегия на нее у пользователя БД была. На новом ее не стало, и падало все подключение целиком, а с ним магазин.

Лечение — закомментировать одну строку:

//$this->queryExecute("SET innodb_strict_mode=0");

Магазин поднялся, а восстановление привилегий передали поддержке хостинга. Этот эпизод показал особенность проекта: MWI работала с уже действующей инфраструктурой клиента, и проблемы могли возникать не только в коде, который разрабатывала команда.

03

«Сейчас оно холодное и безликое»

Клиент хотел не только сменить платформу, но и освежить ключевые страницы, поэтому проект начался с дизайн-аудита. После чего стало очевидно, что дело не только в устаревшем визуале. В мобильной версии перегружена шапка, карточки уходят в длинный скролл без подгрузки, фото мелкие. В каталоге нет привычных для fashion-магазина механик: быстрого просмотра, блока новинок и хитов, рекомендаций «дополните образ». Оформление заказа требует слишком многих шагов, купить как гость нельзя. В интерфейсе вперемешку русский и английский — «NEW», «Bestsellers», «Sale» рядом с русскими названиями страниц каталога. Поэтому редизайн затронул не только внешний вид, но и основные пользовательские сценарии.

Под десктоп 1920 px и мобайл 375 px переработали главную, каталог, карточку товара, корзину и оформление заказа. Отдельно добавились шесть страниц личного кабинета и три окна авторизации — вход, ввод SMS-кода, регистрация. Ориентирами тональности были айдентики Zara и Lime.

Кейс интернет-магазина fashionfabrique.com
04

Что переделали

Работу вели поверх копии боевого Битрикса клиента: сняли дамп на 35 ГБ, развернули на dev-сервере MWI, подключили Git. Требования зафиксировали в ТЗ примерно на 1850 строк с поблочной спецификацией каждой страницы.

Каталог и цены. Товары и торговые предложения* через инфоблоки: цвет, размер, изображения предложений. Умный фильтр, сортировки по цене, новизне и популярности, AJAX-подгрузка «Показать еще», два вида отображения карточек, поиск с морфологией и исправлением опечаток. Отдельная история — зачеркнутая старая цена: она собрана через тип цены «Цена со скидкой» плюс правило корзины и продублирована обработчиком OnGetOptimalPrice, иначе в части сценариев скидка не попадала на витрину.

Личный кабинет и авторизация. Смена телефона и почты через подтверждение кодом, история заказов с повторением заказа одной кнопкой, баланс и история бонусов напрямую из MAXMA. Вход двумя способами — по SMS и по паролю, с передачей ФИО в MAXMA при регистрации и правках профиля.

Интеграции. 1С как источник товаров и габаритов. MAXMA — бонусы и промокоды, с приоритетом проверки сначала в MAXMA, при ошибке в Битриксе. СДЭК с картой пунктов выдачи и расчетом стоимости, подсказки адресов через DaData. RetailCRM для заказов. Рассрочки «Сплит» и «Долями». Яндекс.Метрика с электронной коммерцией.

Доставка и СДЭК. Настроили карту пунктов выдачи, расчет стоимости и подсказки адреса через DaData. Отдельно исправили передачу габаритов: 1С отдает их в метрах, а Битрикс ожидает миллиметры. Для доставки задали минимальные тарифы 700 ₽ до ПВЗ и 900 ₽ курьером, бесплатная доставка — от 25 000 ₽.

Перенос на боевой сделали в режиме многосайтовости*: магазин и приложение работают на одном ядре Битрикса через симлинки на общие каталоги, PHP подняли до 8.2. Публичную часть после переезда временно закрыли под администратором, чтобы проверить сервисы и почту до прихода покупателей.

Кейс интернет-магазина fashionfabrique.com

Миграция закончилась не тогда, когда сайт был собран

На перенос ушло меньше времени, чем на доведение результата до стабильного состояния.

Из 214 часов бэкенда 141 час занял сам перенос с интеграциями, а 83 — отладка по приемке. Это в два с лишним раза больше, чем вся верстка проекта. Отладка шла с 3,5 месяца: одна задача, 209 комментариев. Три узла оказались самыми трудоемкими.

Производительность. Каталог и карточки открывались долго, подгрузка «Показать еще» подвисала — причем даже на товарах без изображений и в админке. Оптимизировали запросы, убрали лишний пересчет корзины. И сразу получили регресс*: в приложении сломалось отображение скидки на доставку, потому что оно опиралось ровно на этот пересчет. Дальше пришлось искать баланс между скоростью сайта и корректностью приложения.

Доставка за 105 тысяч рублей. Заказ, оформленный из приложения, показал стоимость доставки СДЭК около 105 000 ₽. Разбор привел к габаритам: 1С отдает их в метрах, Битрикс считает в миллиметрах, и без конвертации коробка с блузкой превращается в груз размером с комнату. На сайте конвертация уже работала — но заказ из приложения шел своим маршрутом и эту логику не получал. Заодно выяснилось, что правило бесплатной доставки от 25 000 ₽ в приложении вообще не срабатывало.

Кейс интернет-магазина fashionfabrique.com

Рассинхрон сайта, MAXMA и приложения. Бонусы, промокоды, ФИО, стоимость доставки — везде, где данные ходили между тремя системами, они расходились. Это не чинится одним фиксом. Понадобился набор обработчиков и жестко зафиксированные приоритеты источников для каждого типа данных.

Дальше пошли уже те проблемы, которые невозможно поймать по одному счастливому сценарию. С телефона нельзя было оформить заказ: скрипт не находил блок согласия на обработку персональных данных. В личном кабинете счетчик показывал семь заказов вместо одного, а «Повторить заказ» приводил к пустой корзине. При регистрации создавались дубли пользователей с одинаковыми телефоном или почтой. Анонимное избранное терялось при авторизации вместо слияния с аккаунтом. Бонусы списывались сверх доступного баланса. Карты кликов в Метрике не работали из-за заголовка X-Frame-Options — добавили исключения в nginx.

Все это вскрывалось на постраничном приемочном тестировании: шесть отдельных задач по главной, каталогу, карточке, корзине, оформлению заказа и личному кабинету, каждая — на трех брейкпоинтах* — десктоп, 768 и 375 px. К каждому дефекту прикладывали скринкаст и консоль с JS-ошибками, поэтому разработчик сразу видел, как именно его воспроизвести.

05

Что мы изменили в плане работ по ходу проекта

По ходу отладки стало ясно, что часть проблем с производительностью кодом не лечится: виртуальный хостинг слабый, версия MySQL устаревшая. Мы диагностировали это как узкое место, согласовали с клиентом и перенесли на VDS оба сайта — магазин и приложение — с обновлением MySQL до восьмой версии. Переподключили почту и SMS, перебросили домены, прогнали штатную «Проверку системы» Битрикса, попутно вылечили всплывшую проблему с сессиями.

По ходу разработки в нескольких местах выяснилось, что требования ТЗ можно реализовать проще, без потери для пользователя. Общие настройки сайта — задавать в настройках, а не через инфоблоки. Изображение товара — сделать обязательным полем, чтобы отсутствие фото не ломало верстку каталога. Правовые страницы — привести к единому стилю вместо переноса как есть.

06

Что в итоге

Магазин переведен на новую платформу без остановки продаж. Переезд с OpenCart на 1С-Битрикс прошел при работающем магазине, с сохранением связок с 1С, MAXMA, СДЭК, RetailCRM и мобильным приложением.

Согласовали логику трех связанных контуров. Для бонусов, промокодов и расчета доставки зафиксировали источники данных и приоритеты, а рассинхроны между сайтом, приложением и MAXMA исправили на этапе приемки.

Обновили пользовательский контур. Новый дизайн ключевых страниц, каталог с фильтрацией и подгрузкой, покупка гостем, SMS-авторизация, личный кабинет с историей и повторением заказов, бонусы и промокоды в корзине, рассрочки и карта пунктов выдачи.

Стабилизация пройдена до сдачи, а не после. 209 итераций приемки, переезд на VDS с MySQL 8 и PHP 8.2. Найденное на приемке — доставка за 105 тысяч, невозможность оформить заказ с телефона, расхождение бонусов между сайтом и приложением — в живом магазине пришлось бы ловить уже после релиза.

Похожий проект на старте?

Если статья оказалась полезной и захотелось обсудить свой проект — пишите. Мы, в MWI, делаем сложные продукты: EdTech, маркетплейсы, B2B-кабинеты, интернет-магазины «на максималках» — и всегда рады обсудить актуальные задачи. Поделимся опытом, ответим на вопросы по архитектуре или срокам, расскажем, как решали похожие задачи у себя.
Никаких брифов и форм заполнять не нужно — просто напишите.


Дизайн-макеты

07

Термины и сноски

* imshop — сервис, который собирает мобильное приложение магазина на основе существующего сайта и его каталога.

* Торговое предложение (SKU) — конкретный вариант товара с собственными характеристиками и остатком. Одна блузка в каталоге — это один товар и, например, двенадцать торговых предложений: четыре размера в трех цветах.

* Многосайтовость — режим, при котором несколько сайтов работают на одном экземпляре системы и одной базе данных, но с разными адресами и оформлением.

* Регресс — ситуация, когда исправление или оптимизация в одном месте ломает то, что раньше работало в другом.

* Брейкпоинт (breakpoint) — контрольная ширина экрана, при которой интерфейс сайта меняет вид под устройство пользователя.

Да, evibi.ru —
классный сайт
Мы подошли к его проектированию и
разработке особенно тщательно.
Давайте расскажу и пришлю вам
расчет на подобный проект?
Расскажи
img