БесплатноБесплатный прототип ключевой страницы и черновик ТЗ при старте проекта

Сохранение корзины между сессиями и устройствами

Сохранение корзины между сессиями и устройствами в интернет-магазине на 1С-Битрикс

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

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

Коротко

  • Гостевая корзина привязана к FUSER_ID в cookie — на другом устройстве или после потери cookie она «исчезает».
  • Кросс-девайс корзина возможна только для авторизованного клиента: она привязывается к пользователю, а не к браузеру.
  • При входе гостевую и сохранённую корзины нужно осознанно сливать: решить судьбу дубликатов и количества.
  • Восстановленную корзину обязательно валидируйте по наличию и цене, а старые записи чистите по TTL.

Почему корзина «теряется» и что это стоит

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

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

Как устроена корзина в 1С-Битрикс

В основе лежит модуль «Интернет-магазин» (sale). Содержимое корзины хранится в таблице базы данных (исторически b_sale_basket), где каждая строка — это позиция: товар или торговое предложение, количество, цена на момент добавления, набор свойств. Ключевое поле привязки — FUSER_ID, идентификатор «покупателя» в терминах модуля.

Важно понимать: FUSER_ID — это не то же самое, что USER_ID (идентификатор аккаунта). FUSER_ID существует у любого посетителя, включая анонимного гостя, и именно к нему привязываются позиции корзины. У авторизованного пользователя FUSER_ID стабильно связан с его аккаунтом, у гостя — живёт в cookie. Работа с корзиной в современном коде идёт через объекты D7 (\Bitrix\Sale\Basket, \Bitrix\Sale\Fuser), а не через старые процедурные функции — это надёжнее и предсказуемее. Про переход на объектную модель мы писали в материале про D7 ORM в Битрикс.

Оформление заказа по шагам КорзинатоварыДанныеконтактыДоставкаспособ, адресОплатаспособ оплатыСпасибозаказ созданЧем короче и понятнее шаги оформления, тем меньше брошенных корзин.
Схема: Чем короче и понятнее шаги оформления, тем меньше брошенных корзин.

FUSER_ID, cookie и время жизни сессии

Для гостя связь «браузер — корзина» держится на cookie. Битрикс кладёт FUSER_ID в cookie (в разных версиях это BITRIX_SM_SALE_UID и связанные значения), и пока cookie жива, гость видит свою корзину. Проблемы начинаются, когда cookie теряется.

Первый шаг — продлить жизнь cookie. Убедитесь, что срок хранения идентификатора покупателя достаточно длинный (недели, а не часы). Это простейшая мера, которая сразу снижает «потери» корзины между сессиями в одном браузере, ещё до всякой авторизации.

Гость против авторизованного клиента

Всё сохранение корзины делится на два принципиально разных сценария, и путать их нельзя.

АспектГостьАвторизованный клиент
К чему привязана корзинаFUSER_ID в cookie браузераFUSER_ID, связанный с аккаунтом
Между сессиямиПока жива cookieВсегда
Между устройствамиНетДа
УстойчивостьНизкаяВысокая
Ценность для маркетингаОграниченнаяВысокая (известен клиент)

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

Слияние корзин при входе в аккаунт

Самый ответственный момент — когда гость авторизуется. У него может быть свежая гостевая корзина в этом браузере и одновременно «старая» корзина, привязанная к аккаунту с прошлого визита на другом устройстве. Их нужно осознанно объединить, а не потерять одну из них.

Битрикс частично сливает корзины сам при входе, но политику слияния почти всегда доопределяют под бизнес:

  1. Ловим событие входа. Обработчик на OnAfterUserLogin получает управление сразу после авторизации.
  2. Находим обе корзины. Гостевой FUSER_ID (из cookie) и FUSER_ID пользователя.
  3. Решаем судьбу дубликатов. Если товар есть в обеих корзинах — суммировать количество, взять большее или оставить свежее гостевое значение.
  4. Переносим уникальные позиции. Всё, чего нет в клиентской корзине, перепривязываем к пользователю.
  5. Чистим гостевую. После переноса гостевые записи удаляем, чтобы не плодить дубли.

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

Кросс-девайс: одна корзина на всех устройствах

Кросс-девайс корзина — это то, ради чего всё затевается: клиент начал на телефоне, продолжил на компьютере и не потерял ни одной позиции. Технически это следствие правильной работы с авторизацией: как только пользователь вошёл под своим аккаунтом на любом устройстве, он видит корзину, привязанную к его FUSER_ID, а не к конкретному браузеру.

Практические нюансы, которые делают кросс-девайс приятным:

Валидация позиций при восстановлении

Восстановить корзину — не значит просто показать старые строки. Между заходами мир изменился: товар мог закончиться, подорожать, стать неактивным, а торговое предложение — исчезнуть. Показывать такую корзину «как есть» опасно: клиент оформит заказ на неактуальных условиях, а потом получит расхождение.

