В 1С-Битрикс нет единой готовой «кнопки избранного»: то, что пользователь называет вишлистом, на практике собирается из трёх разных механизмов — отложенных товаров корзины, подписки на поступление и собственного хранилища на highload-блоке. Разберём, когда какой подход уместен и как не наплодить дублей.
Избранное, отложенное и подписка — это три разные сущности
Главная ошибка при постановке задачи — считать «избранное» одним компонентом. В экосистеме 1С-Битрикс за этим словом скрываются три независимых механизма, у каждого своя таблица и своя логика жизненного цикла:
- Отложенные товары — позиции корзины с флагом
DELAY = 'Y'. Живут в модулеsale, привязаны к покупателю (FUSER), не участвуют в оформлении, пока их не вернут в корзину. - Подписка на поступление — компонент
catalog.product.subscribe, хранит запросы вBitrix\Catalog\SubscribeTable. Это «уведомите, когда появится», а не «хочу купить позже». - Собственный список желаний — кастомное хранилище (highload-блок, cookie/localStorage для гостей), которое живёт независимо от корзины и не влияет на остатки.
Отложенные товары через корзину (DELAY)
Самый «родной» для Битрикса вариант вишлиста — отложенные товары. Компонент bitrix:sale.basket.basket из коробки умеет разделять активную корзину и отложенные позиции: за это отвечает поле DELAY в таблице b_sale_basket. Позиция с DELAY = 'Y' не попадает в итог заказа, но остаётся привязанной к покупателю.
Перенос в отложенное на актуальном D7-API выглядит так:
use Bitrix\Sale\Basket; use Bitrix\Sale\Fuser; $basket = Basket::loadItemsForFUser(Fuser::getId(), SITE_ID); $item = $basket->getExistsItem('catalog', $productId); $item->setField('DELAY', 'Y'); $basket->save();
Ключевое преимущество — привязка к FUSER (таблица b_sale_fuser), который создаётся и для анонимного посетителя. Поэтому отложенное работает у гостя без регистрации и автоматически «прилипает» к аккаунту при входе. Минус — это по-прежнему корзина: товар должен существовать в каталоге, а не в произвольном инфоблоке.
catalog.product.subscribe: подписка на поступление
Когда пользователь жмёт «Сообщить о поступлении» на товаре с нулевым остатком — это компонент bitrix:catalog.product.subscribe. Чтобы он заработал, включите в настройках модуля каталога опцию подписки, а у товаров разрешите поле SUBSCRIBE (значения Y/N/D).
Запросы складываются в Bitrix\Catalog\SubscribeTable (таблица b_catalog_subscribe). Рассылку уведомлений выполняет агент модуля каталога: когда количество товара становится больше нуля, он отправляет почтовое событие подписчикам и снимает подписку. Список своих подписок пользователь видит в личном кабинете через компонент подписок.
| Параметр | Отвечает за |
|---|---|
SubscribeTable | Хранение запросов на уведомление |
| Агент каталога | Проверку остатков и отправку писем |
Поле SUBSCRIBE | Разрешение подписки на конкретный товар |
Полноценный вишлист на highload-блоке
Если нужен именно «список желаний» — с возможностью хранить товары бессрочно, показывать их отдельной страницей и не смешивать с корзиной — делают кастомное хранилище. Классическое решение: highload-блок с полями «пользователь», «ID товара», «дата добавления».
- Создаём HL-блок в
Настройки → Highload-блоки, генерируем класс сущности черезHighloadBlockTable::compileEntity(). - Добавление/удаление обрабатываем AJAX-эндпоинтом (свой компонент или контроллер
Bitrix\Main\Engine\Controller). - Вывод страницы избранного —
catalog.sectionилиcatalog.element.listс фильтром по собранному массиву ID.
Для гостя удобно держать список в localStorage или cookie и синхронизировать с HL-блоком при авторизации. Так посетитель формирует подборку до регистрации, а после входа ничего не теряет.
Счётчик и вывод в шапке
Иконка «сердечка» с числом в шапке — обязательный элемент. Держите её на AJAX, чтобы количество обновлялось без перезагрузки страницы и не ломало композитный кэш.
- Композит. Шапка обычно попадает в композитный кэш, поэтому счётчик рендерят отдельным блоком, который дозагружается запросом после отрисовки страницы.
- Эндпоинт. Число избранного отдавайте лёгким контроллером, а не полным пересчётом каталога — верните только
count. - Событие. После добавления товара инициируйте на фронте кастомное событие и перерисуйте бейдж, чтобы значения в карточке, в шапке и на странице совпадали.
Перенос списка при авторизации и синхронизация устройств
Самый частый баг вишлиста — потеря подборки. Гость добавил товары, авторизовался, и список исчез. Чтобы этого не было, синхронизацию вешают на событие входа.
Отложенные товары решают это сами: они привязаны к FUSER, и Битрикс при логине переносит анонимную корзину на пользователя. Для кастомного избранного придётся сделать перенос вручную — на событии main:OnAfterUserAuthorize или OnAfterUserLogin слить данные из cookie/localStorage в highload-блок, разрешив дубли по ключу «пользователь + товар».
- При слиянии проверяйте существование записи, чтобы не плодить дубли одного товара.
- После авторизации очищайте гостевое хранилище, иначе список задвоится на следующем входе.
- Если товар удалён из каталога, скрывайте его в выводе, но не роняйте страницу избранного целиком.
Типичные ошибки и производительность
По опыту внедрений, проблемы с избранным почти всегда сводятся к нескольким повторяющимся сценариям:
- Смешивание сущностей. Подписку на поступление реализуют через отложенные товары — и пользователь получает «купите» вместо «появилось в наличии».
- Игнор FUSER. Кастомный вишлист вяжут только к
USER_ID, из-за чего гости вообще не могут добавлять товары. - Нет очистки. HL-блок избранного разрастается мёртвыми записями по несуществующим товарам — вывод страницы замедляется.
- Прямые запросы в шапке. Счётчик считается на каждой странице синхронно и убивает композит.
Итог
«Избранное» в 1С-Битрикс — это не один компонент, а выбор из трёх механизмов: отложенные товары (флаг DELAY в корзине) для сценария «куплю позже», catalog.product.subscribe для уведомлений о поступлении и собственный highload-блок для полноценного списка желаний с гостевым режимом и синхронизацией. Правильный выбор зависит от бизнес-сценария, а качество реализации — от аккуратной работы с FUSER, кэшем шапки и переносом данных при авторизации.
Мы в B2Bsite проектируем и дорабатываем личные кабинеты и каталоги на 1С-Битрикс под конкретную логику магазина — от отложенных товаров до вишлиста с синхронизацией устройств. Если нужно собрать избранное так, чтобы оно не терялось и не тормозило каталог, поможем спроектировать и внедрить решение.
Частые вопросы
Есть ли в 1С-Битрикс готовый компонент «Избранное»?
Единого компонента вишлиста в стандартной поставке нет. Ближайшее из коробки — отложенные товары в компоненте sale.basket.basket и подписка catalog.product.subscribe. Полноценное избранное обычно делают на highload-блоке.
Чем отложенные товары отличаются от избранного?
Отложенные — это позиции корзины с флагом DELAY='Y', привязанные к покупателю и работающие только с товарами каталога. Избранное на highload-блоке живёт независимо от корзины и не влияет на оформление заказа.
Как работает catalog.product.subscribe?
Компонент сохраняет запрос пользователя в Bitrix\Catalog\SubscribeTable, а агент модуля каталога отслеживает остаток товара. Когда количество становится больше нуля, подписчику уходит письмо, и подписка снимается.
Будет ли избранное работать у неавторизованного гостя?
Да, если реализовать хранение через FUSER (как у отложенных товаров) или через cookie/localStorage для кастомного вишлиста. Главное — при входе перенести гостевую подборку в аккаунт пользователя.
Как не потерять список при авторизации?
Для отложенных товаров перенос происходит автоматически по FUSER. Для кастомного избранного слейте гостевые данные в highload-блок на событии OnAfterUserAuthorize и очистите гостевое хранилище, избегая дублей.
Почему счётчик избранного тормозит каталог?
Обычно из-за прямого запроса к БД в прологе на каждой странице, что мешает композитному кэшу. Выносите счётчик в отдельный AJAX-блок и возвращайте только число, а не пересчёт всего списка.
Как включить подписку на поступление товара?
В настройках модуля каталога включите подписку и разрешите поле SUBSCRIBE у нужных товаров. Затем разместите компонент catalog.product.subscribe на карточке товара с нулевым остатком.
Где хранить избранное для большого каталога?
Для устойчивости берите highload-блок с полями пользователь, товар и дата. Регулярно чистите записи по удалённым товарам и кэшируйте вывод, иначе страница избранного будет замедляться при росте данных.
Поможем с настройкой и поддержкой 1С-Битрикс: Управление сайтом
Поможем с настройкой, доработкой и поддержкой 1С-Битрикс: Управление сайтом.