От хаоса в 1С к инкрементальному DWH на Postgres, Airflow и dbt: Как мы перестроили data-платформу и дали аналитикам скорость

В статье — реальный опыт построения DWH на PostgreSQL, Airflow, Kafka и dbt:
инкрементальные загрузки с ретроактивными изменениями, DDS со SCD2, обработка 300M строк стоков, CI/CD для пайплайнов и витрины, которые аналитики могут развивать сами.
06 февраля 2026
Автор статьи: Мазалов Александр
Время чтения: 30 мин.
Задать вопрос
Представьте компанию, где основная операционная система – 1С. Если это вам знакомо, то вы легко поймете, с какими сложностями мы сталкивались в процессе получения данных для аналитики пару лет назад.
Вот как это выглядело:

"Репликация и сложности загрузки"
  • Проблема №1: Полная репликация. Раз в сутки мы копировали всю базу 1С в MS SQL Server. Этот процесс занимал 3-4 часа и часто завершался сбоями из-за нагрузки на 1С, сетевых проблем или других факторов. Утром аналитики нередко задавались вопросом: "Данные сегодня загрузились?".
  • Нагрузка на систему: Полная выгрузка создавала значительную нагрузку на рабочую систему 1С, особенно в конце дня, что вызывало недовольство пользователей.
  • Проблема №2: Отсутствие инкрементальной загрузки. Данные в 1С часто корректировались задним числом, что делало невозможным использование инкрементального подхода. Каждый раз приходилось обрабатывать весь объем данных с самого начала, что существенно замедляло процесс и создавало проблемы с производительностью.
  • Итог этапа: Долгий, нестабильный и ресурсоемкий процесс, ограниченный фундаментальной проблемой отсутствия инкремента при изменяемой истории.

"Сложные SQL-скрипты для обработки данных"
  • Если репликация завершалась успешно, данные передавались на обработку в самописный SQL-скрипт. Мы столкнулись с архитектурными нагромождениями: код был перегружен логикой, что делало его нечитаемым. Попытки воссоздать структуру метаданных 1С превращали SQL-запросы в запутанный лабиринт из десятков JOIN-ов. Внести изменения или добавить новую витрину было задачей на несколько дней с непредсказуемым результатом.
  • Производительность: Скрипт обрабатывал полный объем данных, что занимало еще 2-3 часа. Причина – отсутствие инкрементального подхода.
  • Итог этапа: Медленный, сложный и рискованный процесс, который был лишь началом цепочки обработки.

KNIME: Инструмент не для нашего масштаба

  • Основная трансформация данных происходила в бесплатной версии KNIME – ключевой ETL-платформе на тот момент. Здесь формировались финальные витрины, но исходные данные всегда были полными из-за отсутствия инкремента.
  • Ресурсоемкость: Запуск процессов в KNIME требовал до 40 ГБ оперативной памяти, что в сочетании с бесплатной версией и сложными трансформациями приводило к деградации производительности. Несмотря на всю мощность KNIME, в нашей конфигурации он стал узким местом, так как не был рассчитан на постоянную переработку колоссальных объемов данных без инкремента.
Итоговые проблемы
  • Задержки данных: Вся цепочка обработки (репликация 3-4 часа, SQL-скрипты 2-3 часа, тяжелый ETL в KNIME) приводила к тому, что свежие данные утром были недоступны. 
  • Аналитикам приходилось работать с данными двухдневной давности. Доверять цифрам стало невозможно без длительных ручных проверок. BI-инструментам требовалось либо прямое подключение к реплике (что «вешало» базу), либо томительное ожидание витрин из KNIME
  • Качество данных: Сложность процессов и необходимость пересчета всего объема данных делали логику непрозрачной, а ошибки – трудноуловимыми. Доверять цифрам можно было только после долгих проверок.
  • BI-инструменты: Power BI Report Server приходилось либо подключаться напрямую к реплике MS SQL (с риском для производительности и несогласованности данных), либо ждать витрины из KNIME, которые были не всегда актуальны и качественны.
  • Итог: Разрозненные отчеты, несогласованные метрики и постоянные споры о достоверности данных.

