- Опубликовано: 14 сен 2026
- 43
Цены и остатки обновляются сами: как устроено и что ломается
Часть 4 из 5 · Серия «Каталог без ручного труда»
Автоматическое обновление — первое, что просят, когда каталог перевалил за тысячу позиций. И правильно просят: обновлять цены руками на таком объёме физически невозможно.
Но у автоматики есть свойство, о котором думают в последнюю очередь. Ручная работа ошибается по одной позиции. Автоматика ошибается сразу во всём каталоге.
Классический сценарий: поставщик прислал файл, который выгрузился наполовину. Ночью загрузка отработала штатно, проставила остатки по файлу, и к утру у вас восемьсот товаров «нет в наличии». Реклама крутится, покупатели заходят, заказов нет. Обнаруживается это в лучшем случае к обеду.
Поэтому разговор про автообновление — это на девяносто процентов разговор про проверки, а не про расписание.
Как это устроено
Механика простая и одинаковая почти везде.
Источник. Файл от поставщика — по ссылке, на почте, на FTP — или выгрузка из учётной системы. Задача одна: система должна забирать его сама, без человека.
Расписание. Загрузка запускается по времени: раз в сутки ночью, раз в несколько часов, у активных — чаще. Цены и остатки обычно обновляют чаще, чем сам каталог: новые товары появляются редко, а остатки меняются постоянно.
Обработка. Файл разбирается, товары опознаются по артикулу, значения пересчитываются по правилам наценки, изменения применяются.
Отчёт. Что обновилось, что не нашлось, что показалось подозрительным.
Первые три пункта делает любой подрядчик. Четвёртый забывают, и именно из-за него потом ищут виноватых.
Проверки, которые должны стоять на входе
Главная часть статьи. Каждая проверка родилась из чьей-то потери.
Что должно блокировать загрузку целиком
Файл не скачался или пустой. Звучит очевидно, но частая ошибка — обработать пустой файл как «все товары кончились».
Файл резко короче обычного. Вчера было 4 800 строк, сегодня 500. Это не распродажа, это сбой выгрузки. Разумный порог — если строк стало меньше процентов на тридцать, загрузка останавливается и зовёт человека.
Структура изменилась. Пропала колонка, съехали заголовки, поставщик поменял формат. Загружать «как получится» нельзя: цены попадут в колонку остатков.
Массовое обнуление. Если файл предлагает обнулить остатки более чем у трети каталога — это повод остановиться, а не выполнить.
Цены упали или выросли в разы. Сдвиг на строку или ошибка в разделителе дробной части превращает 1 500 в 15 000 или в 15. Проверка на резкое отклонение от прошлой цены ловит и то, и другое.
Что должно предупреждать, но не останавливать
Товар из файла не найден на сайте. Обычно это новая позиция — её надо завести, но останавливать из-за неё загрузку не нужно.
Товар с сайта отсутствует в файле. Скорее всего, кончился или снят. Действие — по правилу из второй части: скрыть, а не удалить.
Цена ниже закупочной. Отдельная проверка, которая сохраняет деньги. Такую позицию лучше не публиковать до разбора.
Пустые обязательные поля. Позиция без цены или без единицы измерения загружается, но помечается.
Разделение на «блокирует» и «предупреждает» — не формальность. Слишком строгие правила приводят к тому, что загрузка не проходит никогда и её отключают. Слишком мягкие — к тому, что каталог однажды обнуляется молча.
Отчёт после каждой загрузки
Короткое письмо ответственному менеджеру. Не лог на сто страниц, а пять строк:
Загрузка «Поставщик А», 26.08 в 03:10 — успешно
Обработано позиций: 4 812
Обновлено цен: 316
Обновлено остатков: 1 240
Новых товаров: 12 (требуют заведения)
Скрыто (нет в прайсе): 8
Предупреждений: 3 — открыть отчёт
Ценность такого письма не в том, что его читают каждый день. Ценность в том, что когда оно не приходит, это заметно. Загрузка, которая молча перестала запускаться три недели назад, — обычное дело, и обнаруживают её по расхождению цен с поставщиком.
Второе: отчёт даёт ответ на вопрос «когда это сломалось». Без него разбор начинается с археологии.
Наценки и правила пересчёта
Коротко, потому что подробно — во второй части. Здесь важно то, что касается именно автоматики.
Ручные цены не должны затираться. Если маркетолог поставил акционную цену, ночная загрузка обязана её сохранить. Реализуется признаком «цена задана вручную» — и это то, о чём надо попросить явно: по умолчанию так работает не везде.
Округление применяется после наценки, а не до, иначе копейки будут накапливаться и цены поедут.
Изменение правил не должно требовать программиста. Наценка по разделу — настройка, а не строка в коде. Иначе каждое изменение процента превращается в задачу с оплатой часов.
Что делать с товарами, которых не стало
Правило из второй части повторю здесь, потому что в автоматическом режиме оно работает иначе.
Когда товар пропадает из прайса однократно, это часто сбой выгрузки, а не исчезновение товара. Поэтому разумная логика — не скрывать сразу, а скрывать после нескольких загрузок подряд, в которых товара нет. Два-три раза достаточно.
Иначе получается качели: ночью товар пропал из файла и скрылся, утром вернулся и появился. Позиции в поиске такого не любят, а менеджер сходит с ума.
Как проверить, что автоматика работает
Не открывая сайт каждое утро.
Отчёт приходит. Самая простая и самая эффективная проверка. Нет письма — что-то не так.
Выборочная сверка раз в месяц. Возьмите пять товаров и сравните цену и остаток с прайсом поставщика вручную. Пятнадцать минут, и они ловят почти все тихие расхождения.
Дата последнего обновления в админке. Если у товара она недельной давности, а загрузка должна идти ежедневно, — товар выпал из обмена.
График количества товаров в наличии. Если он есть, резкие обрывы видно сразу. Если нет — хотя бы цифра «сейчас в наличии столько-то» в отчёте.
Это, кстати, ровно тот же принцип, что и в регулярных проверках сайта: дешевле проверять признак жизни, чем последствия смерти.
Техническая сторона — для разработчика
Если статью читает тот, кто будет это делать, два указателя.
Загрузку большого каталога нельзя выполнять в момент HTTP-запроса: она должна уходить в фоновую обработку с возможностью перезапуска. Как это устроено на практике — очереди в Laravel на продакшене.
Запуск по расписанию — cron и systemd-таймеры. Там же про то, как не получить две одновременно работающие загрузки, если предыдущая не успела закончиться. На каталоге это приводит к очень интересным результатам.
Частые вопросы
Как часто обновлять цены и остатки?
Остатки — так часто, как реально меняются: для ходового ассортимента раз в несколько часов, для стабильного достаточно суток. Цены обычно реже. Чаще, чем поставщик обновляет свой файл, смысла нет.
Можно ли обновлять только цены, не трогая остальное?
Да, и это частый сценарий: каталог ведут вручную, а из прайса берут только цены и остатки. Меньше рисков и проще проверки.
Поставщик присылает файл на почту. Это подойдёт?
Да, письмо можно разбирать автоматически. Но это менее надёжный канал, чем ссылка: письмо может уйти в спам, прийти с другого адреса или с другим именем вложения. Если есть выбор, лучше ссылка.
Что делать, если у нас несколько поставщиков с разным расписанием?
Каждый источник — своя загрузка со своим расписанием и своим отчётом. Общее у них только правило приоритета: чья цена и чей остаток побеждают, если товар есть у двоих.
Автоматика заменит менеджера каталога?
Нет, изменит его работу. Вместо ручного проставления цен он разбирает предупреждения, заводит новые позиции и следит за качеством данных. Это меньше рутины, но не ноль работы — и человек, отвечающий за каталог, нужен по-прежнему.
Что дальше
Каталог структурирован, цены и остатки обновляются сами, отчёты приходят. Осталась последняя часть — та, ради которой всё и делалось.
Потому что можно иметь идеальный каталог, в котором покупатель всё равно не найдёт нужный товар: фильтров либо нет, либо их сорок; поиск не понимает артикул; а по популярному запросу выпадает пустая страница.
В следующей части — про фильтры и поиск: сколько фильтров нужно, что делать с пустыми результатами и по каким признакам понятно, что встроенного поиска уже не хватает.
Настроить регулярную загрузку с проверками и отчётами так, чтобы битый файл не обнулил каталог, — расскажите про своих поставщиков, разберёмся.
- 1 Обмен 1С с сайтом: что на самом деле синхронизируется
- 2 Прайс поставщика на сайте: как загрузить и ничего не потерять
- 3 Товары, варианты и характеристики: почему каталог потом не фильтруется
- 4 Цены и остатки обновляются сами: как устроено и что ломается вы здесь
- 5 Покупатель не находит товар: фильтры и поиск по каталогу
Была статья полезной: