Розробка фронтенду на TypeScript для 1С-Бітрікс

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

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

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

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1357
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    943
  • 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
    693
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Розробка на базі 1С Підприємство для компанії МИРСАНБЕЛ
    829
  • image_crm_dolbimby_434_0.webp
    Розробка сайту на CRM Бітрікс24 для компанії DOLBIMBY
    731
  • image_crm_technotorgcomplex_453_0.webp
    Розробка на базі Бітрікс24 для компанії ТЕХНОТОРГКОМПЛЕКС
    1074

Бітрікс-проєкт із каталогом на 50 000 товарів — це постійна боротьба з невідповідністю типів. Під час передачі даних з PHP у JavaScript часто випливають баги: undefined is not an object, неправильні типи цін, злетілі фільтри. Ми регулярно стикалися з цим на проєктах будь-якої складності. TypeScript закриває цю проблему: статична типізація ловить помилки на етапі компіляції, а не в браузері користувача. Досвід нашої команди — 8 років у Бітрікс та понад 50 реалізованих проєктів з TypeScript-архітектурою. Результат: зниження вартості багфіксу на 30–50% і скорочення часу на налагодження інтеграцій. На одному проєкті економія на багфіксах склала суттєву суму за перший рік після міграції.

Чому TypeScript, а не ванільний JavaScript для Бітрікс?

Згідно з TypeScript Handbook (на Wikipedia), статична типізація запобігає до 15% помилок на етапі компіляції. У контексті Бітрікс це критично: невірний тип ціни або ID товару може призвести до падіння кошика. На одному з проєктів із каталогом на 100 000 товарів ми повністю усунули баги фільтрації після переходу на строгу типізацію. TypeScript-фронтенд у 2–3 рази надійніший за аналогічне рішення на чистому JS: помилки типів, некоректна передача даних між PHP та JS, проблеми з кешуванням — все це виявляється до викладки в продакшн.

Як відбувається інтеграція TypeScript із PHP-компонентами?

Ми використовуємо покроковий підхід, щоб мінімізувати простої:

  • Аудит поточного JS-коду: виявляємо невідповідності типів, глобальні змінні, слабкі місця.
  • Проєктування типів для всіх точок інтеграції з PHP (інфоблоки, REST, компоненти).
  • Налаштування збірника Vite або Webpack з підтримкою TypeScript.
  • Розробка компонентів з повною типізацією — каталог, кошик, фільтр.
  • Тестування та деплой з гарантією стабільності.

Архітектура TypeScript у шаблоні Бітрікс

Два основні підходи, які ми застосовуємо:

Підхід Опис Коли вибирати
MPA з TypeScript-модулями Класична генерація сторінок на PHP, JavaScript — острівці інтерактивності. Кожен компонент — ізольований модуль із власними типами. Проєкти середнього розміру, де SEO та швидкість першого завантаження критичні.
SPA/Headless React або Vue на TypeScript повністю керують UI, Бітрікс виступає як API (REST/GraphQL). Складні користувацькі інтерфейси: кабінет клієнта, CRM-віджети, багатокрокові форми.

Більшість наших проєктів використовують перший підхід з елементами другого в найбільш інтерактивних частинах (каталог, кошик, особистий кабінет).

Приклад структури компонентів
/local/templates/my_site/
├── src/
│   ├── components/
│   │   ├── catalog/
│   │   │   ├── CatalogFilter.ts
│   │   │   ├── ProductCard.ts
│   │   │   └── CartButton.ts
│   │   ├── cart/
│   │   │   ├── CartDrawer.ts
│   │   │   └── CartCounter.ts
│   │   └── common/
│   │       ├── Modal.ts
│   │       └── Tooltip.ts
│   ├── api/
│   │   ├── catalog.ts
│   │   ├── cart.ts
│   │   └── user.ts
│   ├── types/
│   │   ├── bitrix.d.ts
│   │   └── api.ts
│   ├── utils/
│   │   ├── http.ts
│   │   └── format.ts
│   └── main.ts
├── dist/
├── package.json
├── tsconfig.json
└── vite.config.ts

Компонент кошика на TypeScript

Приклад типізованого компонента додавання в кошик:

// api/cart.ts
interface CartItem {
    id:       number;
    name:     string;
    price:    number;
    quantity: number;
    img:      string | null;
}

interface CartState {
    items:      CartItem[];
    totalPrice: number;
    totalCount: number;
    currency:   string;
}

interface AddToCartPayload {
    productId: number;
    quantity:  number;
    properties?: Record<string, string>;
}

export async function addToCart(payload: AddToCartPayload): Promise<CartState> {
    const formData = new FormData();
    formData.append('sessid',     BX.bitrix_sessid());
    formData.append('action',     'addItem');
    formData.append('product_id', String(payload.productId));
    formData.append('quantity',   String(payload.quantity));

    if (payload.properties) {
        Object.entries(payload.properties).forEach(([k, v]) => {
            formData.append(`props[${k}]`, v);
        });
    }

    const res = await fetch('/local/ajax/cart.php', {
        method: 'POST',
        body:   formData,
    });

    if (!res.ok) throw new Error(`Cart error: ${res.status}`);

    const json = await res.json();
    if (json.status !== 'success') throw new Error(json.error ?? 'Cart error');

    return json.cart as CartState;
}