Итог сложного периода:
  • Данные устаревшие: Без инкремента свежесть данных была недостижима.
  • Ненадежность: Сбой на любом этапе означал отсутствие данных утром.
  • Высокие затраты ресурсов: До 40 ГБ ОЗУ и часы CPU на полный пересчет, плюс нагрузка на 1С.
  • Сложность поддержки: Изменения в SQL или KNIME требовали много времени и несли риски.
  • Архитектурные ограничения: Отсутствие инкремента при исторических правках делало систему неэффективной.
  • Напряжение в команде нарастает: аналитики сталкиваются с задержками и ошибками, из-за чего срываются сроки подготовки важных отчётов. Дата-инженеры борются с нестабильностью процессов, что приводит к частым сбоям и необходимости повторной обработки данных. Пользователи 1С наблюдают замедление системы, что вызывает у них недовольство и снижение производительности.

Всё это приводит к серьёзным последствиям:
  • Задержки в принятии решений на основе данных из-за некорректных или запоздалых отчётов.
  • Задержки в оперативном планировании и координации проектов.
  • Снижение общей эффективности работы отделов.
  • Прямое негативное влияние на выручку бизнеса из-за упущенных возможностей и снижения качества обслуживания клиентов.
  • Ситуация может привести к потере важных контрактов и снижению конкурентоспособности компании на рынке.

Почему я так подробно описываю эти трудности? Чтобы показать, с какими вызовами мы столкнулись и как их преодолели. Если вы узнаете в этом описании свою ситуацию, оставайтесь с нами – дальше расскажем, как нашли выход из этого положения.

Осознание проблемы: Целевая архитектура платформы

Осознав ограничения прежней архитектуры, мы определили четкие требования к новой системе. Это были не просто пожелания, а ключевые принципы, необходимые для создания эффективной data-платформы:
  • Надежность как приоритет: Данные должны обновляться ежедневно без сбоев. Утром не должно возникать вопросов вроде "Данные загрузились?".
  • Скорость как стандарт: Цикл ETL должен стать значительно короче, чтобы обновления могли происходить чаще, чем раз в сутки.
  • Качество как основа: Уникальные и неизменяемые идентификаторы для всех сущностей, согласованность данных между витринами, хранение истории изменений ключевых атрибутов (SCD2) для анализа трендов и аудита.
  • Удобство разработки и поддержки: Модульная структура, понятный код, простота внесения изменений, чтобы работа дата-инженеров стала более эффективной.
  • Удобство для аналитиков: Единая точка доступа к свежим и готовым для анализа витринам с понятной документацией. Никаких прямых запросов к необработанным данным.
  • Прозрачность и документация: Четкое понимание структуры данных – что где находится, откуда берется и как связано. Поиск и анализ должны занимать минуты, а не часы.

Строим фундамент: Экстрактор 1С в BI и инкремент – первые шаги к изменениям

Первым важным шагом стало создание стейдж-слоя (Staging). Нам нужно было устранить фундаментальную проблему прошлого – отсутствие инкрементальной выгрузки из 1С. 
Полный пересчет базы больше не был приемлемым вариантом.
Мы быстро поняли, что писать свой надежный механизм CDC (Change Data Capture) для 1С с нуля — это месяцы разработки, тестирования и отладки краевых сценариев. Бизнес не готов был столько ждать. 

Поэтому мы пошли по пути использования готового решения и выбрали инструмент "Экстрактор 1С в BI" от "Денвик Аналитики", который стал основой новой архитектуры.

Почему именно этот инструмент?
  • Инкрементальность: Инструмент умеет отслеживать изменения в 1С, включая корректировки задним числом, и выгружает в стейдж только дельты (новые и измененные записи). Это решило ключевую проблему старой системы.
  • Удобство настройки: Выгрузка больше не требует сложных SQL-скриптов. Таблицы и поля для стейджа настраиваются через понятный интерфейс, что ускоряет и упрощает процесс.
