Вебформат

Главная/Как мы построили обмен с 1С/Технический разбор

Технический разборГлава 2 из 85 мин

Импорт: как данные из 1С попадают на сайт

Вторая часть разбора обмена - путь данных из 1С на витрину. Как сайт принимает сжатый файл, почему в очереди не бывает недописанных выгрузок, как выгрузка из 12 частей собирается воедино и почему в базу записываются только изменения. Полная выгрузка цен - около 260 000 строк.

Импорт данных из 1С
Импорт данных из 1С

Всё, что покупатель видит на сайте, приходит из 1С отдельными выгрузками. Выгрузка - это сжатый файл с данными: новые цены, изменившиеся товары, свежие остатки.

Путь одной выгрузки

Путь выгрузки: из 1С - на витрину сайта
1С:ERP
Собрала изменения: товары, цены, остатки, клиенты
Упаковала данные в сжатый файл
Большая выгрузка режется на части - у всех частей один идентификатор
передача по защищённому каналу: шифрование + авторизация
Сайт - приём выгрузки
Сохранил файл в очередь - атомарно, "полуфайлов" не бывает
Записал выгрузку в журнал обмена, статус "ожидает обработки"
Подтвердил 1С приём выгрузки
1С получила подтверждение и свободна; сервис проверяет очередь каждые ~10 секунд
Сервис синхронизации - разбор
Забрал из журнала выгрузку "ожидает обработки"
Собрал части выгрузки воедино
Определил тип данных: товары? цены? остатки?
сверка с текущим состоянием сайта
Сервис синхронизации - запись
Записал только изменения - без слепой перезаписи
Отметка в журнале: "обработана" + ссылка на подробный протокол
Переложил файлы в архив
между изменением в 1С и витриной - минуты
Витрина магазина
Покупатель видит свежие данные - остатки и цены точны до минут
Приём занимает доли секунды: 1С получает подтверждение сразу и обработку не ждёт - она уже свободна.

Порядок работы такой.

1С формирует и передаёт выгрузку. Данные собираются в файл и отправляются на сайт по защищённому каналу с авторизацией. Большие выгрузки делятся на части.

Сайт принимает файл. Файл сохраняется в очередь целиком: незавершённой записи в очереди не бывает - обработчик физически не может увидеть недописанный файл. Затем выгрузка попадает в журнал обмена со статусом "ожидает обработки", и 1С получает подтверждение приёма. На этом её работа заканчивается: обработку 1С не ждёт.

Сервис синхронизации разбирает очередь. Он проверяет очередь каждые несколько секунд, поэтому данные обрабатываются почти сразу. Обработчик собирает части выгрузки воедино, определяет тип данных, сверяет их с текущим состоянием сайта и записывает только изменения. По завершении в журнале появляется отметка "обработана" и ссылка на подробный протокол.

Витрина показывает свежие данные. Между изменением в 1С и обновлением на сайте проходят минуты, а для остатков - считанные минуты по расписанию самой 1С.

Почему записываются только изменения

Обработчик не переписывает данные вслепую. Он сравнивает содержимое выгрузки с тем, что уже есть на сайте, и обращается к базе только там, где данные действительно изменились. Это экономит время обработки и не создаёт лишней нагрузки на магазин в рабочие часы.

Каждая запись привязана к своему коду из 1С. Поэтому повторная обработка одной и той же выгрузки не создаёт дубликатов: система обновит существующую запись, а не добавит вторую такую же. Это свойство делает безопасными и повторные передачи со стороны 1С, и перезапуск обработки после сбоя.

Большие выгрузки передаются частями

Полная выгрузка цен - это около 260 000 строк. Передать такой объём одним файлом неудобно и ненадёжно, поэтому 1С делит его на части и помечает их общим номером выгрузки.

Большая выгрузка идёт частями и обрабатывается только целиком
1С:ERP
Выгрузка каталога велика для одной передачи
1С делит её на 12 частей и помечает общим номером выгрузки
части 1...7 - каждая с отметкой "часть i из 12"
Сайт - приём выгрузок
Каждая часть: файл - в очередь, запись - в журнал
Приём каждой части подтверждён 1С
проверка очереди - каждые несколько секунд
Обработчик очереди
Собрано 7 частей из 12
Выгрузка не берётся в работу - ждёт остальные части
7 из 12
оставшиеся части 8...12 поступают тем же путём
Обработчик очереди
Все части на месте - объединяются в единую выгрузку
Выгрузка уходит в обработку на ближайшей проверке очереди
12 из 12
Итог
Данные обновляются только целиком - промежуточных состояний каталога не бывает
Обработать полученную часть - значит показать покупателю каталог, из которого пропала половина товаров, или прайс-лист с частью цен.

Главное правило: выгрузка обрабатывается только целиком. Пока получены не все части, выгрузка ждёт. Обработать полученную часть означало бы показать покупателю каталог, из которого пропала половина товаров, или прайс-лист с частью цен.

Как только недостающие части приезжают, выгрузка собирается воедино и уходит в работу на ближайшей проверке очереди.

Чтение данных не зависит от объёма

Файл выгрузки читается последовательно, запись за записью, а не загружается в память целиком. Поэтому расход памяти одинаков и для выгрузки на сто строк, и для выгрузки на четверть миллиона. Объём данных может расти вместе с каталогом, не требуя переделки обмена.

Это часть серии про обмен с 1С. Обзорная версия всей темы - в статье про обмен целиком, контекст проекта - в кейсе B2B-платформы.

Нужен такой же обмен с вашей 1С?

Расскажите, что за учётная система и какие данные должны ходить между ней и сайтом. Покажем работающий обмен и оценим перенос схемы на ваш проект.