Обмен остатками настраивается в шесть шагов, и расписание среди них — предпоследний. Сначала товары в учётной системе и на витрине связывают стабильным ключом, потом определяют направление и состав выгрузки, потом задают правило резерва, и только после этого имеет смысл спорить о том, обновлять остатки раз в час или раз в пятнадцать минут. Настройки, сделанные в обратном порядке, дают самый неприятный результат: обмен идёт по расписанию, журнал зелёный, а витрина врёт.
Этот обмен ломается тише всех остальных. Интеграция с телефонией падает громко — звонки не записываются, и об этом узнают за час. Здесь же остатки расходятся по одной-две позиции в сутки, и обнаруживают это не по мониторингу, а по звонку менеджера покупателю: «извините, товара нет». К моменту, когда расхождение становится заметным, оно накопилось за несколько недель, и распутывать приходится уже не настройку, а последствия.
Ниже — порядок настройки с проверяемым результатом на каждом шаге, правило резерва, формула частоты обмена от оборота и разбор пяти поломок, которые встречаются чаще остальных. Экономику расхождений — во что обходятся двойные продажи и устаревший прайс — мы считали в отдельном разборе обмена остатками и ценами с сайтом; здесь речь о самой настройке.
Шаг ноль: чем один товар связан с другим товаром
До первой строки настроек надо ответить на один вопрос: по какому полю система понимает, что «Кресло офисное Комфорт-2, чёрное» в учёте и «Кресло Комфорт 2 (чёрн.)» на сайте — это одна и та же вещь. Ответ «по названию» означает, что обмен сломается в тот день, когда кто-нибудь поправит опечатку в карточке. Ответ «по артикулу» работает, если артикул уникален и никогда не меняется, — а это надо проверить, а не предположить.
Поле или пара полей, по которым товар в одной системе однозначно сопоставляется с товаром в другой. Хороший ключ обладает тремя свойствами: он уникален внутри каждой системы, он не меняется при редактировании карточки и он не зависит от того, как товар называется у людей. Штрихкод и внутренний код номенклатуры годятся, наименование и цена — нет.
Практичнее всего хранить соответствие не в одной из систем, а отдельной таблицей на своей стороне: код в учёте, идентификатор на витрине, идентификатор на каждом маркетплейсе, дата последней сверки. Тогда при замене витрины или добавлении нового канала продаж вы правите одну таблицу, а не выковыриваете привязки из чужой панели. Эта же таблица становится источником отчёта «что не сопоставлено» — самого полезного отчёта первой недели.
| Что сверяем до запуска обмена | Как проверить | Что считается нормой |
|---|---|---|
| Уникальность ключа в учётной системе | Запрос: сколько позиций имеют одинаковый артикул или штрихкод | Ноль дублей. Один дубль — это две карточки, которые будут перетирать остаток друг друга |
| Уникальность ключа на витрине | Выгрузка каталога в таблицу, группировка по артикулу | Ноль дублей. Чаще всего дубли рождаются при ручном заведении «срочной» позиции |
| Полнота сопоставления | Сравнение двух списков ключей: что есть слева и нет справа, и наоборот | Несопоставленных — не больше 1–2 %, и каждая позиция разобрана поимённо |
| Единицы измерения | Сверка единицы у 20 самых оборачиваемых позиций | Совпадают. Штуки против упаковок дают ошибку кратно вложению, а не на единицу |
| Права учётной записи обмена | Отдельный пользователь только на чтение остатков и запись на витрину | Обмен не ходит под учёткой живого сотрудника, которого однажды уволят |
| Тестовая позиция | Заведён товар с заведомым остатком, по которому ничего не продаётся | Есть. По нему потом проверяется, что обмен вообще доехал |
Связка по названию держится ровно до первой правки карточки: контент-менеджер добавил слово «новинка», и позиция перестала находиться. Остаток по ней замирает на последнем значении и живёт своей жизнью месяцами — обмен при этом не выдаёт ни одной ошибки, потому что с его точки зрения ничего не сломалось. Если исторически связка сделана по наименованию, переводить её на код надо до всего остального, иначе все дальнейшие настройки будут стоять на песке.
Карта связей. В центре прямоугольник «Таблица соответствия» с колонками: код в учёте, идентификатор витрины, идентификатор маркетплейса А, идентификатор маркетплейса Б, дата сверки. Слева узел «Учётная система: номенклатура», справа три узла — «Сайт магазина», «Маркетплейс А», «Маркетплейс Б». Стрелки от центра к каждому узлу подписаны «ключ: штрихкод или код номенклатуры». Внизу отдельный блок «Отчёт: не сопоставлено — не более 1–2 %». Чертёжный стиль, подписи по-русски.
Порядок настройки: шесть шагов и результат каждого
Шаги идут именно в этом порядке. Каждый заканчивается результатом, который видно глазами: не «настроено», а «на витрине по тестовой позиции стоит 7, и в учёте стоит 7».
- 11. Направление обмена и хозяин остатка
Решаем, кто источник истины. В 99 случаях из 100 остаток принадлежит учётной системе, а витрина только отображает его. Значит, обмен односторонний: учёт → витрина. Обратное направление нужно только для заказов и резервов. Получилось, если у вас на бумаге записана фраза вида «остаток меняется только в 1С, на витрине поле остатка недоступно для ручной правки», и это правило подтверждено настройками прав, а не устной договорённостью.
- 22. Состав выгрузки
Определяем, что именно передаётся: ключ, доступный остаток, склад, единица измерения, признак «снят с продажи». Цены, описания и фотографии в этот обмен не кладут — у них другой хозяин, другая частота и другая цена ошибки. Получилось, если состав описан списком полей, и по каждому полю сказано, что делать, когда оно пустое.
- 33. Правило резерва
Задаём, из чего вычитается доступный остаток и когда резерв снимается. Это самый содержательный шаг, ему посвящён следующий раздел. Получилось, если после оформления тестового заказа на сайте остаток на витрине уменьшился на единицу без участия человека, а после отмены заказа вернулся обратно.
- 44. Первый полный прогон и сверка
Запускаем обмен вручную по всему каталогу и сверяем результат выгрузкой в таблицу: остаток на витрине против доступного остатка в учёте, построчно. Получилось, если расхождений нет либо каждое расхождение объяснено поимённо — «эта позиция снята с продажи», «эта не сопоставлена». Молчаливое «ну, почти всё сошлось» на этом шаге недопустимо: дальше расхождения будут только накапливаться.
- 55. Расписание и защита от наложения
Ставим интервал, посчитанный по формуле из раздела о частоте, и обязательно — блокировку одновременного запуска: если предыдущий обмен ещё идёт, следующий не стартует, а ждёт. Без этого при разрастании каталога два процесса начинают писать одни и те же позиции и получается чехарда. Получилось, если в журнале видно время старта и финиша каждого прогона и ни один прогон не пересекается со следующим.
- 66. Журнал, ошибки и адресат
Каждый прогон пишет в журнал: сколько позиций обработано, сколько записано, сколько отвергнуто и почему. Ошибка обмена уходит не в лог-файл, а живому человеку с именем и фамилией. Получилось, если вы намеренно сломали обмен — сменили пароль учётной записи — и в течение оговорённого времени получили уведомление, а не узнали об этом на следующий день. Как проверять живость связки дальше, разобрано в инструкции про девять тестов интеграции за час.
Схема из шести пронумерованных блоков, соединённых стрелками слева направо в два ряда: 1 «Направление и хозяин остатка», 2 «Состав выгрузки», 3 «Правило резерва», 4 «Первый полный прогон и сверка», 5 «Расписание и защита от наложения», 6 «Журнал, ошибки и адресат». Под каждым блоком мелкой строкой — проверяемый результат: «поле остатка на витрине закрыто на правку», «список полей и поведение при пустом значении», «тестовый заказ уменьшил остаток», «расхождений нет либо каждое объяснено», «прогоны не пересекаются», «уведомление пришло человеку». Блок 4 выделен рамкой с пометкой «единственная полная сверка». Чертёжный стиль, подписи по-русски.
Первая полная сверка — единственный момент, когда вы видите весь каталог сразу и можете сравнить его построчно. Дальше вы будете смотреть только на изменения, и позиция, которая разошлась на старте, останется разошедшейся навсегда: разностный обмен не трогает то, что не менялось. Поэтому сверка после первого прогона делается целиком и с разбором каждой строки расхождения, сколько бы времени это ни заняло.
Резерв: остаток, который нельзя показывать
На складе лежит 7 коробок. Три из них уже принадлежат покупателям, которые оформили заказ час назад, но ещё не забрали товар. Если на витрину уходит число 7, магазин продолжит продавать то, что уже продано, — и разберётся с этим только на сборке. Поэтому в обмен всегда уходит не физический остаток, а доступный: физический минус резерв.
Физическое количество на складе минус количество, зарезервированное под уже принятые, но ещё не отгруженные заказы. Это единственное число, которое имеет смысл показывать покупателю. У доступного остатка есть неприятное свойство: он меняется чаще физического — при каждом заказе и при каждой отмене, а не только при приёмке и отгрузке.
Резерв ставится легко, а вот правило его снятия придумывают редко — и именно оно ломает магазины. Классический случай: резерв снимается только при отгрузке. Покупатель оформил заказ, не оплатил и исчез. Заказ висит, товар зарезервирован, витрина показывает ноль, а на складе лежит полная коробка. Через месяц таких «висяков» набирается на треть ходового ассортимента.
- 1Резерв ставится в момент, когда заказ становится обязательством: обычно это подтверждение заказа, а не клик по кнопке «купить». Корзина резерв не создаёт — иначе брошенные корзины съедят склад за сутки.
- 2Резерв снимается при отгрузке — тогда он превращается в расход, и физический остаток уменьшается одновременно с исчезновением резерва. Доступный остаток при этом не меняется, и это правильно: покупатель его уже забрал в момент заказа.
- 3Резерв снимается при отмене заказа — вручную или автоматически. Это единственный путь, по которому товар возвращается на витрину, поэтому он должен работать одинаково для отмены менеджером, отмены покупателем и отказа при доставке.
- 4Резерв снимается по таймауту неоплаты. Для предоплатных заказов — обычно 30–60 минут, для заказов с оплатой при получении таймаут задаётся по сроку хранения на пункте выдачи. Значение выбирается один раз и записывается, а не остаётся в голове у оператора.
- 5Резерв принудительно снимается по возрасту. Заказ старше согласованного срока — например, 14 дней — уходит в отдельный список на разбор, а его резерв освобождается. Это защита от того, что первые четыре правила где-то не сработали: она нужна не вместо них, а поверх.
Проверяется правило одним прогоном: оформляете тестовый заказ, смотрите на витрину — остаток уменьшился; отменяете заказ, смотрите ещё раз — остаток вернулся; оформляете заказ и не оплачиваете его, ждёте таймаут — остаток вернулся сам. Если хотя бы один из трёх сценариев не отработал, дальше настраивать бессмысленно, потому что расхождение будет копиться независимо от частоты обмена.
Как посчитать нужную частоту обмена
Совет «обновляйте раз в час» бесполезен одинаково для магазина с тридцатью заказами и для магазина с тремя сотнями: первому он навязывает лишнюю нагрузку, второму не помогает вовсе. Частота считается от того, сколько единиц самой ходовой позиции успевает уйти между двумя обменами. Пока это меньше одной штуки, витрина остаётся честной; как только больше — по хвосту остатков гарантированно пойдут заказы на то, чего уже нет.
Формула читается словами так: интервал обмена не должен превышать времени, за которое продаётся одна единица самого ходового товара в пиковый час. Считается в четыре действия: строк в заказах за сутки, доля самой ходовой позиции в этих строках, пересчёт в штуки в час с поправкой на пик, обратная величина. Коэффициент пика берётся из своей же статистики — это отношение продаж самого загруженного часа к среднему часу; для розничной онлайн-торговли он обычно лежит в диапазоне 2–3, ниже взят 2,5.
Оба ответа округлены вниз, чтобы остался запас: 2,8 часа превращаются в расписание «раз в 2 часа», 17 минут — в «раз в 15 минут». Считать надо по самой ходовой позиции, а не по средней: средняя позиция интернет-магазина продаётся раз в несколько дней, и по ней подойдёт обмен раз в сутки. Именно верхние 3–5 % ассортимента создают все проблемы и всю выручку одновременно.
Диаграмма из двух вертикальных блоков. Левый блок «Магазин А»: 30 заказов в сутки, 42 строки, ходовая позиция 3,4 шт/сутки, 0,35 шт в пиковый час, вывод крупно — «раз в 2 часа». Правый блок «Магазин Б»: 300 заказов в сутки, 420 строк, ходовая позиция 33,6 шт/сутки, 3,5 шт в пиковый час, вывод крупно — «раз в 15 минут». Между блоками вертикальная подпись «оборот ×10 — частота ×8». Внизу общая строка формулы: интервал ≤ 1 ÷ (штук в пиковый час). Оси не нужны, единицы подписаны у каждого числа.
Теперь во что обходится ошибка в частоте. Возьмём магазин Б — 300 заказов в сутки, 9 000 в месяц — и посмотрим на месяц работы с обменом раз в 4 часа вместо нужных 15 минут. Доля заказов, отменённых с формулировкой «товара нет в наличии», в такой конфигурации держится около 1,2 %, средний чек — 3 200 ₽, валовая маржа — 28 %, то есть 896 ₽ с заказа. Разбор одной отмены забирает у оператора поддержки около 12 минут: связаться, предложить замену, оформить возврат средств.
Оставшиеся 30 % отмен частотой не лечатся: это пересорт, бой, недостача и заказы, оформленные ровно в момент между двумя обменами. Их снимают инвентаризацией и порядком на складе, а не расписанием — здесь помогает автоматизация склада и адресное хранение, о котором мы писали отдельно. Компания, которая обещает «полностью убрать отмены за счёт синхронизации», продаёт не интеграцию, а надежду.
Несколько складов и несколько каналов: один физический остаток
Пока склад один и канал один, обмен арифметически прост. Стоит появиться второму каналу — сайту и маркетплейсу одновременно — и возникает вопрос, которого не было: обе площадки видят одну и ту же коробку и обе готовы её продать. Здесь есть три рабочих стратегии, и выбирается она бизнесом, а не программистом.
| Стратегия | Как считается остаток канала | Когда подходит | Чем платите |
|---|---|---|---|
| Общий пул | Каждый канал видит весь доступный остаток целиком | Оборачиваемость низкая, интервал обмена мал относительно скорости продаж | Двойные продажи по ходовым позициям в пиковые часы |
| Жёсткие квоты | Остаток делится между каналами фиксированными долями: например, 60 % на сайт и 40 % на маркетплейс | Каналы сильно разные по скорости и по цене ошибки | Замороженный товар: в одном канале кончилось, в другом лежит |
| Пул с защитным вычетом | Каждый канал видит доступный остаток минус буфер по ходовым позициям | Большинство случаев с двумя и более каналами | Недопродажи в размере буфера, обычно 1–3 единицы по верхним позициям |
| Раздельные склады | Каждый канал привязан к своему физическому складу или зоне | Есть фулфилмент маркетплейса или отдельная зона отгрузки | Ручные перемещения между зонами и вторая точка учёта |
Практическое правило: буфер ставится не в процентах, а в штуках и только на верхние позиции. Процент от остатка даёт бессмыслицу на обоих концах — от 3 % от двух штук остаётся ноль, а 3 % от тысячи замораживают тридцать единиц ходового товара. Размер буфера удобно приравнять к продажам позиции за один интервал обмена: если по формуле выше за 15 минут уходит 0,9 штуки, буфер в 1 штуку закрывает почти все столкновения.
Отдельная история — маркетплейсы. У них свои ограничения на частоту обращений и свои задержки применения: остаток, отправленный по API, появляется в карточке не мгновенно. Это не повод отказываться от частого обмена, это повод закладывать задержку площадки в расчёт интервала и не удивляться расхождению в несколько минут. Что именно можно и нельзя передавать через их интерфейсы, мы разбирали в материале про возможности и лимиты API маркетплейсов.
Схема сверху вниз. Верхний блок «Физический остаток на складе: 7 шт». Ниже блок «минус резерв под принятые заказы: 3 шт» и результат «Доступный остаток: 4 шт». От него две стрелки вниз к блокам «Сайт» и «Маркетплейс», между ними встроен узкий блок «защитный буфер: 1 шт по ходовым позициям». В каналах показано число 3. Справа сноска: «буфер ≈ продажи позиции за один интервал обмена». Чертёжный стиль, подписи по-русски.
Пять поломок, которые встречаются чаще остальных
Все пять объединяет одно свойство: обмен при них продолжает отчитываться об успехе. Поэтому каждая ловится не мониторингом связки, а сверкой содержимого — тем самым отчётом «витрина против учёта», который стоит один раз настроить и потом читать раз в сутки.
- 1Позицию удалили в учёте
Товар вывели из ассортимента, карточка в учётной системе помечена на удаление. Разностный обмен просто перестаёт её видеть — и на витрине остаётся последний известный остаток, по которому продолжают заказывать. Правильное поведение: удаление или пометка на удаление передаётся как отдельное событие «остаток ноль, снять с продажи», а не как молчание. Проверяется намеренным снятием тестовой позиции.
- 2Появился дубль карточки
Кто-то завёл «срочную» позицию с тем же артикулом, не найдя существующую. Теперь два источника пишут в одну карточку витрины по очереди, и остаток скачет между двумя значениями с периодичностью обмена. Симптом узнаваемый: остаток то 4, то 11, без единой продажи. Лечится не в обмене, а в справочнике — и предотвращается проверкой уникальности из первой таблицы этой статьи.
- 3Отрицательный остаток
Учётная система разрешила списать больше, чем числилось, — обычно из-за задержки в оформлении приёмки. На витрину уходит минус, а она либо показывает его как ноль, либо, что хуже, интерпретирует по-своему. Правило простое: в обмен уходит максимум из нуля и расчётного значения, но при этом отрицательный остаток обязан попадать в отчёт расхождений. Скрыть минус от покупателя надо, скрыть его от кладовщика нельзя.
- 4Обмен встал ночью
Регламентное задание упало в 02:40, никто не увидел. К девяти утра витрина торгует по остаткам вчерашнего вечера. Здесь помогает не журнал, а датчик тишины: если за интервал, кратный расписанию, не было ни одного успешного прогона, уходит уведомление ответственному. Порог ставится в двойной интервал обмена — для магазина Б это 30 минут, для магазина А — 4 часа.
- 5Сменилась единица измерения
Товар начали учитывать в упаковках по 12 штук вместо штук. Обмен исправно передаёт число 5 — и витрина показывает 5 штук вместо 60. Ошибка кратная, поэтому она либо гасит продажи, либо создаёт заказы в двенадцать раз больше возможного. Единица измерения должна передаваться вместе с количеством и сверяться на приёме: если она изменилась с прошлого прогона, обмен по этой позиции останавливается и уходит в отчёт, а не пересчитывается сам.
Ежесуточная выгрузка «ключ, остаток в учёте, остаток на витрине, разница» с фильтром по ненулевой разнице занимает у ответственного 3–5 минут в день и ловит каждую из перечисленных поломок в день её появления, а не через месяц. Это самый дешёвый датчик во всём проекте, и его настраивают одновременно с самим обменом, а не «потом, когда стабилизируется».
Когда своими силами не стоит
Настроить обмен количествами по инструкции выше реально силами администратора и бухгалтера — это работа на несколько дней плюс неделя наблюдения. Но есть четыре случая, когда остаток перестаёт быть числом и становится объектом со своей историей. Там самостоятельная настройка обычно заканчивается тем, что расхождение переносится на уровень выше и обнаруживается уже при отгрузке.
- Маркировка Честный знак. Продаётся не «три единицы товара», а три конкретных кода, каждый со своим статусом в системе маркировки. В 2026 году обязательных товарных групп 27, а ЦПТ 2.0 блокирует продажу при расхождении автоматически — то есть цена ошибки обмена превращается из извинения перед покупателем в остановку кассы. Подробнее — в разборе товарных групп и ЦПТ.
- Серийный и партионный учёт. Когда важно, какая именно партия ушла покупателю — из-за сроков годности, гарантии или сертификата, — обмен обязан передавать не количество, а перечень партий с остатками по каждой. Свести это к одному числу можно, но тогда вы теряете способность ответить на вопрос «что именно вы отгрузили», а он рано или поздно прозвучит.
- Комплекты и наборы. Остаток набора — это не число на складе, а результат вычисления по остаткам компонентов, причём компоненты продаются и отдельно. Такой остаток пересчитывается при каждом движении любого из компонентов, и обычная выгрузка «поле в поле» здесь неприменима в принципе.
- Производство под заказ и полуфабрикаты. Доступное к продаже количество зависит от плана выпуска и от того, что уже запущено в работу. Это уже не обмен остатками, а связка с планированием производства, и настраивать её как выгрузку остатков — верный способ пообещать покупателю то, что цех не успеет сделать.
Есть и обратный случай, когда частый обмен просто не нужен. Если у вас сотня позиций, десять заказов в неделю и товар под заказ у поставщика, формула из раздела о частоте даст интервал в несколько суток. Тогда рабочее решение — выгрузка раз в сутки ночью и честная пометка на витрине «под заказ, срок поставки 3–5 дней». Это дешевле любой интеграции и точнее любого обмена, потому что не обещает того, чего нет. Прежде чем строить связку, стоит посчитать, сколько вам реально стоит текущий беспорядок — методика есть в материале про цену ручной работы.
Обмен возит не остатки, а обещание покупателю. Поэтому его надо не ускорять, а делать честным.
