Єдине сховище даних для Vue-компонентів на сторінках 1С-Бітрікс

Коли на сторінці 1С-Бітрікс кілька Vue-компонентів працюють зі спільними даними, без єдиного сховища кожен з них робить окремі запити, а стан кошика чи фільтрів розсинхронізовується. Ми налаштовуємо Pinia для управління станом у Бітріксі, забезпечуючи узгодженість даних і скорочуючи зайві звернення до сервера. Наша команда реалізує проєкт під ключ — від аудиту архітектури до впровадження та подальшої підтримки.

Єдине сховище даних для Vue-компонентів на сторінках 1С-Бітрікс

Розробка на Vue.jsПростий~1 день
Часті запитання

Єдине сховище даних для Vue-компонентів на сторінках 1С-Бітрікс

Коли на бітріксовій сторінці працюють два і більше Vue-компоненти, які повинні бачити спільні дані — стан кошика, поточний користувач, фільтри каталогу — потрібен єдиний стор?

Без нього кожен компонент робить окремий AJAX-запит до того самого ендпоінта. При 5+ компонентах кількість запитів зростає в геометричній прогресії: для типового каталогу з 10 000 товарів кожен компонент робить по 3 запити, разом 15 запитів тільки на завантаження. Дані розсинхронізуються, додавання товару до кошика в одному компоненті не оновлює лічильник у хедері. Такі проблеми швидко накопичуються. Ми займаємося цим більше 5 років — понад 60 проектів на Бітріксі. Вирішуємо грамотною архітектурою стору. Використовуємо PHP 8.1+, інфоблоки v2.0, ORM та сучасний frontend на Vue 3 з Pinia. Отримайте консультацію з архітектури стору для вашого проекту.

Чому Pinia — вибір для нових проектів на Vue 3?

Для нових проектів на Vue 3 — Pinia. Vuex 4 підтримується, але офіційно замінений Pinia. Ключові відмінності в контексті Бітрікса:

Критерій Pinia Vuex
Мутації Не потрібні — пряма зміна state Обов'язкові через mutations
TypeScript Відмінна підтримка, типи виводяться Потрібна ручна типізація
DevTools З коробки, повна інтеграція Через плагін, гірше працює з Vue 3
Бойлерплейт Мінімум: defineStore + actions Більше коду: state, getters, mutations, actions
Розмір ~1 KB ~9 KB
Підтримка Composition API Так Обмежена
Підтримка SSR Так Так, але складніше

Pinia швидше за Vuex у 9 разів за розміром бандла (1 KB vs 9 KB), що прискорює початкове завантаження сторінки. Vuex виправданий, якщо проект вже на Vue 2 з Vuex 3, або якщо команда добре знає Vuex і міграція недоцільна. В інших випадках Pinia знижує час розробки на 20-30%. Офіційна документація Vuex підтверджує, що Pinia — рекомендоване рішення для нових проектів.

Як ініціалізувати Pinia для кількох Vue-додатків на одній сторінці?

Коли кілька Vue-додатків монтуються на різні елементи сторінки (кошик у хедері та блок товару внизу — різні createApp()), вони не розділяють стор автоматично?

Рішення — singleton через window:

// store/index.js
import { createPinia } from 'pinia';
const pinia = window.__pinia || (window.__pinia = createPinia());
export default pinia;

// В кожному app.js
import pinia from './store/index.js';
const app = createApp(Component);
app.use(pinia);
app.mount('#mount-point');

Обидва Vue-додатки використовують один і той самий екземпляр Pinia — стан кошика синхронний. Гарантуємо, що цей підхід працює навіть при 10+ одночасних компонентах на сторінці.

Реалізація стору кошика

// stores/cart.js
import { defineStore } from 'pinia';

