Розробка модуля порівняння товарів 1С-Бітрікс

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка модуля порівняння товарів 1С-Бітрікс
Середня
~1-2 тижні
Часті питання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_website-b2b-advance_0.png
    Розробка сайту компанії B2B ADVANCE
    1262
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Розробка веб-сайту для компанії ФІКСПЕР
    851
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Розробка на базі Бітрікс, Бітрікс24, 1С для компанії Development of an Online
    585
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    751
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    657
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    989

Розробка модуля порівняння товарів для 1С-Бітрікс

У стандартній поставці Бітрікс є компонент bitrix:catalog.compare і вбудована сесійна корзина порівняння. На несклідних проектах цього досить. Але щойно з'являються вимоги — зберігати список між сесіями, порівнювати товари з різних категорій, виділяти відмінні характеристики, експортувати таблицю — стандартний компонент упирається в потолок. Власний модуль вирішує ці завдання без костилів.

Як працює вбудоване порівняння і де воно ламається

Вбудований механізм зберігає список у $_SESSION['CATALOG_COMPARE'] і в куці catalog_compare_items. При додаванні товара AJAX-метод компонента пише в сесію. Проблеми:

  • Сесія живе до закриття браузера або таймауту — користувач повернувся на другий день і список порожній.
  • Немає розділення за категоріями — можна додати в порівняння телевізор і сапоги, і компонент намагатиметься їх порівнювати.
  • Характеристики виводяться все підряд без виділення відмінностей.
  • Немає підтримки авторизованих користувачів: одна людина на двох пристроях — два різні списки.

Архітектура модуля

Модуль реєструється в системі через local/modules/vendor.compare/ зі стандартним include.php і install/index.php. Зберігання списків:

Таблиця b_compare_list:

Поле Тип Назначення
ID int auto_increment Первинний ключ
USER_ID int ID авторизованого користувача, NULL для гостей
SESSION_ID varchar(64) Хеш сесії для гостей
CREATED_AT datetime Дата створення
UPDATED_AT datetime Дата останньої зміни

Таблиця b_compare_item:

Поле Тип Назначення
ID int auto_increment
LIST_ID int FK на b_compare_list
PRODUCT_ID int ID товарного пропозиції
SECTION_ID int ID розділу каталогу
ADDED_AT datetime Коли додано

ORM-класи наслідуються від \Bitrix\Main\ORM\Data\DataManager. Обмеження на кількість товарів в одному списку встановлюється через параметри модуля (таблиця b_option, простір імен модуля).

Логіка слияння при авторизації

Коли гість авторизується, його анонімний список потрібно сліяти з постійним:

public static function mergeOnLogin(int $userId, string $sessionId): void
{
    $guestList = CompareListTable::getRow([
        'filter' => ['=SESSION_ID' => $sessionId, '=USER_ID' => false],
    ]);

    if (!$guestList) {
        return;
    }

    $userList = CompareListTable::getOrCreate($userId);

    $guestItems = CompareItemTable::getList([
        'filter' => ['=LIST_ID' => $guestList['ID']],
    ]);

    foreach ($guestItems as $item) {
        CompareItemTable::addIfNotExists($userList['ID'], $item['PRODUCT_ID']);
    }

    CompareListTable::delete($guestList['ID']);
}

Подія OnAfterUserLogin з модуля main — місце для виклику цього методу.

Виділення відмінних характеристик

Це те, що покупець чекає від порівняння: рядки, в яких товари відрізняються, повинні бути візуально виділені. Алгоритм:

  1. Отримуємо властивості всіх товарів у порівнянні через CIBlockElement::GetList() з SELECT = ['PROPERTY_*'].
  2. Будуємо матрицю: ключ — символьний код властивості, значення — масив значень для кожного товара.
  3. Для кожного рядка матриці перевіряємо count(array_unique($values)) > 1 — якщо більше одного унікального значення, позначаємо як «відмінний».
  4. На фронті до рядків з відмінностями додаємо CSS-клас compare-row--diff.

Додатково фільтруємо рядки, де всі значення порожні — їх незачем показувати.

Фронтенд: AJAX і стан

Кнопка «Додати до порівняння» на карточці товара відправляє POST на компонент через bitrix:main.ajax. Стан іконки (додано / не додано) синхронізується через localStorage при завантаженні сторінки і оновлюється після кожного AJAX-відповіді.

Лічильник кількості товарів у порівнянні виводиться в шапці через окремий компонент, який читає кількість з сесії або API модуля без повного завантаження даних.

Експорт таблиці порівняння

На великих проектах просять експорт у PDF або Excel. Для PDF використовуємо mPDF або TCPDF (підключається як залежність через composer у local/). Для Excel — PhpSpreadsheet. Таблиця порівняння формується з тієї ж матриці властивостей і відображається у файл за запитом користувача.

Терміни розробки

Масштаб Склад Тривалість
Базовий Зберігання в БД, AJAX-додавання/видалення, таблиця порівняння 4–6 днів
Стандартний + Слияння при авторизації, виділення відмінностей, лічильник в шапці 8–10 днів
Розширений + Експорт PDF/Excel, порівняння між категоріями, параметри модуля в админці 12–16 днів