Список избранных товаров (wishlist) — функция, повышающая вовлечённость и дающая покупателю способ вернуться к отложенным товарам позже, будь то через месяц или через год. Разберём, как реализовать избранное в 1С-Битрикс для авторизованных и анонимных пользователей.
Хранение для авторизованного пользователя
Для авторизованных пользователей избранное логично хранить
привязанным к учётной записи — либо через отдельный инфоблок
с элементами-связками "пользователь — товар", либо через
собственную таблицу D7 с полями USER_ID и
PRODUCT_ID. Табличный вариант через
DataManager обычно эффективнее инфоблока для такой
простой структуры данных без необходимости в сложных свойствах
и административном интерфейсе редактирования, свойственном
инфоблокам.
<?php
namespace Vendor\Module;
use Bitrix\Main\Entity\DataManager;
use Bitrix\Main\Entity\IntegerField;
use Bitrix\Main\Entity\DatetimeField;
class WishlistTable extends DataManager
{
public static function getTableName(): string
{
return 'vendor_wishlist';
}
public static function getMap(): array
{
return [
new IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new IntegerField('USER_ID', ['required' => true]),
new IntegerField('PRODUCT_ID', ['required' => true]),
new DatetimeField('ADDED_AT'),
];
}
}
Добавление и удаление товара
<?php
use Bitrix\Main\Type\DateTime;
function toggleWishlist(int $userId, int $productId): bool
{
$existing = WishlistTable::getList([
'filter' => ['USER_ID' => $userId, 'PRODUCT_ID' => $productId],
'select' => ['ID'],
])->fetch();
if ($existing) {
WishlistTable::delete($existing['ID']);
return false; // удалено из избранного
}
WishlistTable::add([
'USER_ID' => $userId,
'PRODUCT_ID' => $productId,
'ADDED_AT' => new DateTime(),
]);
return true; // добавлено в избранное
}
Функция-переключатель (toggle) упрощает логику кнопки "в избранное" — один вызов сам определяет, добавить товар или убрать, в зависимости от текущего состояния, что удобнее для AJAX-обработчика кнопки, чем раздельные методы добавления и удаления с проверкой состояния на стороне клиента.
Нужна помощь с Битрикс?
Избранное для анонимного посетителя
Для неавторизованных посетителей список избранного логично хранить в cookie или localStorage на стороне браузера — это не требует обращения к серверу для хранения, но означает, что список теряется при смене устройства или очистке данных браузера. Компромиссный вариант — хранить в cookie до авторизации, а при входе синхронизировать локальный список с серверным хранилищем, объединяя оба набора.
Слияние избранного при авторизации
<?php
function mergeWishlistOnLogin(int $userId, array $anonymousProductIds): void
{
foreach ($anonymousProductIds as $productId) {
$existing = WishlistTable::getList([
'filter' => ['USER_ID' => $userId, 'PRODUCT_ID' => $productId],
])->fetch();
if (!$existing) {
WishlistTable::add(['USER_ID' => $userId, 'PRODUCT_ID' => $productId]);
}
}
}
При авторизации ранее анонимного посетителя, накопившего список избранного в cookie, стоит объединить его с уже существующим серверным списком пользователя, а не заменять один список другим целиком, — покупатель ожидает увидеть все свои ранее отложенные товары, а не потерять часть из них из-за перезаписи.
Проверка актуальности товаров в избранном
Товар, добавленный в избранное давно, может стать неактивным или вовсе быть удалён из каталога к моменту, когда покупатель вернётся посмотреть список, — вывод избранного должен корректно обрабатывать такие случаи (скрывать неактивные товары или показывать пометку "товар больше недоступен"), а не падать с ошибкой при попытке вывести данные несуществующего элемента.
Уведомления об изменении цены избранных товаров
Дополнительная функциональность, повышающая ценность избранного для маркетинга, — уведомление пользователя о снижении цены на товар в его списке избранного, реализуемое агентом, сравнивающим текущую цену с ценой на момент добавления и рассылающим письмо при существенном снижении. Это требует сохранения цены на момент добавления в структуру данных избранного, если такое сравнение предполагается.
Частые ошибки
- Список избранного анонимного пользователя теряется при авторизации. Вместо слияния список просто перезаписывается серверным вариантом.
- Нет обработки неактивных или удалённых товаров в избранном. Ошибка при попытке вывести данные несуществующего элемента.
- Отдельная таблица не создана, используется тяжеловесный инфоблок для простой связки. Избыточная сложность для структуры данных, не требующей возможностей инфоблока.
Итог
Избранное в 1С-Битрикс эффективнее реализовать через собственную D7-таблицу связки пользователя и товара, а не через инфоблок, избыточный для такой простой структуры. Для анонимных посетителей список хранится на клиенте и объединяется с серверным при авторизации — полная замена одного списка другим рискует незаметно потерять часть отложенных пользователем товаров.