Інтеграція з PHP-компонентами через data-атрибути

Передача даних із шаблону в TypeScript без глобальних змінних:

// template.php компонента каталогу
<div
    id="catalog-app"
    data-section-id="<?= (int)$arResult['SECTION']['ID'] ?>"
    data-iblock-id="<?= (int)$arParams['IBLOCK_ID'] ?>"
    data-initial-filter='<?= htmlspecialchars(
        json_encode($arResult['FILTER_PARAMS']), ENT_QUOTES
    ) ?>'
>
    <?php // SSR-верстка для першого завантаження ?>
</div>
// TypeScript читає дані типізовано
const appEl = document.getElementById('catalog-app');
if (!appEl) throw new Error('#catalog-app not found');

const sectionId  = Number(appEl.dataset['sectionId']);
const iblockId   = Number(appEl.dataset['iblockId']);
const rawFilter  = appEl.dataset['initialFilter'] ?? '{}';
const initFilter = JSON.parse(rawFilter) as FilterState;

Як Vite пришвидшує збірку TypeScript-фронтенду?

Для багатомодульних проєктів використовуємо Vite — він дає швидку збірку та розділення точок входу.

// vite.config.ts
import { defineConfig } from 'vite';

export default defineConfig({
    root:  'src',
    build: {
        outDir:          '../dist',
        emptyOutDir:     true,
        rollupOptions: {
            input: {
                main:    'src/main.ts',
                catalog: 'src/pages/catalog.ts',
                cart:    'src/pages/cart.ts',
            },
        },
    },
    resolve: {
        alias: { '@': '/src' },
    },
});

Окремі entrypoint для кожного розділу сайту — лише потрібний JavaScript завантажується на сторінці, що покращує швидкість завантаження.

Реальний кейс: каталог на 100 000 товарів

Наш клієнт — інтернет-магазин з каталогом на 100 000 позицій. Продукт: динамічні фільтри, кошик з безліччю опцій, інтеграція з 1С через CommerceML. Вихідний код на ванільному JS страждав від помилок типів при обміні з 1С. Ми провели аудит, спроєктували типи для всіх сутностей і мігрували фронтенд на TypeScript за три тижні. Результат: кількість помилок у кошику знизилася на 60%, час завантаження фільтрів — на 30%. Клієнт отримав гарантію стабільності на наступні два роки, а економія на багфіксах склала значну суму за перший рік.

Що входить у нашу роботу з розробки TypeScript-фронтенду

  • Аудит поточної архітектури: виявлення проблем у JS-коді, оцінка обсягу міграції.
  • Налаштування TypeScript + збірник (Vite/Webpack) з урахуванням оточення Бітрікс.
  • Створення типів для всіх точок інтеграції з PHP (інфоблоки, REST, компоненти).
  • Розробка нових компонентів (каталог, кошик, фільтр, особистий кабінет) з повною типізацією.
  • Міграція існуючого коду з ванільного JS на TypeScript зі збереженням функціональності.
  • Документація з архітектури та опис типів.
  • Тестування та налагодження в продакшні з гарантією стабільності.

Орієнтовні терміни

Етап Терміни
Аудит та проєктування архітектури 1–2 дні
Налаштування інфраструктури TypeScript + Vite 1 день
Розробка компонентів каталогу (фільтр, список, картка) 3–5 днів
Розробка кошика та міні-кошика в шапці 2–3 дні
Міграція існуючого JS-коду (залежить від обсягу) 2–5 днів
Тестування та деплой 1–2 дні

Точні терміни та вартість розраховуються індивідуально після знайомства з проєктом. Замовте аудит вашого проєкту — ми проаналізуємо ваш код і запропонуємо оптимальне рішення. Отримайте консультацію, щоб зрозуміти, як TypeScript скоротить ваші витрати на підтримку фронтенду.

Чому верстка сайтів на 1С-Бітрікс вимагає професіоналізму?

Відкриваєте template.php у попереднього підрядника — а там SQL-запити, бізнес-логіка та inline-стилі в одному файлі. На кожному другому проєкті, який ми беремо на підтримку, код шаблонів виглядає як звалище: кеш не працює, додати нову фічу — переписуй все. Виправлення такої верстки може коштувати чимало, а втрачений виторг через зламаний кошик у пік сезону може сягати десятків тисяч гривень.

Ми — команда сертифікованих розробників 1С-Бітрікс із десятирічним досвідом. За нашими плечима понад 50 успішних проектів верстки та підтримки. Наш підхід строго розділяє: логіка — в result_modifier.php або component_epilog.php, представлення — в template.php. Жодного CIBlockElement::GetList в шаблоні. Це скорочує час правок на 30–40% та виключає типові помилки, які ламають кеш. Подібну проблему виправляли клієнту з інтернет-магазину — він місяць не міг оновити блок «Акції». Після налаштування тегованого кеша правки вставали за хвилину, а не за день.

