Как мы за пять месяцев собрали ядро магазина на NestJS: гибкие цены для трёх типов клиентов, обмен с 1С без дублей и поиск с русской морфологией
Заказчик торгует в розницу и оптом и работает с постоянными клиентами на особых ценовых условиях. Компания решила сделать новую версию интернет-магазина: современную, безопасную и готовую к росту, с гибкой моделью цен и глубокой интеграцией с учётной системой 1С.
В магазине есть всё, что нужно покупателю: главная с подборками новинок, популярных товаров и категорий, каталог и карточка товара, поиск с подсказками, корзина, оформление заказа, избранное, подписка на поступление товара и личный кабинет с историей заказов. Для команды заказчика сделана админ-панель: контент и роли пользователей управляются там.
Проект вёл проектный офис Фортех. Команда была компактной: бэкенд-разработчик, фронтенд-разработчик и тестировщик. Бэкенд-разработчик сначала оценивал задачи нового проекта, а потом сам их и выполнил. Работа шла пять месяцев и закончилась передачей готового магазина заказчику.
У магазина три типа покупателей: обычный, постоянный и крупный оптовый. Для каждого свои цены, и система должна считать их правильно в корзине и в заказе.
Учётная система остаётся главной. Остатки, заказы и клиенты живут в 1С, поэтому обмен должен быть надёжным: без дублей при повторной отправке и с контролем резерва на складе.
Вход по SMS открывает дорогу перебору кодов, значит, нужна защита от брутфорса и ограничение частоты запросов.
Один клиент может заказывать с нескольких учётных записей, и история заказов не должна распадаться между ними.
Ядро магазина. Разработчик Фортех спроектировал структуру базы и реализовал ценообразование с розничными, оптовыми и индивидуальными ценами. Корзина хранится на сервере и при каждом изменении проверяет, есть ли товар на складе. Заказ проходит весь жизненный цикл: создание, резервирование, передача в 1С и обновление статусов.
Интеграция с 1С. Обмен товарами, остатками, заказами и клиентами идёт через защищённые API-эндпоинты. Операции идемпотентны: повторная отправка тех же данных не создаёт дублей. Ошибки синхронизации обрабатываются и записываются в лог, а резерв и актуальность остатков контролируются на стороне магазина.
Пользователи и роли. Регистрация и вход работают по SMS, с ограничением частоты запросов и защитой от перебора кодов. Роли «обычный», «постоянный» и «супер оптовый» определяют цены и доступные условия. Механизм связанных аккаунтов объединяет историю заказов, если клиент заказывает с нескольких учётных записей.
Поиск. Каталог проиндексирован в Manticore Search: названия, описания, категории, артикулы и синонимы. Поиск понимает русскую морфологию, исправляет опечатки и подсказывает варианты, а индекс синхронизируется с каталогом. Релевантность и скорость отдельно оптимизированы под большой объём товаров.
Надёжность. API защищены, частые данные кэшируются в Redis, настроены резервное копирование и мониторинг, критичные бизнес-операции оптимизированы. Фронтенд на Next.js с серверным рендерингом, чтобы страницы каталога индексировались поисковиками.
Заказчик получил новый интернет-магазин, который одинаково работает для розничного покупателя, постоянного клиента и оптовика: каждый видит свои цены, а корзина проверяет остатки на складе.
Магазин и 1С обмениваются товарами, остатками, заказами и клиентами в обе стороны, без дублей при повторной отправке и с логом каждой синхронизации.
Покупатели входят по SMS и быстро находят товары: поиск понимает словоформы и опечатки. Клиенты с несколькими аккаунтами видят общую историю заказов.
Все задачи проекта выполнены за пять месяцев, магазин передан заказчику.
Как сделать разные цены для розницы, постоянных клиентов и опта?
Заложить роли покупателей в модель данных и считать цену на сервере, в корзине и в заказе, а не на витрине. Тогда клиент с особыми условиями видит свою цену на всём пути до оформления.
Как избежать дублей при обмене интернет-магазина с 1С?
Делать операции обмена идемпотентными: повторная отправка тех же данных не создаёт новую запись. Плюс логировать каждую синхронизацию и контролировать резерв остатков на стороне магазина.
Какой поиск нужен каталогу на русском языке?
Поисковый движок с поддержкой морфологии и нечёткого поиска, например Manticore Search. Он находит товар по разным словоформам и опечаткам и подсказывает варианты при вводе.
Сколько длился проект?
Пять месяцев, от оценки задач до передачи готового магазина заказчику.

Как мы искали узкие места в каталоге на Strapi, наладили синхронизацию характеристик с 1С и проверяли, откуда в категориях берутся чужие бренды

Платформа розничной и оптовой продажи косметических средств

Веб-сервис для персонализации промо-акций, анализа поведения пользователей и формирования индивидуальных предложений

Как фронтенд-разработчик Фортех сделал умное автозаполнение по справочнику и девять конфигурируемых форм для компоновки буровой колонны