Разработка на TypeScript для проекта 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Разработка на TypeScript для проекта 1С-Битрикс
Средняя
~1-2 недели
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1175
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • 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 Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Разработка на TypeScript для проекта 1С-Битрикс

PHP-шаблоны Битрикс генерируют HTML, а фронтенд-код на «голом» JavaScript в template.php или script.js компонента остаётся без типов, без автодополнения, без защиты от ошибок по типу «undefined is not a function» в продакшене. TypeScript — прагматичный выбор для любого Битрикс-проекта, где JS-кода больше нескольких сотен строк.

Разработка на TypeScript для проекта 1С-Битрикс

Где живёт TypeScript в Битрикс-проекте

Два типичных сценария: TypeScript в шаблоне сайта и TypeScript в D7-модуле.

В шаблоне сайта:

/local/templates/my_site/
    src/
        ts/
            catalog.ts
            cart.ts
            search.ts
        scss/
            ...
    dist/        <- скомпилированный JS
    package.json
    tsconfig.json
    vite.config.ts

В модуле:

/local/modules/mymodule/
    install/
        js/
            src/         <- TypeScript-исходники
                index.ts
            dist/        <- скомпилированный JS
    package.json
    tsconfig.json

tsconfig.json для Битрикс-окружения

{
    "compilerOptions": {
        "target": "ES2020",
        "module": "ESNext",
        "moduleResolution": "bundler",
        "strict": true,
        "noUncheckedIndexedAccess": true,
        "lib": ["ES2020", "DOM"],
        "outDir": "./dist",
        "sourceMap": true,
        "paths": {
            "@/*": ["./src/*"]
        }
    },
    "include": ["src/**/*.ts"],
    "exclude": ["node_modules", "dist"]
}

noUncheckedIndexedAccess: true — строгая проверка обращения к массивам по индексу. Важно для работы с результатами API Битрикс, где поле может отсутствовать.

Типизация данных Битрикс

Первое, что нужно сделать — описать типы данных, которые приходят с PHP-бэкенда. Битрикс передаёт данные через JSON в data-атрибутах или AJAX:

// types/bitrix.ts

export interface BitrixProduct {
    ID: string;
    NAME: string;
    DETAIL_PAGE_URL: string;
    PREVIEW_PICTURE: string | null;
    CATALOG_PRICE_1: string | null;
    CATALOG_CURRENCY_1: string;
    PROPERTY_BRAND_VALUE: string | null;
    PROPERTY_ARTICLE_VALUE: string | null;
}

export interface BitrixCatalogResult {
    ITEMS: BitrixProduct[];
    TOTAL_ITEMS_COUNT: number;
    PAGES_COUNT: number;
    CURRENT_PAGE: number;
}

export interface BitrixAjaxResponse<T = unknown> {
    status: 'success' | 'error';
    data: T;
    errors?: BitrixError[];
}

export interface BitrixError {
    code: string;
    message: string;
    customData?: string;
}

Битрикс возвращает числовые ID как строки — "ID": "42", не "ID": 42. Это нужно учитывать в типах.

Работа с AJAX-ответами Битрикс

// api/catalog.ts
import type { BitrixAjaxResponse, BitrixCatalogResult } from '@/types/bitrix';

export async function fetchCatalogItems(
    sectionId: number,
    page: number,
    filter: Record<string, string[]>
): Promise<BitrixCatalogResult> {
    const params = new URLSearchParams({
        SECTION_ID: String(sectionId),
        PAGE_NUM:   String(page),
        sessid:     BX.bitrix_sessid(), // CSRF-токен Битрикс
        action:     'getCatalogItems',
    });

    Object.entries(filter).forEach(([key, values]) => {
        values.forEach(val => params.append(`filter[${key}][]`, val));
    });

    const response = await fetch('/local/ajax/catalog.php', {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body:    params.toString(),
    });

    if (!response.ok) {
        throw new Error(`HTTP ${response.status}`);
    }

    const json: BitrixAjaxResponse<BitrixCatalogResult> = await response.json();

    if (json.status !== 'success') {
        throw new Error(json.errors?.[0]?.message ?? 'Unknown error');
    }

    return json.data;
}

BX.bitrix_sessid() — метод ядра Битрикс. Чтобы TypeScript знал о глобальном объекте BX:

// types/globals.d.ts
declare global {
    const BX: {
        bitrix_sessid(): string;
        message(params: Record<string, string>): void;
        bind(el: Element, event: string, fn: (e: Event) => void): void;
        // ... остальные методы по необходимости
    };
}
export {};

Работа с DOM в шаблонах компонентов

// Типизированная работа с data-атрибутами
const catalogEl = document.getElementById('catalog-container');
if (!catalogEl) throw new Error('catalog-container not found');

const rawData = catalogEl.dataset['initialData'];
if (!rawData) throw new Error('No initial data');

// Валидация через Zod или ручная проверка типов
const initialData: BitrixCatalogResult = JSON.parse(rawData);

Сборка и подключение в шаблоне

Vite собирает TypeScript в /dist/:

// В header.php шаблона
$assetManager = \Bitrix\Main\Page\Asset::getInstance();
$assetManager->addJs(SITE_TEMPLATE_PATH . '/dist/catalog.js');

При разработке — vite dev с HMR, в продакшне — vite build и /dist/ коммитится в репозиторий (или собирается в CI).

Сроки

Задача Сроки
Настройка tsconfig + Vite для шаблона сайта 4–8 часов
Типизация существующего JS-кода (≤500 строк) 1–2 дня
Разработка новой функциональности сразу на TypeScript от 1 дня