Как мы искали узкие места в каталоге на Strapi, наладили синхронизацию характеристик с 1С и проверяли, откуда в категориях берутся чужие бренды
Заказчик это один из крупнейших поставщиков сантехники в России. Он работает в 50 регионах и только с организациями: от небольших магазинов в сельской местности до торговых центров и коммунальных хозяйств в городах-миллионниках. Ассортимент и остатки ведутся централизованно в 1С, а клиенты работают с онлайн-каталогом.
Каталог сделан на Strapi и PostgreSQL, фронтенд на Vue. Проект находился на поддержке, команда была небольшой: фронтенд- и бэкенд-разработчик, тестировщик, аналитик и менеджер проекта. В январе 2026 года заказчику понадобилось пополнить команду, и к проекту подключился бэкенд-разработчик Фортех. Основная работа шла около двух месяцев, затем задачи по поддержке передали другому разработчику нашей команды.
Каталог стал работать медленно, а данные из 1С приходили с ошибками. Нужно было:
Каталог глубокий: категории вложены друг в друга на четыре уровня, и запрос товаров тянет все уровни сразу.
Часть кода досталась от прошлых команд. Прежде чем что-то менять, нужно было понять, как устроен существующий обмен.
Данные приходят из 1С. Когда в каталоге что-то показывается неправильно, сначала надо понять, где ошибка: в бэкенде или в самих данных учётной системы.
Скорость каталога. Разработчик начал с исследования медленных запросов. Отдельно разобрал запрос товаров с джойнами по четырём уровням категорий и запрос получения категории. Для поисковых сборок характеристик сделал Materialized View: характеристики считаются заранее, а не при каждом запросе. Тяжёлые вычисления вынес в кэш. Сервисы, которые тормозили выдачу, отрефакторил.
Категории и фильтры. Оптимизировал выдачу категорий и фильтров, исправил баги отображения категорий и фильтрации товаров, взялся за ранжирование ценовых фильтров.
Обмен с 1С. Нашёл и исправил дубли сущностей, которые появлялись при обмене. Разобрал, как при синхронизации очищаются и привязываются характеристики товаров, и написал маппер значений характеристик. Обработку характеристик типизировал и оптимизировал, а наработки по очистке и синхронизации встроил в основной механизм обмена. После этого обмен прошёл тестирование.
Чужие бренды в категориях. Разработчик проверил, что именно приходит из 1С в бэкенд, чтобы понять, на чьей стороне ошибка: в коде или в заполнении данных в учётной системе.
Медленные места каталога разобраны: характеристики для поиска считаются заранее, тяжёлые вычисления кэшируются, выдача категорий и фильтров оптимизирована.
Обмен с 1С стал чище: дубли сущностей убраны, характеристики привязываются к товарам через единый маппер, а логика очистки и синхронизации живёт в основном механизме обмена, а не в разрозненных доработках.
Проект остался на поддержке у Фортех, задачи по нему перешли к другому разработчику нашей команды.
Как ускорить каталог с глубоким деревом категорий на PostgreSQL?
Найти самые медленные запросы, вынести тяжёлые сборки характеристик в Materialized View и закэшировать вычисления, которые повторяются от запроса к запросу. В этом проекте запрос товаров тянул четыре уровня категорий, и именно его пришлось разбирать первым.
Почему при обмене с 1С появляются дубли и неверные характеристики?
Чаще всего обмен создаёт сущность заново вместо того, чтобы найти существующую, и не очищает старые связи характеристик. Помогают единый маппер значений и очистка связей внутри основного механизма обмена.
Можно ли подключить разработчика к проекту на поддержке ненадолго?
Да. Здесь бэкенд-разработчик Фортех работал около двух месяцев, а затем передал задачи другому разработчику нашей команды.

Как мы за пять месяцев собрали ядро магазина на NestJS: гибкие цены для трёх типов клиентов, обмен с 1С без дублей и поиск с русской морфологией

Как мы связали CRM с корпоративными системами через TypeScript-скрипты, которые аналитики собирают в бизнес-процессы без программирования

Как мы за три месяца привели в порядок бэкенд на NestJS и добавили версионирование API и программу вознаграждений через СБП

Как бэкенд-разработчик Фортех 1 год и 3 месяца работал в одной из двадцати команд автодилера: интеграции, общий NPM-пакет, новая авторизация и наблюдаемость