Бесплатный экспресс-аудит сайта Безопасность, SEO, AI-поиск и 152-ФЗ — отчёт с баллами за минуту Проверить сайт
Обсудить проект

Оптовый магазин автохимии, где у каждого покупателя своя цена

Оценить кейс

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

Коротко о проекте

КлиентДистрибьютор автохимии, масел и автозапчастей, Ярославль
ОтрасльОптовая торговля, автотовары
ЗадачаСайт как рабочее место закупщика: персональные цены, кабинет, обмен с 1С
Решение1С-Битрикс: Управление сайтом, тема Aspro Premier, двусторонний обмен с 1С
Масштаб2 991 активный товар, 376 оптовых клиентов, 1 489 заказов за 12 месяцев
СтекPHP 8.2, MySQL, Apache, 1С-Битрикс, Aspro Premier
ФорматПостоянное сопровождение и развитие

Главная страница оптового магазина автохимии

Что здесь не как в рознице

Цена собирается на лету из справочника наценок: 23 388 записей, у каждого клиента свои условия по каждой группе товаров. Нельзя просто повесить скидку на товар — её нужно встроить в цепочку расчёта так, чтобы она не обнулила индивидуальные условия и не посчиталась дважды. Это определяет и сложность, и стоимость каждой задачи на проекте.

Каталог: витрина и рабочий инструмент одновременно

Закупщик не ходит по разделам — он знает, что ему нужно. Каталог настроен на быстрый подбор: табличный режим со списком артикулов, сортировка, фильтры по цене, бренду, объёму и назначению, выбор сразу нескольких позиций, остатки и маркировка «Честный знак» прямо в строке.

Раздел каталога в табличном режиме: артикул, наличие, цена клиента и кнопка заказа в одной строке

Поиск по артикулу — так, как его реально вводят

Оптовик ищет по артикулу, чаще по его фрагменту и почти всегда с дефисами. Штатный поиск Битрикса этого не умеет: он работает со словами, а артикул для него — одно неделимое слово.

Переделали обе половины задачи. Перед индексацией каталог раскладывает артикул на формы, чтобы товар находился по фрагменту. Дефис исключён из состава слова, а сам запрос нормализуется на входе: объект запроса в Битриксе доступен только для чтения, поэтому нормализацию встроили штатным механизмом фильтров, а не правкой «в лоб». Запрос из четырёх символов находит всю линейку.

Результаты поиска по фрагменту артикула: найдена вся линейка очистителей форсунок

Карточка товара: данные, которые пришли сами

Описания и характеристики собирали из прайсов поставщиков: сопоставление по паре «артикул плюс бренд», заполнение только пустых полей, автоматическая подготовка фотографий под ограничения по размеру. Разрешительная документация и коды классификации приходят из обмена с 1С и выводятся в карточке. Блок «С этим товаром покупают» собран по реальной истории заказов, а не рекомендательным сервисом — тот на проекте давно не работает.

Карточка товара: характеристики из 1С, описание из прайса поставщика, блок сопутствующих товаров

Телефон — это половина заказов

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

Раздел каталога на телефоне: плитка товаров, фильтры и нижняя панель навигации

Личный кабинет закрывает звонки менеджеру

В опте кабинет — не витрина, а инструмент. Сюда вынесли то, за чем закупщик обычно звонит:

  • Забытые товары — позиции, которые клиент брал регулярно и перестал: готовый список для дозаказа.
  • Недогруз — что было в заказе, но не отгружено; возвращается в корзину одним кликом.
  • Дебиторка — текущий долг и просрочка из 1С в шапке кабинета, просрочка дублируется в письме менеджеру.
  • Дата доставки — плановая дата из 1С в списке заказов, в карточке и на главной кабинета.
  • Номера счетов — накапливаются из обмена, технические номера промежуточного этапа скрыты.
  • Мои промокоды — выданные купоны за выполнение плана и накопленная выгода.

Купоны за выполнение плана

Самая крупная механика проекта. Клиент выполняет месячный план закупок и получает персональный купон на следующий месяц: от одного до трёх процентов от оборота в зависимости от категории.

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

Скорость: три причины одного симптома

Жалоба звучала как «сайт тормозит, корзина особенно» — переход в корзину занимал около двадцати секунд. Замеры показали три независимые причины:

Права на кэшслужебные скрипты запускали от root, веб-сервер не мог перезаписать созданные ими файлы — кэш перестал работать на весь сайт
Расчёт цены клиентаперебор справочника на 23 388 записей без подходящего индекса: 0,06–0,09 с на товар стало 0,0019 с
Чужой упавший серверкомпонент темы ходил к внешнему сервису без таймаута и ждал ответа до 20 секунд на каждой сессии

Надёжность: что приходится держать в голове

  • Обмен с 1С — это не только данные, но и структура. Удаление одной группы номенклатуры в учётной системе деактивировало на сайте 399 товаров. Восстановили из резервной копии, вернули обогащение карточек и переписали 11 216 строк в заказах и корзинах, где остались ссылки на старые идентификаторы. Суммы заказов не изменились — проверяли до и после.
  • Уязвимости закрываются в тот же день. В октябре 2026 вышли исправления двух уязвимостей PHP, позволяющих выполнить произвольный код; конфигурация сервера относилась к самой уязвимой категории. Сначала обезвредили механизм директивой на уровне сайта, затем обновили PHP с 8.2.30 до 8.2.35. Простоя не было.
  • Жалобы пользователей нужно переводить в механику. «Корзина слетает» означало, что сессия жила 24 минуты, а корзина неавторизованного покупателя не сохранялась в куках. Подняли сессию до четырёх часов и включили запоминание гостевой корзины.

Как устроена работа

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

Все правки идут в локальные шаблоны и собственный код, ядро не трогается. Перед каждым изменением на боевом сервере делается резервная копия файла, в комментарии указывается дата и способ отката.

Кейс был полезен?

Оцените первым — так другие поймут, стоит ли читать