REST-приложения Битрикс24 на TypeScript под ключ

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

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

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1357
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Разработка веб-сайта для компании ФИКСПЕР
    944
  • 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
    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

Проблема: отсутствие типов в BX24 SDK

Официального TypeScript-пакета для BX24 SDK нет. Методы crm.deal.list, tasks.task.add, im.message.send работают как чёрный ящик — без подсказок IDE. Разработчик вынужден постоянно переключаться на документацию, а в рантайме ловить undefined из-за неверного поля. Мы решили эту проблему для 50+ проектов: типизируем BX24 SDK, оборачиваем callMethod и callBatch, внедряем React-виджеты. Гарантия на код — 1 год.

Типизация сокращает количество ошибок на этапе разработки вдвое по сравнению с чистым JavaScript. Один проект на TypeScript экономит до 40% времени на отладку и поддержку, что снижает затраты на поддержку до 30%. Стек: TypeScript, React, Node.js, MySQL.

Почему TypeScript для REST-приложений Битрикс24?

TypeScript устраняет главную боль: автодополнение в IDE. Больше не нужно помнить названия полей — редактор подскажет структуру BX24Deal, BX24Task или BX24CallResult. В два раза меньше ошибок на этапе разработки по сравнению с чистым JavaScript. Мы используем строгий режим с проверкой strict: true. Это даёт гарантию, что код не сломается из-за неверного типа.

Архитектура REST-приложения Битрикс24

Три типа приложений в экосистеме Битрикс24:

  • Веб-приложение (iframe) — загружается внутри интерфейса Битрикс24 в iframe. JavaScript/TypeScript с доступом к BX24.js SDK.
  • Серверное приложение — PHP/Node.js, работает независимо, обменивается с Битрикс24 через REST поверх OAuth.
  • Виджет — компактное приложение в sidebar или CRM.

TypeScript применим во всех трёх случаях, но с разными точками входа.

Тип Сложность разработки Типизация Производительность
Веб-приложение (iframe) Средняя Полная (TS в клиенте) Высокая (локальный рендеринг)
Серверное (Node.js) Высокая Полная (TS на сервере) Средняя (зависит от API)
Виджет Низкая Частичная (ограниченный SDK) Высокая

TypeScript лучше JavaScript для iframe и серверных приложений: статическая проверка типов снижает баги на 30–50%. Для виджетов типизация менее критична, но мы всё равно добавляем базовые типы.

Типизация BX24 SDK

Официального TypeScript-пакета для BX24 SDK нет. Пишем декларацию:

// types/bx24.d.ts
declare global {
    const BX24: {
        init(callback: () => void): void;
        isAdmin(): boolean;
        getAuth(): BX24Auth;
        refreshAuth(callback: (auth: BX24Auth) => void): void;
        callMethod(
            method:   string,
            params?:  Record<string, unknown>,
            callback?: (result: BX24CallResult) => void
        ): void;
        callBatch(
            calls:    Record<string, [string, Record<string, unknown>?]>,
            callback: (result: Record<string, BX24CallResult>) => void,
            bHaltOnError?: boolean
        ): void;
        resizeWindow(width: number, height: number): void;
        closeApplication(): void;
        placement: {
            info(): BX24PlacementInfo;
            call(command: string, params?: Record<string, unknown>): void;
        };
    };
}

interface BX24Auth {
    access_token:  string;
    refresh_token: string;
    expires_in:    number;
    domain:        string;
    member_id:     string;
}

interface BX24CallResult {
    status():  number;
    data():    unknown;
    error():   string | false;
    more():    boolean;
    next():    void;
    total():   number;
}

interface BX24PlacementInfo {
    placement: string;
    options:   Record<string, string>;
}

export {};

Типы для CRM-данных

// types/crm.ts

export interface BX24Deal {
    ID:                     string;
    TITLE:                  string;
    STAGE_ID:               string;
    OPPORTUNITY:            string;
    CURRENCY_ID:            string;
    ASSIGNED_BY_ID:         string;
    DATE_CREATE:            string;
    DATE_MODIFY:            string;
    CONTACT_ID:             string | null;
    COMPANY_ID:             string | null;
    COMMENTS:               string | null;
    UF_CRM_CUSTOM_FIELD?:   string;
    [key: string]: unknown;
}