Поэтому при показе сохранённой корзины каждую позицию перепроверяют:

Битрикс умеет помечать недоступные позиции стандартными средствами, но именно UX-часть — как честно и мягко сообщить клиенту об изменениях — стоит продумать. Молчаливое удаление позиции из восстановленной корзины разрушает доверие сильнее, чем честное «этот товар закончился».

TTL, чистка и рост базы

Обратная сторона сохранения корзин — они копятся. По умолчанию Битрикс не удаляет незаказанные позиции, и за годы работы таблица корзины может разрастись до миллионов строк, замедляя запросы. Нужна политика TTL и регулярная чистка.

Тип корзиныРекомендуемый TTLЧем чистить
Гостевая, брошенная30–90 днейАгент или cron-скрипт
Клиентская, брошенная90–180 днейCron с выгрузкой в CRM перед удалением
Оформленные (в заказе)Не трогатьХранятся как история заказа

Чистку выносят в фоновую задачу — штатный агент Битрикса или отдельный cron-скрипт. Cron надёжнее агентов, которые в Битриксе запускаются «на хите» и могут не отработать при низком трафике. Как правильно организовать фоновые задачи и не завязывать их на посетителей, мы разбираем в контексте инфраструктуры и BitrixVM.

Корзина и композитный сайт

Композитный сайт кэширует HTML страниц и отдаёт статику мгновенно — но корзина у каждого своя, и её нельзя запекать в общий кэш. Иначе один посетитель увидит товары другого. Поэтому мини-корзину в шапке и блок корзины выносят в динамическую область.

На практике это значит: статический каркас страницы отдаётся из кэша, а персональные блоки (счётчик корзины, её содержимое, цена клиента) догружаются отдельным AJAX-запросом или через механизм динамических областей композита. Так вы сохраняете и скорость композитного сайта, и корректную персональную корзину. Само хранилище корзины при этом на сервере, поэтому кэш страниц ей не угрожает — угрожает только неправильная попытка закэшировать персональный блок.

Реализация пошагово

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

  1. Продлите cookie покупателя. Увеличьте срок жизни идентификатора FUSER_ID, чтобы корзина переживала перерывы в одном браузере.
  2. Работайте через D7. Операции с корзиной ведите через \Bitrix\Sale\Basket и \Bitrix\Sale\Fuser, а не устаревшие процедурные функции.
  3. Опишите слияние на входе. Обработчик OnAfterUserLogin объединяет гостевую и клиентскую корзины по вашей политике дубликатов.
  4. Добавьте валидацию при показе. Наличие, цена, доступность предложения и прав группы проверяются при каждом восстановлении.
  5. Вынесите корзину из кэша. Мини-корзина и блок корзины — динамические области композита или AJAX.
  6. Настройте TTL и чистку. Cron-скрипт удаляет старые брошенные корзины, при необходимости выгружая их в CRM.
  7. Проверьте кросс-девайс. Соберите корзину гостем на телефоне, войдите, откройте на десктопе — позиции на месте и слиты корректно.

Брошенные корзины и триггерные письма

Сохранённая корзина — это ещё и топливо для маркетинга. Брошенные корзины авторизованных клиентов можно передавать в CRM или систему рассылок и запускать триггерные письма «вы забыли товар». Это один из самых окупаемых сценариев работы с корзиной.

Чтобы это работало корректно, передачу данных о корзине делают через защищённый механизм — обычно REST-обмен или вебхуки в CRM. Здесь важна безопасность: данные клиента и содержимое корзины не должны утекать наружу. Как правильно защищать такие интеграции, мы разбираем в статье про REST, вебхуки и безопасность в Битрикс. А если под задачу нужен собственный компонент или модуль, полезен материал про разработку модуля Битрикс.

Частые ошибки

Чек-лист внедрения

  1. Срок cookie продлён. FUSER_ID гостя живёт недели, а не часы.
  2. Код на D7. Корзина обрабатывается через объектную модель Sale.
  3. Слияние настроено. OnAfterUserLogin объединяет корзины по описанной политике дубликатов.
  4. Валидация включена. При показе проверяются наличие, цена, предложение и права группы.
  5. Кросс-девайс проверен. Одна корзина видна на телефоне и десктопе после входа.
  6. Композит настроен. Мини-корзина вынесена в динамику, статика отдаётся из кэша.
  7. TTL и чистка работают. Cron удаляет старые брошенные корзины, ценные — выгружаются в CRM.
  8. Триггеры подключены. Брошенные корзины уходят в рассылки через защищённый обмен.

Вывод

Сохранение корзины между сессиями и устройствами — это не одна галочка, а связка решений: продлённая cookie для гостя, привязка к аккаунту для кросс-девайса, аккуратное слияние при входе, честная валидация восстановленных позиций и дисциплина чистки. Каждый из этих элементов закрывает свою утечку конверсии, а вместе они превращают корзину в надёжный инструмент, а не в источник разочарований.