Преимущества для базового слоя:
  • Снижение нагрузки: Минимальное воздействие на рабочую систему 1С и сеть, так как выгружаются только изменения.
  • Скорость: Выгрузка дельт занимает минуты или десятки минут вместо часов.
  • Стабильность: Процесс стал более предсказуемым и надежным.
  • Технология стейджа: Мы выбрали PostgreSQL – надежное и хорошо интегрируемое решение. Данные из 1С через Экстрактор 1С  поступают сюда в "сыром" виде, но уже с возможностью инкрементального обновления.


Сердце системы: DDS-слой и Airflow – порядок и управление данными 


Стейдж-слой – это только начало. Нам требовался следующий уровень, где "сырые" инкрементальные данные превращаются в чистые, согласованные бизнес-сущности с сохранением истории изменений. 
Так появился DDS (Detail Data Store) слой, также реализованный на PostgreSQL.
 
Задачи DDS: 
  • Уникальные идентификаторы: Каждой сущности (заказ, клиент, товар) присваивается неизменяемый ID, понятный бизнесу (суррогатный или стабильный бизнес-ключ). 
  • Очистка и стандартизация: Приведение данных к единым форматам, устранение несоответствий. 
  • Сохранение истории: Использование Slowly Changing Dimensions Type 2 (SCD2) для ключевых атрибутов (например, изменение статуса заказа или цены товара), чтобы отслеживать, когда и что именно изменилось.
Инструмент оркестрации: Apache Airflow. Почему именно он? 
  • Централизованное управление: Весь процесс преобразования данных из стейджа в DDS управляется через единый DAG (Directed Acyclic Graph) в Airflow. 
  • Принципы обработки: 
  • Инкрементальность: Обрабатываются только новые или измененные данные из стейджа (благодаря дельтам от данного продукта), что обеспечивает масштабируемость при росте объемов. 
  • Эффективность: Один DAG управляет обновлением около 50 таблиц в DDS-слое. Логика структурирована внутри DAG, что упрощает контроль и делает процесс более прозрачным по сравнению с разрозненными скриптами или проектами KNIME. 
  • Надежность: Airflow предоставляет инструменты для мониторинга, алертинга и повторного выполнения задач, гарантируя успешное завершение процессов. 

Результат DDS-слоя: Чистые, согласованные бизнес-сущности с уникальными ID и полной историей изменений (SCD2), готовые для построения аналитических витрин. Это стало основой для качества и доверия к данным. 


Выбор Airflow – это только первый шаг. Чтобы обеспечить надежность и плавное внедрение изменений в DDS-слой, мы разработали структурированный процесс разработки и деплоя: 

Две изолированные среды: 
  • Airflow-TEST: Развернута на Docker. Это среда для разработки и тестирования новых DAG'ов или изменений в существующих. Здесь можно безопасно проверять логику и выполнение задач на тестовых данных. 
  • Airflow-PROD: Также на Docker, но на отдельном, более мощном сервере. Это рабочая среда, отвечающая за регулярное обновление DDS-слоя. Её стабильность имеет критическое значение. 

