Битрикс-проект с каталогом на 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 сократит ваши издержки на поддержку фронтенда.