Отримайте безкоштовний аудит вашого проекту — зв'яжіться з нами.

Як правильно організувати шаблони компонентів?

Кастомний шаблон — це не один файл, а структура з п’яти-шести файлів:

  • template.php — тільки HTML та виведення $arResult
  • result_modifier.php — підготовка даних, додаткові вибірки
  • component_epilog.php — код після кешування (лічильники, динаміка)
  • style.css та script.js — підключаються через Asset::getInstance()->addCss() та addJs() (не через <link> — інакше ламається об'єднання)
  • .parameters.php — параметри візуального редактора

Приклад структури для каталогу:

local/templates/your_template/components/bitrix/catalog.section/.default/
├── template.php
├── result_modifier.php
├── component_epilog.php
├── style.css
├── script.js
└── .parameters.php

Типові шаблони, які верстаємо під ключ:

Компонент Що робимо
catalog.section та catalog.element Перемикання вигляду (плитка/список/таблиця), lazy load для зображень, srcset для ретини
sale.basket.basket AJAX-оновлення без перезавантаження, міні-кошик через sale.basket.basket.line
menu Мегаменю з кешуванням за розділами, відкладене завантаження підменю
search.title Автопідказки з дебаунсом 300 мс, прев'ю товарів у дропдауні
breadcrumb Мікророзмітка BreadcrumbList за Schema.org

Кешування: чому воно ламається і як лагодимо?

Компонентне кешування в Бітрікс ламається однією помилкою: вивели ім'я користувача всередині кешованого каталогу — всі бачать одне ім'я. Рішення — component_epilog.php для динамічних вставок.

Tagged cache ($this->setResultCacheKeys, CIBlock::clearIblockTagCache) налаштовуємо обов'язково. Змінили товар — очищується кеш лише цього товару, а не всього розділу. На проєкті з 50 000 товарів це дає приріст швидкості на 40% — в 1.4 раза швидше порівняно з повним скиданням.

Реальний кейс. Наш клієнт скаржився — на сторінці каталогу у всіх один кошик. Виявилося, попередній розробник вивів $_SESSION['BASKET'] всередині template.php компонента catalog.section. Компонент кешувався на годину — кошик застиг. Перенесли виведення в component_epilog.php, налаштували тегований кеш на sale.basket.basket.line. Сторінка не втратила у швидкості, кошик став актуальним. Збитки від несправного кошика в пік сезону могли бути значними, а вартість виправлення — помірною.

CSS-підходи: BEM, Tailwind або гібрид?

Для великих проєктів (30+ шаблонів) використовуємо BEM.product-card__price, .product-card--featured. Стилі ізольовані, конфліктів немає. У Бітрікс обгортки з класами bx-component не чіпаємо — обгортаємо свій BEM-блок всередині.

Для типових завдань (лендінги, адмінки) беремо Tailwind 3+ з PurgeCSS — підсумковий CSS 10–30 КБ замість сотень. Дизайн-токени в tailwind.config.js фіксують кольори, шрифти, відступи в одному місці.

На більшості проєктів застосовуємо гібрид: BEM для структурних компонентів (каталог, картка, чекаут), Tailwind для утилітарних речей (відступи, flex-розкладки). Межу обговорюємо з командою заздалегідь.

Як досягти Core Web Vitals при верстці сайтів на Бітрікс?

Critical CSS — виділяємо стилі першого екрану через пакет critical, інлайнимо в <head>. Решта завантажується асинхронно через media="print" onload="this.media='all'". LCP на мобільних скорочується на 1–1.5 секунди.

Зображення — головне гальмо. Використовуємо <picture> з WebP та JPEG-фолбеком. loading="lazy" для всього нижче першого екрану. width та height явно прописані — CLS = 0. Обробник в urlrewrite.php генерує WebP на льоту.

Мініфікація та стиснення. CSS та JS через Vite або вбудоване об'єднання Бітрікс. Brotli на nginx (brotli_comp_level 6) — на 15–20% ефективніше за gzip. Кешування статики: expires 1y + версіонування через query string.

Ми готові зробити аудит вашого проєкту та запропонувати конкретні кроки. Закажіть консультацію.

Що входить в послугу верстки сайтів на 1С-Бітрікс?

Після замовлення верстки шаблону або адаптації готового рішення передаємо:

  • Вихідні коди шаблонів компонентів з розділенням на template.php, result_modifier.php, epilog
  • CSS та JS, підключені через Asset — без інлайн-стилів
  • Налаштоване кешування з тегами
  • Документацію за структурою та параметрами
  • Доступ до Git-репозиторію з історією змін
  • Навчання вашого розробника: як правити шаблон без втрати оновлюваності

Гарантуємо відповідність Core Web Vitals та кросбраузерність. Закріплюємо інженера з досвідом 10+ років.

Типові помилки при верстці, які ми виправляємо - Inline-стилі в шаблонах — ламають кешування та об'єднання CSS. - Відсутність `component_epilog.php` — динамічний контент застигає. - Неправильне підключення скриптів через `