Процесс разработки и деплоя (CI/CD через GitLab): 
  • Шаг 1: Разработка или изменение DAG. Инженер создает новый DAG или вносит правки в существующий в своей локальной среде или отдельной ветке Git. 
  • Шаг 2: Тестирование на Airflow-TEST. Обновленный код отправляется в GitLab. Airflow-TEST обновляется из этой ветки (автоматически или вручную). Инженер проверяет выполнение DAG на тестовых данных, анализирует логи, убеждается, что логика работает корректно, не нарушает существующие таблицы и эффективно обрабатывает инкрементальные данные. 
  • Шаг 3: Код-ревью и слияние. После успешного тестирования код проходит проверку коллегами. После подтверждения качества изменения сливаются в основную ветку репозитория (например, main или master), где хранится код Airflow (DAG'и, скрипты, конфигурации). 
  • Шаг 4: Автоматический CI/CD на PROD. Срабатывает пайплайн GitLab CI/CD, который: Собирает новый Docker-образ для Airflow-PROD с актуальным кодом из основной ветки. Разворачивает этот образ на продакшен-сервере Airflow-PROD. Старый контейнер останавливается, а новый запускается с обновленными DAG'ами. 
  • Шаг 5: Мониторинг PROD. После деплоя мы следим за выполнением DAG'ов в Airflow-PROD, особенно в первые запуски после изменений. Airflow предоставляет инструменты для мониторинга и уведомлений о проблемах. 

Преимущества такого подхода: 
  • Быстрое и безопасное внедрение изменений: Тестирование в изолированной TEST-среде снижает риск ошибок на продакшене. 
  • Надежность PROD: Автоматизированный CI/CD-пайплайн гарантирует, что на продакшене используется только проверенный код из основной ветки. Ручное вмешательство минимизировано. 
  • Удобство тестирования: Разработчики могут экспериментировать и проверять идеи в TEST-среде без риска для основной системы. 
  • Контроль версий и история: Код Airflow (DAG'и) хранится в GitLab, что обеспечивает полную историю изменений, возможность отката и совместную работу. 
  • Управление через Docker: Контейнеризация упрощает развертывание, изоляцию сред и переносимость. 

Итог: Процесс работы с Airflow – это не просто запуск DAG'ов, а полноценный инженерный цикл (Dev/Test/Deploy), основанный на принципах CI/CD и разделения сред. 
Это обеспечивает надежность и скорость разработки, которые были заложены в цели новой архитектуры. 

Изменения в DDS-слое вносятся быстро и предсказуемо.
 
scheme_article.png

Почему это эффективно: 
  • Четкая последовательность: Описан пошаговый процесс от разработки до деплоя. 
  • Фокус на изоляции: Разделение TEST и PROD сред – основа безопасности. 
  • Детали CI/CD: Указаны конкретные шаги пайплайна (сборка образа, деплой). 
  • Связь с целями: Подчеркнуто, как процесс поддерживает надежность и скорость разработки. 
  • Инструменты: Упоминание Docker, GitLab и CI/CD делает описание понятным для технической аудитории. 
  • Профессиональный подход: Показана зрелость процесса, который не строится на импровизации. 
  • Логика повествования: Это естественное продолжение истории о создании надежной системы. 

Результат реализации:
Мы превратили Airflow в надежный инструмент управления процессами. Благодаря докеризации, разделению сред TEST/PROD, автоматизации CI/CD и контролю версий через GitLab, мы можем быстро и безопасно развивать DDS-слой – добавлять новые сущности, улучшать логику SCD2 или оптимизировать обработку данных без риска для продакшена. 

Это полная противоположность сложностям поддержки прежних решений. 


Сравнение с прошлым:

Критерий Раньше (KNIME/SQL) Сейчас (Airflow + CI/CD)
Тестирование Практически невозможно, "на проде" Изолированная среда Airflow-TEST
Деплой Ручное копирование скриптов Автоматический CI/CD через GitLab
Воспроизводимость Зависимость от локальных настроек Docker-образы + контроль версий
Надежность Частые сбои при обновлениях Стабильный процесс с откатом
Скорость изменений Дни или недели Часы (от теста до продакшена)

Пример для понимания:
Раньше добавление новой таблицы в DDS требовало нескольких дней работы над сложным скриптом с высоким риском ошибок. 

Теперь процесс выглядит так:

  • Создание DAG: один день.
  • Тестирование на Airflow-TEST: пару часов.
  • Отправка кода в GitLab: 20 минут.
  • Запуск на продакшене: код уже работает.
  • Доступ аналитиков: на следующее утро.
Этот подход создает основу для следующего этапа – внедрения dbt для работы с витринами.

Реальный эффект:
  • Сокращение времени разработки с нескольких дней до 24 часов.
  • Минимизация риска ошибок благодаря тестированию.
  • Быстрое внедрение изменений и доступ к новым данным для аналитиков.
  • Создание основы для дальнейшего внедрения dbt и оптимизации работы с витринами данных.

Покоряем гигантов: Как мы справились с 300M строк стоков с помощью Kafka