Электронная коммерция
Август 2026
Магазин на OpenCart, восемьсот тысяч карточек, товар приходит и от поставщика, и из складской системы владельца. Остатки с ценами расходились с реальностью - карточка обещала наличие, а товара не было, цена на витрине стояла поставщика, хотя продавать владелец хотел по своей колонке в складской системе.
Артикулы в двух системах написаны по-разному. В складской они с приставкой, на сайте без неё, и сверка между системами держалась на честном слове.
Самое неприятное вскрылось не сразу - две разные выгрузки писали в одну и ту же колонку базы по своему расписанию, и каждая переписывала чужой результат. Пока у колонки два хозяина, любая правка живёт до следующего часа.
Первым делом развёл источники по ролям и оставил у каждой колонки ровно одного писателя. Порядок цены такой - сначала колонка владельца из складской системы, нет её - цена поставщика, нет и её - остаётся прежняя.
Цены пришлось тянуть другим методом. Штатный отчёт по остаткам отдаёт только первый тип цены, параметр выбора он принимает без ошибки и молча игнорирует. Все типы цен отдаёт только выгрузка ассортимента, а она тяжёлая - 13,5 МБ на страницу в тысячу позиций, весь каталог это 98 страниц и около пятнадцати минут. Поэтому режимы разведены. Остатки идут быстрым прогоном раз в час, цены отдельным ночным до сборки выгрузок, третий режим только переносит готовое на витрину, четвёртый крутится вхолостую и витрину не трогает.
Артикулы переименовал все восемьсот тысяч за 17,6 секунды. Чтобы ничего не останавливать, промежуточная таблица хранит артикул в двух написаниях - до переименования совпадал короткий ключ, после длинный. Сразу после переименования запрос на расхождения с источниками дал ноль.
Обнуление остатка сделал в NULL. Ноль погасил бы запасной источник, и товар, которого нет в складской системе, но есть у поставщика, снова уехал бы в предзаказ.
Перед включением посчитал разброс цен и нашёл в колонке владельца битые значения - 3 714 артикулов сидят на четырёх одинаковых ценах, жало для паяльника за 110 тысяч при закупке 74 рубля. Ни один из них не в наличии, поэтому фильтр ставить не стал, цены отдал как просили, а про битые написал отдельным сообщением. Заодно проверил обратное - рост в десять раз у товаров в наличии оказался нормальной наценкой на мелочёвке, и порог «дороже поставщика в десять раз» выкинул бы именно их.
Расписание на время правки гасил через панель. Пятнадцатиминутная выгрузка цен иначе попала бы под очистку таблицы соседним заданием.

Цена обновилась у 799 714 карточек из 800 371, из них 800 135 пришли из складской системы, остальные от поставщика. Средняя цена карточки выросла с 1 933 до 2 211 рублей, карточек с нулевой ценой ноль. Обновление всего каталога одним запросом заняло 61,8 секунды, товарные выгрузки пересобрались следом за 19,8 секунды. Откат подготовлен заранее - отдельная таблица с прежними ценами и остатками на все карточки и копии прежних скриптов рядом.