Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья5 мин чтенияПросмотры0

Пагинация API: почему полный экспорт каталога может пропускать товары

Удаление записи между страницами сдвигает выборку. На небольшом примере разбираем смещение, курсор, согласованный снимок и возобновление экспорта после сбоя.

Комментарии 0

Денис перелистывает книгу с жёлтой закладкой: граница продолжения при постраничном чтении
В этой статье

Экспорт прочитал первые 100 товаров, затем следующие 100. Ошибок API нет, а 1 товар в результате пропущен. Между запросами из начала списка удалили запись: всё после неё сдвинулось. Переход «пропустить первые 100» теперь означает уже другую границу.

Для выгрузки меняющегося каталога нужно заранее определить две вещи: как продолжать чтение и какое состояние считать полным результатом. Устойчивый курсор помогает с первым. Для второго может понадобиться согласованный снимок или отдельная сверка изменений. Само наличие кнопки «следующая страница» не решает обе задачи.

Пропуск возникает даже при правильной сортировке

Возьмём учебный список идентификаторов 10, 20, 30, 40, 50, 60 и размер страницы три. Первый ответ содержит 10, 20, 30. Затем запись 20 удаляется. Список становится 10, 30, 40, 50, 60. Запрос со смещением три пропустит первые три текущие записи и вернёт 50, 60. Идентификатор 40 не попал ни в один ответ.

Если перед второй страницей добавить запись в начало, возможен обратный эффект: уже прочитанный товар снова окажется за смещением. Удаление повторов на стороне получателя уберёт лишнюю копию, но не восстановит пропущенную запись. Поэтому число ответов без ошибок недостаточно для приёмки выгрузки.

Даже на неизменном наборе требуется определённый порядок. Сортировка только по времени изменения не задаёт однозначную последовательность, если несколько товаров получили одинаковое время. Нужен дополнительный устойчивый признак для разрешения равенства. Документация PostgreSQL отдельно предупреждает: ограничение выборки без уникального порядка может возвращать непредсказуемые части результата. Это свойство запроса, а не гарантия конкретного API.

Курсор закрепляет границу продолжения

В простом учебном варианте данные идут по возрастающему неизменяемому идентификатору. После первой страницы запоминают последний прочитанный ключ 30 и просят следующие записи после него. Удаление 20 уже не сдвигает эту границу: следующий набор будет 40, 50, 60. Модель решает показанную проблему смещения.

После удаления идентификатора 20 смещение три возвращает 50 и 60, пропуская 40; чтение после ключа 30 возвращает 40, 50 и 60
Учебный список с неизменяемыми ключами. Курсор устраняет показанный сдвиг, но сам по себе не фиксирует снимок каталога.

Реальный API может выдавать непрозрачный токен продолжения. Его следует возвращать сервису в предусмотренном поле, сохраняя фильтры и направление обхода. Не пытайтесь извлечь из токена номер страницы или самостоятельно увеличить его. Формат, срок жизни и поведение после изменения данных определяет сервис.

У разных интерфейсов отличаются и признаки конца. Это может быть отсутствие следующего токена или отдельный флаг. Число записей меньше запрошенного лимита само по себе не всегда означает конец. В рекомендациях Google по проектированию API допустима неполная, в том числе пустая страница с продолжением. Правило остановки берут из контракта конкретного метода.

Курсор не замораживает каталог

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

Для задачи «полный каталог на один момент» нужен механизм, который действительно фиксирует состояние: например, подготовленный сервером экспорт или поддерживаемый снимок с правилами хранения. Передавать одну и ту же дату в фильтре недостаточно, если записи всё равно меняются между запросами и сервис не обещает согласованность.

Для задачи «довести получателя до актуального состояния» допустима другая модель: первоначальная загрузка и последующее применение изменений с согласованной точки. Здесь отдельно решают, как передаются удаления, как долго хранится история и что делать при пропуске её срока. Полный снимок и поток изменений требуют разных критериев готовности.

После обрыва возобновляют подтверждённый участок

Сохранять позицию нужно вместе с пониманием, какие записи получатель уже устойчиво обработал. Если запомнить следующий курсор до записи текущей страницы, сбой оставит необработанные товары позади контрольной точки. Если сохранить курсор позднее, возможен повтор страницы; обработчик должен распознавать уже принятую версию объекта.

Один токен в журнале также не описывает всю выборку. Для возобновления нужны согласованные фильтры, сортировка, версия формата и контекст доступа. Если токен истёк, нельзя угадывать новый и продолжать с приблизительного места. Контракт должен предусматривать повторный снимок либо другой проверяемый способ восстановления.

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

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

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

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.