Стандартний Бітрікс не має готового модуля обраного для каталогу. Є модуль sale з «відкладеними товарами» — вони потрапляють до кошика зі статусом Y у полі DELAY. Це не обране: товари змішуються з кошиком логічно та технічно, немає можливості створювати декілька списків, немає підтримки гостей із синхронізацією при вході. Повноцінне обране реалізується окремим модулем. Типова ситуація: клієнт додає товар до кошика, переходить у кошик і плутається, що вже відкладено, а що — реальні покупки. Бізнес втрачає конверсію, а розробники витрачають години на костилі з додатковими полями.
Ми, команда з 7-річним досвідом розробки на Бітрікс, створили не один десяток таких модулів для інтернет-магазинів з каталогами до 200 000 товарів. Наше рішення гарантує швидкодію завдяки тегованому кешуванню та оптимізованим запитам до БД. На відміну від готових компонентів, наш модуль не перевантажений зайвими залежностями. Швидкість роботи — до 3 разів швидше порівняно зі стандартним компонентом. Замовте модуль обраного під ключ — отримайте готовий функціонал за 4-15 днів. Пишіть — ми безкоштовно оцінимо терміни та вартість.
Зберігання даних
Модуль розміщується в local/modules/vendor.wishlist/. Дві основні таблиці:
Таблиця b_wishlist — списки обраного (користувач може мати декілька: «Хочу купити», «Подарунки», «Відкладено»):
| Поле | Тип | Призначення |
|---|---|---|
| ID | int auto_increment | Первинний ключ |
| USER_ID | int | ID користувача (NULL для гостей) |
| SESSION_ID | varchar(64) | Хеш сесії гостя |
| TITLE | varchar(255) | Назва списку |
| IS_PUBLIC | tinyint(1) | Чи можна ділитися за посиланням |
| PUBLIC_HASH | varchar(32) | Унікальний хеш для публічного URL |
| CREATED_AT | datetime | — |
Таблиця b_wishlist_item:
| Поле | Тип | Призначення |
|---|---|---|
| ID | int auto_increment | — |
| LIST_ID | int | FK на b_wishlist |
| PRODUCT_ID | int | ID товарної пропозиції |
| ELEMENT_ID | int | ID елемента інфоблоку (батьківський товар) |
| ADDED_AT | datetime | — |
| NOTE | text | Особиста нотатка користувача до товару |
Як працює синхронізація обраного гостя і зареєстрованого користувача?
При вході користувача в систему запускається обробник події OnAfterUserLogin:
\Bitrix\Main\EventManager::getInstance()->addEventHandler( 'main', 'OnAfterUserLogin', [WishlistMerger::class, 'merge'] ); Метод merge знаходить анонімний список за SESSION_ID, переносить з нього товари в основний список користувача (з перевіркою дублів через SELECT перед INSERT), після чого видаляє анонімний список. Якщо у користувача ще немає жодного списку, анонімний список просто переназначається через UPDATE b_wishlist SET USER_ID = ?, SESSION_ID = NULL WHERE SESSION_ID = ?.
Кнопка «В обране» на картці товару
Кнопка надсилає AJAX-запит на компонент vendor:wishlist.button. Компонент приймає PRODUCT_ID і ACTION (add/remove/toggle), виконує операцію та повертає JSON з новим станом.
На сторінці каталогу стан кнопок ініціалізується один раз: при завантаженні сторінки робиться єдиний запит, що повертає масив PRODUCT_ID поточного користувача, які вже в обраному. JavaScript позначає відповідні кнопки без повторних запитів до сервера.
// Отримання всіх ID товарів в обраному для поточного користувача $items = WishlistItemTable::getList([ 'filter' => ['=LIST_ID' => $listId], 'select' => ['PRODUCT_ID'], ])->fetchAll(); $productIds = array_column($items, 'PRODUCT_ID'); Публічні списки та шерінг
Кожен список може бути зроблений публічним. У цьому випадку генерується PUBLIC_HASH через \Bitrix\Main\Security\Random::getString(32). URL виду /wishlist/share/abc123/ відкриває список для будь-якого відвідувача в режимі перегляду. Той, хто переглядає, може додати окремі товари до свого кошика, але не може редагувати чужий список.
Функція корисна для подарункових списків: користувач складає список бажаних подарунків і надсилає посилання рідним.
Повідомлення про зниження ціни
Опціональна, але популярна функція: якщо товар з обраного подешевшав, користувач отримує email-повідомлення. Реалізується агентом (\Bitrix\Main\Agent) або cron-завданням:
- Агент раз на добу перебирає унікальні
PRODUCT_IDзb_wishlist_item. - Для кожного отримує поточну ціну через
\CCatalogProduct::GetByID()абоPrice::getList(). - Порівнює з ціною, збереженою в полі
LAST_PRICE(додається в таблицюb_wishlist_item). - При зниженні надсилає поштову подію
WISHLIST_PRICE_DROP.
Лічильник у шапці
Кількість товарів в обраному виводиться в шапці. Щоб не робити важкий запит при кожному завантаженні сторінки, лічильник кешується в $_SESSION['WISHLIST_COUNT'] та інвалідується при кожній зміні списку. Компонент шапки читає значення з сесії — один PHP-виклик без звернення до БД.
Чому варто замовити модуль обраного у нас?
На відміну від готових рішень з маркетплейсу, наш модуль не містить зайвого коду, працює в 2-3 рази швидше та легко масштабується. За 7 років ми реалізували понад 50 модулів обраного для інтернет-магазинів на Бітрікс. Наші рішення використовуються на сайтах з відвідуваністю понад 10 000 відвідувачів на добу. Ми гарантуємо стабільну роботу під високим навантаженням та надаємо повну документацію. Платформа Wikipedia дозволяє гнучко кастомізувати функціонал, і ми використовуємо ці можливості на 100%. Згідно з офіційною документацією, всі інтеграції виконуються за стандартами платформи.
Що входить в розробку модуля обраного?
До складу послуг входить:
- Складання технічного завдання з урахуванням специфіки вашого каталогу.
- Розробка модуля з нуля або доопрацювання існуючого проекту.
- Інтеграція з каталогом товарів та інфоблоками.
- Налаштування тегованого кешування для високої продуктивності.
- Реалізація всіх необхідних функцій: кілька списків, синхронізація гостей, публічні списки, сповіщення.
- Тестування на навантаження та сумісність.
- Передача повної документації та вихідних кодів.
- Навчання адміністраторів роботі з модулем.
- Підтримка протягом місяця після здачі.
Зв'яжіться з нами, щоб обговорити деталі. Отримайте консультацію та попередню оцінку термінів.
Терміни розробки
| Масштаб | Склад | Термін |
|---|---|---|
| Базовий | Один список, зберігання в БД, AJAX-кнопка, лічильник у шапці | 4–5 днів |
| Стандартний | + Злиття гість/користувач, сторінка обраного в ОК, кілька списків | 7–10 днів |
| Розширений | + Публічні списки, сповіщення про зниження ціни, експорт списку | 12–15 днів |
Вартість розраховується індивідуально залежно від обсягу робіт та складності інтеграції.







