Портфолио

Airflow + 1С + PostgreSQL: загружаем 50K+ заказов из кривых Excel-файлов

Проблема

Каждое утро менеджеры выгружают из 1С Excel-файлы. В них — объединённые ячейки, плавающие заголовки (то на 3-й строке, то на 7-й), даты в трёх разных форматах (01.02.2025, 01.02.2025 14:30:00, 2025-02-01). Аналитики тратят 2+ часа на ручную чистку, прежде чем данные можно будет использовать в отчётах. Знакомо?

Что сделали?

Разработали ETL-пайплайн на Apache Airflow, который:

  • Ежедневно проверяет наличие файла за предыдущий день.
  • Автоматически находит строку с заголовками, даже если она не первая.
  • Нормализует даты и числа.
  • Загружает данные в PostgreSQL — чистыми, без дублей, с контролем ошибок.

Результат

✅ Обрабатывается 50K+ строк в день.
✅ Время чистки сократилось с 2 часов до 15 минут.
✅ Ошибки загрузки: 0 (Airflow автоматически перезапускает упавшие задачи).
✅ Аналитики наконец-то работают с инсайтами, а не с Excel.

Архитектура

1С (Excel) → Airflow DAG → PostgreSQL (staging_client_orders)
                ↓
        автоопределение заголовков
                ↓
         нормализация и загрузка
Всё поднято в Docker: одна команда docker-compose up -d — и готово.

Ключевой фрагмент кода (автоопределение заголовков):
for i in range(min(10, len(df))):
    row = df.iloc[i].astype(str)
    if 'Клиент' in row.values or 'Заказ клиента.Номер' in row.values:
        df = pd.read_excel(file_path, header=i)
        print(f'Заголовки найдены на строке {i}')
        break
Нормализация дат (поддержка нескольких форматов):
def parse_date(date_value):
    for fmt in ['%d.%m.%Y %H:%M:%S', '%d.%m.%Y', '%Y-%m-%d']:
        try:
            return datetime.strptime(str(date_value), fmt).date()
        except:
            continue
    return None
Идемпотентная загрузка в PostgreSQL (ON CONFLICT):
INSERT INTO staging_client_orders (...) VALUES (%s)
ON CONFLICT (order_number, load_date) DO NOTHING;
Весь код открыт на GitHub: https://github.com/olkhovii/data-engineer-portfolio

Что дальше?

Подключаем API Яндекса (Метрика + Директ) и Google Sheets — чтобы все маркетинговые данные были в едином DWH. Следите за обновлениями.
2026-06-09 18:18 BI аналитика