
Техническое введение: BI как сложная программная система
Современные системы Business Intelligence (Power BI, Tableau, Qlik Sense, SAP BusinessObjects) представляют собой многоуровневые программные комплексы. Технически они состоят из источников данных (SQL, Excel, API), ETL-процессов (Power Query, Qlik Script), модели данных (DAX, Tableau Calculations), визуализации и журналов аудита. Каждый уровень может быть сфальсифицирован: изменены формулы, удалены дашборды, подменены источники, модифицированы ETL-скрипты. Техническая задача экспертизы — найти неудаляемые следы манипуляций на каждом уровне. 🖥️📊
Мы, эксперты Союза «Федерация судебных экспертов», специализируемся на компьютерно-технической экспертизе систем business intelligence. В этой статье, написанной в техническом стиле, мы представляем методы низкоуровневого анализа BI-систем: от парсинга.pbix и.twb до анализа логов PostgreSQL и Azure Log Analytics. Три реальных кейса иллюстрируют применение этих методов.
Глава 1. Техническая архитектура BI-систем как объект экспертизы
С технической точки зрения, BI-системы имеют следующую архитектуру. 🏗️
Power BI (облачная и on-premise):
Файл.pbix — ZIP-архив, содержащий DataModelSchema (JSON с DAX-формулами), Report/Layout (JSON визуализаций), Connections, а также M-код Power Query.
Логи: Azure Log Analytics (таблицы PowerBIDatasets, PowerBIActivity).
Хранилище: OneDrive/SharePoint (история версий).
Бэкапы: Data Export (через судебный запрос).
Tableau (on-premise и облачный):
Файл.twb — XML-файл с описанием дашбордов, источников данных, вычислений.
Файл.twbx — архив (.twb + данные).
Логи: PostgreSQL (таблицы historical_events, http_requests).
Бэкапы: .tsbak (архив).
Qlik Sense (on-premise):
Файл.qvf — контейнер со скриптами и моделью.
Логи: PostgreSQL (таблицы script_versions, operations, users).
Бэкапы: .qvf (копии приложений).
SAP BusinessObjects (on-premise):
Файлы.unx (универс),.rep (отчёты).
Логи: база данных Audit (CMS).
Бэкапы: резервные копии CMS.
Компьютерно-техническая экспертиза систем business intelligence требует знания всех этих форматов.
Глава 2. Технические методы анализа Power BI
Метод 1. Парсинг.pbix (ZIP + JSON + M)
Файл.pbix — ZIP-архив. Распаковка:
bash
unzip report.pbix -d report_extracted/
Ключевые файлы:
DataModelSchema — JSON с DAX-формулами, связями, мерами.
Report/Layout — JSON визуализаций, страниц, фильтров.
Connections — строки подключения к источникам.
M — скрипты Power Query (в бинарном виде, но могут быть извлечены).
Метод 2. Извлечение DAX-формул
Из DataModelSchema извлекается раздел expressions. Формулы имеют вид:
json
{
«Name»: «Cost»,
«Expression»: «SUM(Production[ActualCost])»
}
Для поиска изменений используется сравнение версий (diff) через jq:
bash
jq ‘.expressions[] | select(.Name==»Cost»)’ old/DataModelSchema > old_cost.json
jq ‘.expressions[] | select(.Name==»Cost»)’ new/DataModelSchema > new_cost.json
diff old_cost.json new_cost.json
Метод 3. Анализ Azure Log Analytics
KQL-запрос (Kusto Query Language):
text
PowerBIDatasets
| where OperationName == «UpdateReport» or OperationName == «DeleteReport»
| project TimeGenerated, UserId, ClientIP, WorkspaceId, ReportName
Метод 4. Восстановление из бэкапа Microsoft
Судебный запрос Data Export. Бэкап предоставляется в виде ZIP-архива с файлами.pbix. Восстановление в тестовую среду.
Глава 3. Кейс №1: Power BI — обнаружение подмены DAX-формулы
🔧 Техническая задача: Обнаружить изменение DAX-формулы себестоимости в Power BI при отключённой истории версий.
Параметры:
Файл.pbix в SharePoint.
История версий отключена.
Azure Log Analytics включён (90 дней).
Бэкап Data Export доступен через суд.
Технический процесс 🔨
Шаг 1. Запрос к Azure Log Analytics
KQL-запрос:
text
PowerBIDatasets
| where OperationName == «UpdateReport»
| where TimeGenerated > datetime(2025-03-14)
Результат: запись от 15.03.2025 02: 17: 33 UTC, пользователь `fin_director@promtech.ru», IP-адрес 185.xxx.xx.xx (VPN).
Шаг 2. Судебный запрос Data Export
Запрос к Microsoft о предоставлении бэкапа на 14.03.2025. Получен ZIP-архив с.pbix.
Шаг 3. Распаковка.pbix и извлечение DAX-формул
bash
unzip backup_20250314.pbix -d backup/
cat backup/DataModelSchema | jq ‘.expressions[] | select(.Name==»Cost»)’
Результат: «Expression»: «SUM(Production[ActualCost])»
Шаг 4. Сравнение с текущей формулой
Текущий.pbix (после изменения):
bash
unzip current.pbix -d current/
cat current/DataModelSchema | jq ‘.expressions[] | select(.Name==»Cost»)’
Результат: «Expression»: «SUM(Production[ActualCost]) * 0.7»
Шаг 5. Diff:
text
— SUM(Production[ActualCost])
+ SUM(Production[ActualCost]) * 0.7
Шаг 6. Технический вывод
Формула была изменена пользователем `fin_director@promtech.ru» 15.03.2025 в 02: 17: 33. Корректная себестоимость — по формуле из бэкапа.
Глава 4. Технические методы анализа Tableau
Метод 1. Парсинг.twb (XML)
.twb — XML-файл. Ключевые узлы:
<datasource> — источник данных и SQL-запрос.
<column> с атрибутом calculation — вычисляемые поля.
<worksheet> — листы дашборда.
<dashboard> — дашборды.
Метод 2. Анализ PostgreSQL Tableau Server
Таблицы:
historical_events — все события (удаления, изменения, просмотры).
http_requests — HTTP-запросы к серверу (IP, метод, URL).
Метод 3. Восстановление из.tsbak
.tsbak — архив. Восстановление:
bash
tabadmin restore /backups/tableau_20250314.tsbak
После восстановления — экспорт дашбордов через tabcmd.
Глава 5. Кейс №2: Tableau — обнаружение удаления дашбордов и подмены источников
🔧 Техническая задача: Обнаружить удаление дашбордов в Tableau Server и подмену источников данных.
Параметры:
Tableau Server on-premise.
Логи PostgreSQL сохранены (historical_events).
Бэкапы.tsbak создаются (ежедневно в 2: 00).
Технический процесс 🔨
Шаг 1. Подключение к PostgreSQL и запрос
bash
psql -h tableau-server -U tableau -d workgroup
sql
SELECT id, created_at, user_id, event_type, details
FROM historical_events
WHERE event_type = ‘workbook-delete’
AND created_at > ‘2025-03-01’;
Результат: 15 записей, user_id = consultant@integrator.ru, имена дашбордов с «Loss», «Negative margin».
Шаг 2. Восстановление бэкапа.tsbak
bash
tabadmin restore /backups/tableau_20250314.tsbak
Шаг 3. Экспорт.twb-файлов
bash
tabcmd export «Убытки_регион_Север» —output-file losses_north.twb
Шаг 4. Анализ XML
xml
<datasource>
<connection>
<sql>SELECT region, product, profit FROM sales WHERE year=2024</sql>
</connection>
</datasource>
Шаг 5. Сравнение с текущим источником
Текущий.twb:
xml
<sql>SELECT region, product, profit FROM sales WHERE year=2024 AND profit>0</sql>
Diff: добавлен AND profit>0 — фильтрация убыточных строк.
Шаг 6. Технический вывод
Удалены 15 дашбордов. Источник данных подменён.
Глава 6. Технические методы анализа Qlik Sense
Метод 1. Парсинг.qvf
.qvf — ZIP-архив. Распаковка:
bash
unzip app.qvf -d app_extracted/
Ключевой файл: Script — Qlik Script (ETL-скрипт).
Метод 2. Анализ PostgreSQL Qlik
Таблицы:
script_versions — история версий скриптов (версия, автор, время, полный текст).
operations — логи действий пользователей (edit_script, delete_app).
Метод 3. Восстановление из.qvf
Копирование.qvf и загрузка в Qlik Sense Desktop.
Глава 7. Кейс №3: Qlik Sense — обнаружение дублирования продаж в ETL-скрипте
🔧 Техническая задача: Обнаружить изменение Qlik Script, дублирующее суммы продаж.
Параметры:
Qlik Sense Enterprise on-premise.
История версий скриптов включена.
Логи PostgreSQL сохранены.
Технический процесс 🔨
Шаг 1. Запрос к script_versions
sql
SELECT version, modified_by, modified_time, script
FROM script_versions
WHERE app_name = ‘Sales Dashboard’
ORDER BY modified_time;
Шаг 2. Сравнение версий
Версия 5:
text
LOAD customer, amount FROM sales.csv;
Версия 6:
text
LOAD customer, amount * 2 as amount FROM sales.csv;
Diff: amount * 2.
Шаг 3. Идентификация автора
modified_by = sales_head@torghab.ru, modified_time = 10.02.2025 23: 45: 00.
Шаг 4. Запрос к operations
sql
SELECT user_id, operation, time, ip_address
FROM operations
WHERE user_id = ‘sales_head@torghab.ru’ AND operation = ‘edit_script’;
IP-адрес: 192.168.1.100 (домашний компьютер).
Шаг 5. Технический вывод
Скрипт изменён, добавлено дублирование продаж. Корректные KPI восстановлены откатом к версии 5.
Глава 8. Сравнительный анализ технических методов
| BI-система | Формат файлов | Логи | Бэкапы | Инструменты анализа |
| Power BI | .pbix (ZIP+JSON) | Azure Log Analytics (KQL) | Data Export | jq, DAX Studio, PowerShell |
| Tableau | .twb (XML),.twbx | PostgreSQL (historical_events) | .tsbak | xmlstarlet, psql, tabcmd |
| Qlik Sense | .qvf (ZIP) | PostgreSQL (script_versions) | .qvf | psql, diff, Qlik Sense Desktop |
Компьютерно-техническая экспертиза систем business intelligence требует владения этими инструментами.
Глава 9. Инструментарий эксперта BI
Программное обеспечение:
Power BI: Power BI Desktop, DAX Studio, Tabular Editor, jq (JSON), PowerShell.
Tableau: Tableau Desktop, Tabcmd, PostgreSQL client (psql), xmlstarlet.
Qlik: Qlik Sense Desktop, Qlik Management Console, psql.
Общие: WinMerge, Beyond Compare, Git diff, Python (pandas, openpyxl).
Аппаратные средства (для on-premise):
Tableau Forensic Duplicator T8 (копирование дисков).
WriteBlocker для SATA/SAS/NVMe.
PC-3000 (восстановление данных с повреждённых дисков).
Глава 10. Технические ограничения методов
Когда восстановление невозможно:
История версий Power BI отключена, бэкапы вендора перезаписаны (>90 дней).
Логи Tableau Server не настроены (historical_events не создана).
Бэкапы.tsbak /.qvf не создавались.
История версий Qlik Sense отключена.
Процент восстановления:
| BI-система | Источник | Процент | Срок |
| Power BI | Azure Log Analytics + Data Export | 95-100% | до 90 дней |
| Tableau | historical_events +.tsbak | 95-100% | зависит от настроек |
| Qlik Sense | script_versions +.qvf | 100% | пока не очищена |
Глава 11. Часто задаваемые технические вопросы
Вопрос: Как восстановить.pbix, если он не сохранён в OneDrive?
✅ Ответ: Только через судебный запрос Data Export к Microsoft.
Вопрос: Как часто Tableau Server создаёт бэкапы.tsbak?
✅ Ответ: По умолчанию — ежедневно в 2: 00. Настраивается.
Вопрос: Можно ли восстановить скрипт Qlik, если история версий очищена?
✅ Ответ: Через бэкапы.qvf или через WAL PostgreSQL (если включён).
Вопрос: Какова минимальная сумма иска для окупаемости экспертизы?
✅ Ответ: Экспертиза стоит от 120 000 руб. Окупается при иске от 3-5 млн руб.
Глава 12. Экономическая эффективность
Формула: EV = S × q — C — (1-q) × F
Пример (иск 20 млн руб., C=400 000 руб., q=0,95):
EV(с экспертизой) = 20×0,95 — 0,4 — 0,05×0,2 = 18,59 млн руб.
EV(без экспертизы) = 20×0,30 — 0 — 0,70×0,2 = 5,86 млн руб.
Выигрыш: 12,73 млн руб.
Глава 13. Протокол технического исследования BI
Для Power BI:
Извлечь.pbix через SharePoint API или судебный запрос.
Распаковать.pbix (ZIP).
Извлечь DAX-формулы из DataModelSchema (JSON).
Сравнить версии (diff через jq).
Запросить Azure Log Analytics (KQL).
Для Tableau:
Сделать дамп PostgreSQL (historical_events).
Восстановить.tsbak.
Извлечь.twb (XML).
Сравнить узлы <datasource> и <calculation> (xmlstarlet).
Для Qlik:
Сделать дамп PostgreSQL (script_versions).
Восстановить.qvf.
Извлечь Qlik Script.
Сравнить версии (diff).
Глава 14. Технические рекомендации по сохранению данных
Для компаний:
Включить историю версий в Power BI (OneDrive/SharePoint).
Настроить аудит Tableau Server (historical_events).
Включить версионирование скриптов в Qlik Sense.
Регулярно создавать бэкапы (.pbix,.tsbak,.qvf).
Сохранять логи Azure Log Analytics (экспорт в Storage Account).
Глава 15. Сравнение версий (diff) как основной технический метод
Инструменты:
WinMerge, Beyond Compare (графические).
Git diff (командная строка).
jq —argjson (JSON diff).
xmlstarlet (XML diff).
Пример JSON diff (Power BI):
diff
— «Expression»: «SUM(Production[ActualCost])»
+ «Expression»: «SUM(Production[ActualCost]) * 0.7»
Пример XML diff (Tableau):
diff
— <sql>SELECT profit FROM sales</sql>
+ <sql>SELECT profit FROM sales WHERE profit>0</sql>
Пример Qlik Script diff:
diff
— LOAD customer, amount FROM sales.csv;
+ LOAD customer, amount * 2 as amount FROM sales.csv;
Глава 16. Судебный запрос к вендору BI
Процедура:
Ходатайство об истребовании доказательств (ст. 66 АПК РФ).
Суд выносит определение. Направляется в Microsoft (Power BI), Salesforce (Tableau) или Qlik.
Вендор предоставляет данные (бэкапы, логи) в зашифрованном виде (30-90 дней).
Сложности:
Отказ вендора → суд делает выводы против оппонента (ст. 65 АПК РФ).
Глава 17. Новые технические вызовы
Тренд 1. Power BI Copilot (AI)
AI может генерировать фальшивые формулы. Экспертиза будет выявлять статистические аномалии.
Тренд 2. Real-time BI (Kafka, Event Hubs)
Экспертиза требует анализа потоковых логов (Kafka offsets, Event Hubs Capture).
Тренд 3. GraphQL API
Усложняет анализ API-логов (запросы менее структурированы). Метод: парсинг AST.
Глава 18. Заключение: техническая истина — в сравнении версий
Три кейса показали возможности компьютерно-технической экспертизы систем business intelligence:
✅ Power BI — подмена DAX-формулы (45 млн руб.).
✅ Tableau — удаление дашбордов и подмена SQL (23 млн руб.).
✅ Qlik Sense — дублирование продаж через ETL-скрипт (12 млн руб.).
🟩 Мы — Союз «Федерация судебных экспертов». Сайт: https: //kompexp.ru/
Техническая истина — в сравнении версий. Мы умеем его делать. 🔧⚖️






Задавайте любые вопросы