790 товаров, которых не было на сайте
Полгода витрина интернет-магазина автоэлектроники показывала не тот каталог, что лежал в учётной системе. Никто этого не замечал: синхронизация работала, логи чистые, ошибок ноль.
Синхронизация ходила в МойСклад с фильтром «изменено после такой-то даты». Разумно: зачем тянуть 40 тысяч позиций каждый час, если поменялось двадцать.
Проблема в том, что МойСклад по такому фильтру не отдаёт архивные товары вовсе. А значит для синхронизации архивация выглядит не как событие, а как отсутствие события: товар просто перестаёт появляться в выборке. Флаг у нас остаётся прежним навсегда. То же с удалением.
Итог замера: 161 активная позиция была скрыта на сайте как архивная, 3 архивные продавались, а остаток врал у 353 товаров. Раздел «Аудио» стоял с марта — папку вообще не замапили на таблицу, и 790 позиций не показывались никому.
Инкрементальная синхронизация умеет ровно две вещи: добавлять и обновлять. Удаление, архивацию и разархивацию она не видит структурно, и никакой лог этого не покажет.
Лечится сверкой: раз в сутки берём из источника ВСЕ идентификаторы в обоих состояниях плюс отчёт остатков и приводим флаги в соответствие. Исчезнувшее помечаем архивом, а не удаляем — иначе порвутся ссылки из старых заказов.
И второе, что я теперь ставлю в каждый отчёт: строку сверки. Сколько записей в источнике, сколько разнеслось, сколько выпало и какие именно. Отчёт, который не умеет сказать, чего в нём нет, выглядит достоверным при любой потере данных.