Интеграция Битрикс24 с Power BI
Отдел аналитики строит отчёты вручную в Excel, скачивая данные из Битрикс24 раз в неделю. Данные устаревают на момент презентации. Power BI с прямым подключением к REST API Битрикс24 обновляет дашборды автоматически — раз в час или по расписанию.
Два подхода к подключению
Подход 1. Power BI Dataflow + REST API — настраивается в Power BI Service без программирования. Используем коннектор «Web» с аутентификацией через вебхук Битрикс24. Подходит для небольших объёмов (до 50 000 записей).
Подход 2. ETL-процесс → промежуточная БД → Power BI — Python/Node.js скрипт выгружает данные из Битрикс24 API в PostgreSQL/MySQL, Power BI подключается к SQL-базе. Правильный подход для production: надёжнее, быстрее, не зависит от лимитов REST API в момент обновления отчёта.
Архитектура ETL-процесса
Битрикс24 REST API → Python ETL → PostgreSQL (аналитическая схема) → Power BI
ETL-скрипт запускается по расписанию (каждый час через cron). Схема БД — денормализованные таблицы под аналитические запросы:
-- Факт-таблица сделок
CREATE TABLE b24_deals (
id BIGINT PRIMARY KEY,
title TEXT,
stage_id VARCHAR(50),
amount NUMERIC(15,2),
currency VARCHAR(3),
assigned_id INT,
contact_id INT,
company_id INT,
created_date TIMESTAMP,
closed_date TIMESTAMP,
pipeline_id INT
);
-- Измерения
CREATE TABLE b24_users (
id INT PRIMARY KEY, full_name TEXT, department TEXT, email TEXT
);
CREATE TABLE b24_stages (
id VARCHAR(50) PRIMARY KEY, name TEXT, pipeline_id INT, sort INT, is_final BOOL
);
Выгрузка данных через REST API
Битрикс24 REST API возвращает данные постранично (по 50 записей). Нужен итеративный сбор:
import requests
import psycopg2
WEBHOOK = "https://your-domain.bitrix24.ru/rest/1/token/"
PG_CONN = "postgresql://user:pass@localhost/analytics"
def fetch_all(method, params=None):
"""Постраничная выгрузка из Б24 API"""
items, start = [], 0
while True:
r = requests.post(WEBHOOK + method, json={
**(params or {}), "start": start
}).json()
items.extend(r.get("result", []))
if r.get("next") is None:
break
start = r["next"]
return items
def sync_deals():
deals = fetch_all("crm.deal.list", {
"select": ["ID","TITLE","STAGE_ID","OPPORTUNITY","CURRENCY_ID",
"ASSIGNED_BY_ID","CONTACT_ID","COMPANY_ID",
"DATE_CREATE","CLOSEDATE","CATEGORY_ID"],
"filter": {">=DATE_MODIFY": last_sync_timestamp()},
})
conn = psycopg2.connect(PG_CONN)
cur = conn.cursor()
for d in deals:
cur.execute("""
INSERT INTO b24_deals VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
ON CONFLICT (id) DO UPDATE SET
stage_id=EXCLUDED.stage_id, amount=EXCLUDED.amount,
closed_date=EXCLUDED.closed_date
""", (d["ID"], d["TITLE"], d["STAGE_ID"], ...))
conn.commit()
Ключевые метрики для дашборда
Power BI строит дашборд поверх аналитических таблиц. Типовые визуализации:
| Метрика | Источник |
|---|---|
| Воронка сделок по стадиям | b24_deals GROUP BY stage_id |
| Выручка по менеджерам | b24_deals JOIN b24_users |
| Конверсия лид → сделка → оплата | b24_leads JOIN b24_deals |
| Среднее время в стадии | Расчёт по timestamp переходов |
| Нагрузка по менеджерам (активные сделки) | Фильтр is_final = false |
Обновление данных в Power BI Service
В Power BI Service настраиваем расписание обновления датасета: подключение к PostgreSQL через On-premises data gateway (если БД локальная) или к облачной PostgreSQL напрямую. Частота обновления — от 1 раза в сутки (бесплатный план) до 8 раз/сутки (Premium Per User).
Для оперативного мониторинга продаж — настраиваем DirectQuery (реальное время) вместо Import Mode. Минус: запросы к БД при каждом открытии отчёта, нагрузка на базу.
Инкрементальная загрузка
При больших объёмах (100 000+ сделок за историю) полная перезагрузка каждый час — расточительно. В Power BI Premium настраиваем Incremental Refresh: система сама определяет диапазон новых данных по полю даты и догружает только изменения.
| Задача | Трудозатраты |
|---|---|
| ETL-скрипт (Python + psycopg2) | 8–12 ч |
| Схема аналитической БД | 4–6 ч |
| Дашборд в Power BI (5–7 отчётов) | 8–16 ч |
| Настройка расписания и мониторинга | 3–4 ч |







