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

Наша компанія займається розробкою, підтримкою та обслуговуванням рішень на Бітрікс та Бітрікс24 будь-якої складності. Від простих односторінкових сайтів до складних інтернет-магазинів, CRM систем з інтеграцією 1С та телефонії. Досвід розробників підтверджено сертифікатами від вендора.
Пропоновані послуги
Показано 1 з 1 послугУсі 1626 послуг
Розробка пошуку з автодоповненням на Vue.js для 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

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

Вбудований пошук Бітрікс (bitrix:search.title) не підтримує автодоповнення з коробки. Є сторонні рішення для повнотекстового пошуку (Sphinx, Elasticsearch), але для більшості інтернет-магазинів задача вирішується Vue-компонентом з debounced-запитами до Бітрікс API пошуку.

API пошуку в Бітрікс

Модуль search Бітрікс використовує таблицю b_search_content (повнотекстовий індекс MySQL) або FULLTEXT-індекси. Для автодоповнення потрібен швидкий endpoint:

class SearchController extends \Bitrix\Main\Engine\Controller
{
    public function suggestAction(string $query, int $limit = 8): array
    {
        if (mb_strlen($query) < 2) return ['items' => []];

        // Пошук через CSearch::Search або прямий запит до b_search_content
        $results = \CSearch::Search([
            'QUERY'    => $query . '*', // Префіксний пошук
            'SITE_ID'  => SITE_ID,
            'MODULE'   => 'iblock',
            'PARAM2'   => $iblockId,
        ]);

        $items = [];
        while ($item = $results->Fetch()) {
            $items[] = [
                'title' => $item['TITLE'],
                'url'   => $item['URL'],
                'image' => $item['PARAM1'], // Якщо налаштовано
            ];
            if (count($items) >= $limit) break;
        }
        return ['items' => $items];
    }
}

Компонент SearchAutocomplete

<script setup>
import { ref, watch } from 'vue';
import { useDebounceFn } from '@vueuse/core';

const query = ref('');
const suggestions = ref([]);
const isOpen = ref(false);

const fetchSuggestions = useDebounceFn(async (q) => {
    if (q.length < 2) { suggestions.value = []; return; }
    const { data } = await api.get('/search/suggest', { params: { query: q } });
    suggestions.value = data.items;
    isOpen.value = data.items.length > 0;
}, 300);

watch(query, fetchSuggestions);
</script>

UX-деталі, які важливі

Клавіатурна навігація — стрілки вгору/вниз по списку, Enter для переходу, Escape для закриття. Реалізується через keydown-обробники та activeIndex ref.

Підсвічування збігів — у назвах товарів виділяємо частину, що збігається із запитом:

function highlight(text, query) {
    const regex = new RegExp(`(${escapeRegex(query)})`, 'gi');
    return text.replace(regex, '<mark>$1</mark>');
}

Групування результатів — показуємо окремо: товари, категорії, статті блогу. Три паралельні запити або один endpoint, що повертає згрупований JSON.

Історія пошуку — останні 5 запитів з localStorage. Показуємо при фокусі на порожньому полі.

Інтеграція з Elasticsearch / MeiliSearch

Якщо каталог великий (100 000+ позицій) і Бітрікс-пошук повільний — автодоповнення звертається до зовнішнього пошукового рушія:

  • MeiliSearch — проста установка, швидкий, опенсорс
  • Elasticsearch — потужніший, складніший, підходить для ентерпрайзу

Індексація товарів Бітрікс у MeiliSearch — через агент, який при зміні b_iblock_element синхронізує дані.

Приклад із практики

Аптечна мережа: пошук за МНН, торговими назвами і виробниками — 15 000 позицій. Бітрікс-пошук давав нерелевантні результати (не враховував синоніми та помилки). Рішення: MeiliSearch з налаштованими синонімами (наприклад, «аспірин» → «ацетилсаліцилова кислота»), Vue-компонент з debounce 250 мс. Час відповіді автодоповнення — 30–80 мс. Вбудований Бітрікс-пошук залишено для сторінки повних результатів.

Терміни виконання

Варіант Термін
Автодоповнення на Бітрікс-пошуку від 3 до 5 робочих днів
З групуванням результатів і підсвічуванням від 5 до 8 робочих днів
З інтеграцією MeiliSearch/Elasticsearch від 8 до 15 робочих днів