export interface BX24Contact {
    ID: string;
    NAME: string;
    LAST_NAME: string;
    PHONE: Array<{ VALUE: string; VALUE_TYPE: string }>;
    EMAIL: Array<{ VALUE: string; VALUE_TYPE: string }>;
}

export interface BX24Activity {
    ID: string;
    SUBJECT: string;
    OWNER_ID: string;
    OWNER_TYPE_ID: string;
    CREATED: string;
}

export type StageId =
    | 'NEW' | 'PREPARATION' | 'PREPAYMENT_INVOICE'
    | 'EXECUTING' | 'FINAL_INVOICE' | 'WON' | 'LOSE';

export type AppType = 'iframe' | 'server' | 'widget';

Как типизировать callMethod с автоматической пагинацией?

Простая обёртка с полным контролем типов:

// api/bx24client.ts

export function callMethod<T>(
    method: string,
    params: Record<string, unknown> = {}
): Promise<T[]> {
    return new Promise((resolve, reject) => {
        const results: T[] = [];

        const handleResult = (result: ReturnType<typeof BX24.callMethod extends (...args: unknown[]) => infer R ? R : never>) => {
            if (result.error()) {
                reject(new Error(String(result.error())));
                return;
            }

            const data = result.data() as T[];
            results.push(...(Array.isArray(data) ? data : [data as T]));

            if (result.more()) {
                result.next();
            } else {
                resolve(results);
            }
        };

        BX24.callMethod(method, params, handleResult);
    });
}

// Использование
import type { BX24Deal } from '@/types/crm';

const deals = await callMethod<BX24Deal>('crm.deal.list', {
    filter: { STAGE_ID: 'NEW' },
    select: ['ID', 'TITLE', 'OPPORTUNITY', 'ASSIGNED_BY_ID'],
    order:  { DATE_CREATE: 'DESC' },
});

result.more() + result.next() — механизм пагинации BX24 SDK. Обёртка автоматически обходит все страницы и возвращает полный массив. Это снижает нагрузку на разработчика и гарантирует, что мы не пропустим данные.

Batch-запросы для производительности

Каждый callMethod — отдельный HTTP-запрос. Для приложений с высокой нагрузкой на API — используем callBatch:

export function callBatch<T extends Record<string, unknown>>(
    calls: Record<string, [string, Record<string, unknown>?]>
): Promise<T> {
    return new Promise((resolve, reject) => {
        BX24.callBatch(calls, (results) => {
            const output = {} as T;
            let hasError = false;

            for (const [key, result] of Object.entries(results)) {
                if (result.error()) {
                    hasError = true;
                    console.error(`Batch error for "${key}":`, result.error());
                } else {
                    (output as Record<string, unknown>)[key] = result.data();
                }
            }

            if (hasError) reject(new Error('Batch had errors'));
            else resolve(output);
        });
    });
}

// Загрузка сделки со связанными данными за один запрос
const data = await callBatch<{
    deal:    BX24Deal;
    contact: BX24Contact;
    history: BX24Activity[];
}>({
    deal:    ['crm.deal.get',     { id: dealId }],
    contact: ['crm.contact.get',  { id: contactId }],
    history: ['crm.activity.list', { filter: { OWNER_ID: dealId, OWNER_TYPE_ID: '2' } }],
});

Batch-запросы сокращают время загрузки интерфейса в 3–5 раз по сравнению с последовательными вызовами. На одном из проектов для ритейлера мы снизили время открытия карточки сделки с 8 до 1.5 секунд.

React + TypeScript приложение в iframe Битрикс24

// main.tsx
import React from 'react';
import { createRoot } from 'react-dom/client';
import { App } from './App';

BX24.init(() => {
    const container = document.getElementById('app');
    if (!container) return;

    const root = createRoot(container);
    root.render(<App />);

    const resizeObserver = new ResizeObserver(() => {
        BX24.resizeWindow(
            document.body.scrollWidth,
            document.body.scrollHeight
        );
    });
    resizeObserver.observe(document.body);
});

Процесс работы

  1. Аналитика — изучаем бизнес-логику, выявляем сущности CRM, определяем частоту запросов к API.
  2. Проектирование — создаём типы для BX24 SDK и всех CRM-сущностей, планируем batch-запросы.
  3. Разработка — пишем обёртки callMethod и callBatch, React-компоненты, настраиваем OAuth-авторизацию.
  4. Тестирование — проверяем типы, пагинацию, обработку ошибок, производительность batch.
  5. Деплой — размещаем приложение в Битрикс24, настраиваем права доступа, документируем API.

