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. Публичную часть после переезда временно закрыли под администратором, чтобы проверить сервисы и почту до прихода покупателей.
Миграция закончилась не тогда, когда сайт был собран
На перенос ушло меньше времени, чем на доведение результата до стабильного состояния.
Из 214 часов бэкенда 141 час занял сам перенос с интеграциями, а 83 — отладка по приемке. Это в два с лишним раза больше, чем вся верстка проекта. Отладка шла с 3,5 месяца: одна задача, 209 комментариев. Три узла оказались самыми трудоемкими.
Производительность. Каталог и карточки открывались долго, подгрузка «Показать еще» подвисала — причем даже на товарах без изображений и в админке. Оптимизировали запросы, убрали лишний пересчет корзины. И сразу получили регресс*: в приложении сломалось отображение скидки на доставку, потому что оно опиралось ровно на этот пересчет. Дальше пришлось искать баланс между скоростью сайта и корректностью приложения.
Доставка за 105 тысяч рублей. Заказ, оформленный из приложения, показал стоимость доставки СДЭК около 105 000 ₽. Разбор привел к габаритам: 1С отдает их в метрах, Битрикс считает в миллиметрах, и без конвертации коробка с блузкой превращается в груз размером с комнату. На сайте конвертация уже работала — но заказ из приложения шел своим маршрутом и эту логику не получал. Заодно выяснилось, что правило бесплатной доставки от 25 000 ₽ в приложении вообще не срабатывало.
Рассинхрон сайта, MAXMA и приложения. Бонусы, промокоды, ФИО, стоимость доставки — везде, где данные ходили между тремя системами, они расходились. Это не чинится одним фиксом. Понадобился набор обработчиков и жестко зафиксированные приоритеты источников для каждого типа данных.
Дальше пошли уже те проблемы, которые невозможно поймать по одному счастливому сценарию. С телефона нельзя было оформить заказ: скрипт не находил блок согласия на обработку персональных данных. В личном кабинете счетчик показывал семь заказов вместо одного, а «Повторить заказ» приводил к пустой корзине. При регистрации создавались дубли пользователей с одинаковыми телефоном или почтой. Анонимное избранное терялось при авторизации вместо слияния с аккаунтом. Бонусы списывались сверх доступного баланса. Карты кликов в Метрике не работали из-за заголовка X-Frame-Options — добавили исключения в nginx.
Все это вскрывалось на постраничном приемочном тестировании: шесть отдельных задач по главной, каталогу, карточке, корзине, оформлению заказа и личному кабинету, каждая — на трех брейкпоинтах* — десктоп, 768 и 375 px. К каждому дефекту прикладывали скринкаст и консоль с JS-ошибками, поэтому разработчик сразу видел, как именно его воспроизвести.