export const useCartStore = defineStore('cart', {
  state: () => ({
    items: [],
    loading: false,
    initialized: false,
  }),
  getters: {
    totalCount: (state) => state.items.reduce((sum, i) => sum + i.quantity, 0),
    totalPrice: (state) => state.items.reduce((sum, i) => sum + i.price * i.quantity, 0),
  },
  actions: {
    async init() {
      if (this.initialized) return;
      this.loading = true;
      const res = await fetch('/api/v1/cart/');
      this.items = await res.json();
      this.initialized = true;
      this.loading = false;
    },
    async addItem(productId, quantity = 1) {
      const res = await fetch('/api/v1/cart/add/', {
        method: 'POST',
        headers: {
          'X-Bitrix-Csrf-Token': window.BX_STATE.csrf
        },
        body: JSON.stringify({ productId, quantity }),
      });
      const updated = await res.json();
      this.items = updated.items;
    },
  },
});
Докладніше про CSRF-токен Кастомний контролер на стороні Бітрікса звертається до `\Bitrix\Sale\Basket::loadItemsForFUser()` і повертає JSON. CSRF-токен (`bitrix_sessid()`) передається з PHP у `window.BX_STATE.csrf`. Докладніше про CSRF в офіційній документації.

Стор користувача з даними з PHP

export const useUserStore = defineStore('user', {
  state: () => ({
    id: window.BX_STATE?.userId || null,
    groups: window.BX_STATE?.userGroups || [],
    priceTypeId: window.BX_STATE?.priceTypeId || 1,
  }),
  getters: {
    isAuthorized: (state) => !!state.id,
    isWholesale: (state) => state.groups.includes(WHOLESALE_GROUP_ID),
  },
});

Дані користувача ініціалізуються з window.BX_STATE, який формується в PHP один раз при завантаженні сторінки. Жодних AJAX-запитів для отримання базової інформації про користувача — це прискорює завантаження на 100-200 мс.

Персистентність стану

Для даних, які потрібно зберігати між сторінками (наприклад, вибрані фільтри каталогу), використовуємо pinia-plugin-persistedstate:

pinia.use(piniaPluginPersistedstate);

export const useFiltersStore = defineStore('filters', {
  state: () => ({
    selectedBrands: [],
    priceRange: [0, 100000]
  }),
  persist: {
    storage: sessionStorage
  },
});

sessionStorage краще за localStorage для фільтрів — дані скидаються при закритті вкладки, не накопичуються застарілі значення. При роботі з каталогами в 5000+ товарів це критично.

Девтулзи та налагодження

Для налагодження Pinia стору використовуйте Vue DevTools — розширення браузера, яке показує стан усіх сторів у реальному часі. На production-збірці DevTools автоматично вимикаються. Також можна логувати мутації через $subscribe — це допомагає в складних сценаріях оновлення. Wikipedia детально описує можливості Vue DevTools для налагодження сторів.

Сценарії використання стору в інтернет-магазині

Сценарій Без стору Зі стором
Завантаження кошика 3-5 запитів на сторінку 1 запит, кешування
Оновлення лічильника Потрібна ручна подія Автоматичне через гетери
Фільтрація каталогу Перезавантаження сторінки Миттєвий відгук
Дані користувача AJAX на кожен компонент Один раз з PHP

Що входить у налаштування стору

Ми пропонуємо повний цикл робіт:

  • Аналіз поточної архітектури та виявлення вузьких місць
  • Проектування структури сторів (кошик, користувач, фільтри, сповіщення)
  • Реалізація singleton для кількох Vue-додатків
  • Інтеграція з PHP-контролерами Бітрікса (Basket API, дані користувача)
  • Налаштування персистентності для фільтрів та обраного
  • Покриття коду типами (TypeScript) для надійності
  • Тестування на реальних сценаріях (додавання до кошика, зміна користувача)
  • Документація з API сторів та передача доступів

Вартість і терміни

Типовий термін налаштування: для проекту без існуючого стору, з 2-3 компонентами, яким потрібні спільні дані (кошик, авторизація, сповіщення) — 1-2 робочі дні, включаючи налаштування персистентності та інтеграцію з PHP-контролерами Бітрікса. Вартість налаштування розраховується індивідуально залежно від складності. Більш складні сценарії (каталог з фільтрацією, багаторівневі права доступу) потребують індивідуальної оцінки.

Замовте налаштування стору — отримайте консультацію з архітектури для вашого проекту. Залиште заявку, і ми підберемо стек та налаштуємо єдиний стор за 1-2 дні. Досвід понад 5 років, гарантія на всі роботи. Зв'яжіться з нами для уточнення деталей вашого проекту.

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

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

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060
  • Розробка віджета онлайн-запису для медичного центру
    Розробка віджета онлайн-запису для медичного центру
    837
  • Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    928
  • Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    865
  • Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1223