На 1С-Битрикс всё это реализуется штатными средствами модуля «Интернет-магазин» плюс небольшой обвязкой на D7 и событиях. Начните с продления cookie и корректного слияния при входе — это даст самый быстрый эффект, — а затем добейте кросс-девайс, валидацию и чистку. В результате «зреющие» заказы перестанут срываться на пустой корзине, а клиенты смогут спокойно возвращаться к покупкам с любого устройства.

Частые вопросы

Почему корзина в 1С-Битрикс пропадает после закрытия браузера?

Корзина гостя привязана к идентификатору FUSER_ID, который хранится в cookie BITRIX_SM_SALE_UID. Если cookie не сохранилась (истёк срок, приватный режим, другой браузер или устройство), Битрикс генерирует новый FUSER_ID, и старая корзина к нему уже не относится. Сами позиции никуда не исчезают из таблицы b2e_sale_basket, но пользователь их больше не видит, потому что смотрит «под другим» идентификатором.

Как связать гостевую корзину с аккаунтом при входе?

При авторизации нужно перепривязать позиции гостевого FUSER_ID к FUSER_ID пользователя и объединить их с тем, что он собрал раньше на другом устройстве. Битрикс частично делает слияние сам через событие входа, но на практике логику доопределяют: что делать с дубликатами, как суммировать количество, что приоритетнее — свежая гостевая корзина или сохранённая ранее. Это дописывается обработчиком события OnAfterUserLogin.

Можно ли увидеть одну и ту же корзину на телефоне и на компьютере?

Да, но только для авторизованного пользователя. Пока человек гость, его корзина живёт в cookie конкретного браузера и на другое устройство не переносится. Как только он вошёл под своим аккаунтом, корзина привязывается к пользователю, а не к браузеру, и одинаково доступна с телефона, планшета и десктопа. Поэтому кросс-девайс корзина — это, по сути, стимул к авторизации.

Как долго Битрикс хранит брошенные корзины?

По умолчанию записи в таблице корзины не удаляются автоматически и могут копиться годами, раздувая базу. За чистку отвечает отдельная логика: старые незаказанные позиции с истёкшим TTL удаляют агентом или cron-скриптом. Разумный срок — от 30 до 180 дней для гостевых корзин; корзины авторизованных клиентов обычно хранят дольше, потому что это ценные данные для допродаж.

Мешает ли композитный сайт и кэш сохранению корзины?

Сама корзина хранится на сервере, поэтому кэш её не теряет, но блок «мини-корзина» в шапке нельзя кэшировать статически — иначе разные пользователи увидят чужие товары. Динамические блоки корзины на композитном сайте выносят в отложенную загрузку (BX.ajax или composite dynamic areas), чтобы статика отдавалась мгновенно, а актуальное содержимое корзины подгружалось персонально.

Как сохранить корзину, если товар уже удалён или закончился?

При показе восстановленной корзины позиции нужно перепроверять: есть ли товар в наличии, не изменилась ли цена, активно ли предложение. Битрикс умеет помечать недоступные позиции, но UX-логику стоит доопределить — показать клиенту, что позиция стала недоступна или подорожала, и предложить аналог. Молча удалять товар из восстановленной корзины плохо: клиент теряет доверие.

Влияет ли сохранение корзины на обмен с 1С?

Незаказанная корзина в 1С не выгружается — обмен CommerceML работает с оформленными заказами, а не с содержимым корзин. Но брошенные корзины полезны для маркетинга и аналитики, поэтому их часто передают в CRM или систему рассылок для триггерных писем «вы забыли товар». Это отдельная интеграция поверх модуля «Интернет-магазин», не связанная напрямую с выгрузкой заказов в учётную систему.

Что надёжнее — хранить корзину в базе или в localStorage браузера?

Для магазина на 1С-Битрикс основным хранилищем должна быть база (таблица корзины, привязка к FUSER_ID) — это единственный способ обеспечить кросс-девайс и серверную валидацию цен и наличия. localStorage можно использовать как вспомогательный кэш для мгновенного отображения, но доверять ему как источнику истины нельзя: его легко подменить, и он живёт только в одном браузере.

Поделиться:

Теряете заказы на пустой корзине?

Настроим сохранение корзины между сессиями и устройствами, слияние при входе и чистку старых данных. Рассчитаем работу по вашему магазину на 1С-Битрикс.

Автоматизация на 1С

Редакция B2Bsite

Команда B2Bsite. С 2014 года разрабатываем интернет-магазины и порталы на 1С-Битрикс: настраиваем корзину, оформление заказа и обмен с 1С так, чтобы заказы доходили до оплаты.

← Все статьи блога