Что входит в работу

  • Полная типизация BX24 SDK и используемых CRM-сущностей.
  • Автоматическая пагинация обёрток callMethod.
  • Batch-оптимизация для высоконагруженных запросов.
  • React-компоненты с адаптивной вёрсткой под iframe.
  • Документация по интеграции и API.
  • Поддержка в течение 1 года.

Типичные ошибки и чек-лист

Частая ошибка: забыли обработать more() в пагинации Без автоматического обхода страниц получите только первые 50 записей. Наша обёртка решает это.
  • Неправильные типы для BX24.getAuth(): возвращаемые поля могут отсутствовать при первом вызове — используем Partial<BX24Auth>.
  • Отсутствие таймаутов для callMethod: при большом количестве запросов API может сбросить соединение — мы добавляем повторные попытки.
  • Неполные типы пользовательских полей: UF_* поля нужно описывать вручную, иначе они останутся any.

Сроки

Задача Сроки
Настройка TypeScript, типы BX24 SDK и CRM-сущностей 1–2 дня
Простое iframe-приложение (просмотр/редактирование данных CRM) 3–5 дней
Полнофункциональное React-приложение в Битрикс24 2–4 недели
Серверное Node.js/TypeScript приложение с OAuth 1–2 недели

Мы работаем с REST API Битрикс24 более 5 лет. Оценим ваш проект за 2 дня. Свяжитесь с нами — получите консультацию и коммерческое предложение без обязательств. Закажите разработку вашего REST-приложения уже сегодня.

Почему вёрстка сайтов на 1С-Битрикс требует профессионализма?

Открываете template.php у предыдущего подрядчика — а там SQL-запросы, бизнес-логика и inline-стили в одном файле. На каждом втором проекте, который берём на поддержку, код шаблонов выглядит как свалка: кэш не работает, добавить новую фичу — переписывай всё. Средняя стоимость исправления такой вёрстки сайтов — 15 000–30 000 рублей только на отладку, а потерянная выручка из-за сломанной корзины в пик сезона может уходить в миллионы. Наша команда с 10-летним опытом строго разделяет: логика — в 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% по сравнению с полным сбросом.

Реальный кейс. Клиент жаловался — на странице каталога у всех одна корзина. Оказалось, предыдущий разработчик вывел $_SESSION['BASKET'] внутри template.php компонента catalog.section. Компонент кэшировался на час — корзина застыла. Перенесли вывод в component_epilog.php, настроили тегированный кэш на sale.basket.basket.line. Страница не потеряла в скорости, корзина стала актуальной. Ущерб от неработающей корзины в пик сезона мог составлять миллионы, а цена исправления — в пределах 15 000 рублей. Другой клиент потерял 200 000 рублей за неделю из-за некорректного кэша формы заказа — мы вернули работоспособность за два дня.

Официальная документация Битрикс рекомендует использовать component_epilog.php для динамических вставок — подробнее в руководстве.

CSS-подходы: BEM, Tailwind или гибрид?

Для больших проектов (30+ шаблонов) используем BEM — .product-card__price, .product-card--featured. Стили изолированы, конфликтов нет. Подробнее о BEM. В Битрикс обёртки с классами 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+ лет — получите консультацию по вашему проекту до начала работ.

Процесс работы:

  1. Анализ макетов и текущего проекта — выявляем компоненты для переработки
  2. Проектирование структуры — разбиваем страницу на BEM-блоки
  3. Реализация — верстаем шаблоны по схеме: template, result_modifier, epilog, CSS, JS
  4. Тестирование — проверяем кэш, адаптивность, Core Web Vitals, кроссбраузерность
  5. Деплой — стейджинг, приёмка, продакшен

На каждом этапе вы получаете промежуточный результат и можете внести правки. Свяжитесь с нами — оценим проект за 1–2 дня после получения макетов.

Сроки

Объём работ Срок
Лендинг (5–7 экранов) 3–5 дней
Корпоративный сайт (15–20 уникальных страниц) 2–4 недели
Интернет-магазин (30+ шаблонов компонентов) 4–8 недель
Кастомизация готового решения Маркетплейса 1–3 недели
Редизайн существующего проекта 3–6 недель

После анализа даём разбивку по компонентам — что переиспользуется, что верстается с нуля. Закажите предварительную консультацию — посчитаем сроки и бюджет индивидуально.