Всё, что покупатель видит на сайте, приходит из 1С отдельными выгрузками. Выгрузка - это сжатый файл с данными: новые цены, изменившиеся товары, свежие остатки.
Путь одной выгрузки
Порядок работы такой.
1С формирует и передаёт выгрузку. Данные собираются в файл и отправляются на сайт по защищённому каналу с авторизацией. Большие выгрузки делятся на части.
Сайт принимает файл. Файл сохраняется в очередь целиком: незавершённой записи в очереди не бывает - обработчик физически не может увидеть недописанный файл. Затем выгрузка попадает в журнал обмена со статусом "ожидает обработки", и 1С получает подтверждение приёма. На этом её работа заканчивается: обработку 1С не ждёт.
Сервис синхронизации разбирает очередь. Он проверяет очередь каждые несколько секунд, поэтому данные обрабатываются почти сразу. Обработчик собирает части выгрузки воедино, определяет тип данных, сверяет их с текущим состоянием сайта и записывает только изменения. По завершении в журнале появляется отметка "обработана" и ссылка на подробный протокол.
Витрина показывает свежие данные. Между изменением в 1С и обновлением на сайте проходят минуты, а для остатков - считанные минуты по расписанию самой 1С.
Почему записываются только изменения
Обработчик не переписывает данные вслепую. Он сравнивает содержимое выгрузки с тем, что уже есть на сайте, и обращается к базе только там, где данные действительно изменились. Это экономит время обработки и не создаёт лишней нагрузки на магазин в рабочие часы.
Каждая запись привязана к своему коду из 1С. Поэтому повторная обработка одной и той же выгрузки не создаёт дубликатов: система обновит существующую запись, а не добавит вторую такую же. Это свойство делает безопасными и повторные передачи со стороны 1С, и перезапуск обработки после сбоя.
Большие выгрузки передаются частями
Полная выгрузка цен - это около 260 000 строк. Передать такой объём одним файлом неудобно и ненадёжно, поэтому 1С делит его на части и помечает их общим номером выгрузки.
Главное правило: выгрузка обрабатывается только целиком. Пока получены не все части, выгрузка ждёт. Обработать полученную часть означало бы показать покупателю каталог, из которого пропала половина товаров, или прайс-лист с частью цен.
Как только недостающие части приезжают, выгрузка собирается воедино и уходит в работу на ближайшей проверке очереди.
Чтение данных не зависит от объёма
Файл выгрузки читается последовательно, запись за записью, а не загружается в память целиком. Поэтому расход памяти одинаков и для выгрузки на сто строк, и для выгрузки на четверть миллиона. Объём данных может расти вместе с каталогом, не требуя переделки обмена.
Это часть серии про обмен с 1С. Обзорная версия всей темы - в статье про обмен целиком, контекст проекта - в кейсе B2B-платформы.
