![](https://habrastorage.org/webt/qz/sq/j9/qzsqj9kwc7g4xeaponeocm3phxy.jpeg)
Современное развитие IT технологий позволило обуздать громадные потоки данных.
У бизнеса появились различные инструменты: CRM, ERP, BPM, бухгалтерские системы или в крайнем случае просто Excel и Word.
Компании тоже бывают разные. Некоторые, состоят из множества обособленных филиалов. В таком случае у бизнеса возникает проблема синхронизации данных в зоопарке IT систем. Тем более, что у филиалов отличаются вендоры или версии ПО. А частые изменения требований к отчётности от управляющей компании вызывают приступы неконтролируемой “радости” на местах.
Эта история о проекте, в котором мне довелось столкнуться с хаосом, который нужно было систематизировать и автоматизировать. Скромный бюджет и сжатые сроки ограничивали использование большинства промышленных решений, но открывали простор для творчества.
Универсальный формат
Заказчик поставил задачу по сбору данных для отчётов со всех филиалов компании. Для понимания масштаба бедствия — это десятки систем, среди которых как самописные, так и монстры типа SAP, ну и, конечно, 1C — куда без него.
В одном отчёте могли пересечься данные от: бухгалтерии, ремонтников, пиарщиков, МЧС, метеорологов.
До старта проекта основная часть данных отправлялась в головную компанию по email в виде Word/Excel вложений. Далее процесс напоминал закат солнца вручную: данные обрабатывались специально обученными людьми и заносились в пару систем. Результатом труда были десятки отчётов, на основе которых принимались управленческие решения.
На выбор подхода нас натолкнул формат пересылаемых файлов, а именно xlsx/docx. Даже “древние” системы в филиалах поддерживали выгрузку данных в эти форматы, ну или на крайний случай copy-paste никто не отменял.
Наш замысел упрямый был таков:
- описываем структуру каждого отчёта и регламент его передачи;
- спускаем в филиалы требования по настройке систем на отправку документов по email согласно регламенту. Где систем нет — отправка, как и раньше, руками;
- разрабатываем программу, которая:
- отбирает определенные документы из входящей почты;
- извлекает из них данные;
- записывает извлеченные данные в БД, а так же “бьёт по рукам” нарушителей регламента.
![](https://habrastorage.org/webt/6b/na/ev/6bnaevbsj113vtojoryl6pkxt2s.png)
Реализация
Организационные вопросы
На этапе сбора и формализация требований к структуре и регламенту передачи данных оказалось, что описания структуры отчётов не было, совсем. Все хранилось в головах некоторых сотрудников и передавалось как русские народные сказки из уст в уста. Но настоящие проблемы начались позже — при наладке обмена данными.
Проблема первая
Отличие структуры документов от эталонных и качество данных. В отчётах порой не сходились суммы, колонки были перепутаны местами или имели некорректные наименования. Проблема в основном наблюдалась в филиалах, где данные вбивались вручную.
Решение — внедрение трёхэтапной проверки:
- Создание эталонных Excel документов с жёсткой структурой, средствами самого Excel. В таких документах были доступными только ячейки для ввода данных. На которые дополнительно накладывались проверки: типа, схождения сумм и т.п.
- Проверки при извлечении данных из отчёта. Например, сопоставление текущей даты и даты в абзаце Word документа или арифметические проверки для данных из Excel документа (если их нельзя задать в самом документе).
- Глубокий анализ данных после сбора. Например, обнаружение значительных отклонений по ключевым показателям в сравнении с предыдущими периодами.
Проблема вторая
Систематическое нарушение графика передачи данных или бессовестные попытки саботажа: «Мы вообще данные никому и никогда не отправляли, а тут вы со своей этой ...», «Да я отправил все, вовремя, это пинг наверное плохой».
Решение — обратная связь. Система автоматически оповещает ответственных лиц в филиале, при нарушении графика. Позже подсистему обратной связи прикрутили к системе проверки качества входных данных и к системе формирования конечных отчётов, чтобы филиал сразу получал свод по своим данным и сравнение с “соседями”.
Разработанные подсистемы
- Конфигуратор типов документов с данными, в котором можно быстро описать:
- признаки для идентификации документа;
- регламент передачи;
- алгоритм извлечения данных;
- прочие атрибуты вроде пути к коду, который проверяет и сохраняет данные.
- Получатель почты, перемещающий вложения в изолированное хранилище (песочницу) и сохраняющий сопутствующую информацию о письме;
- Парсер вложений, который определяет типы документов и извлекает из них данные.
![](https://habrastorage.org/webt/7s/bp/ef/7sbpefc8oczlxcc6xyrauq4309y.png)
Конфигуратор
Исторически сложилось так, что все документы с данными приходят на общую почту, где полно других важных и не очень писем. Нужны признаки, по которым будут определяться нужные документы. Название документа или текст в теле email — это все ненадёжно и неудобно для отправителя. Поэтому было принято решение, что принадлежность к отчёту будет определяться только по содержимому документа. Кроме того, нужно однозначно определять, что за тип отчёта содержит документ.
Мозговым штурмом напридумывали хрен знает сколько признаков для идентификации документа: цвет текста в ячейке, шрифт и прочее. Но самым правильными оказалcя признак наличия подстроки в определенной ячейке “слот” или массиве ячеек для Excel и абзаце или заголовке для Word. Для “слота” добавили простую формальную логику: “равно”, “неравно”, “больше”, “меньше” и пр. Пример для Excel: в диапазоне A2-E4 текст ячейки должен быть равен “Ежедневная сводка о загрузке оборудования”.
![](https://habrastorage.org/webt/km/aj/ea/kmajeaf8og5y17cnfronq3x2wmq.png)
Схожим образом настраивается область документа, в которой нужно искать начало и окончание данных (прим. условия поиска окончания: 2 пустые строки подряд).
![](https://habrastorage.org/webt/u1/9t/hh/u19thhrwphi6bbdfifx1bt6tk84.png)
Перечень других полезных настроек: список разрёшенных отправителей, тип документа (Excel/Word) и путь для экспорта данных.
На выходе получаем JSON структуру (шаблон), описывающую отчёт.
Получатель почты
Читалка почты, которая помещает все документы из вложений в песочницу, сохраняет атрибуты письма и ставит документы в очередь задач на парсинг.
Тут есть 2 вопроса по безопасности:
- что, если данные отправят за другой филиал?
- что, если данные отправят злоумышленники?
Первый вопрос решается путём сверки email адреса филиала-отправителя и филиала, указанного в теле отчёта.
Второй — с помощью SPF.
Парсер вложений
Почти все библиотеки для парсинга Word и Excel имеют серьёзные ограничения по поддерживаемым версиям, потому для начала документ необходимо сконвертировать. Libre Office решает эту проблему на пятёрку.
После конвертации:
- отсеиваем массив шаблонов по базовым признакам из конфигуратора (Word/Excel, отправитель ...);
- прогоняем документ оставшимися шаблонами;
- если шаблон найден — извлекаем данные и передаём в хранилище.
Итог
У нас получилось!
После двух месяцев кропотливой работы головной офис стал регулярно получать данные для отчётов от всех филиалов. Причём качество и полнота данных беспрецедентно отличалась от того что было ранее, а высвобожденные человеческие ресурсы окупили затраты на проект уже к концу года.
Для себя мы узнали, что интеграция — это не всегда больно и выделили главные аспекты успеха:
- мы не лезли внутрь систем в филиалах;
- формализовали и утвердили единую структуру отчётов и регламент их передачи;
- создали общедоступные для всех систем шаблоны выходных форматов в виде Excel и Word документов;
- выбрали самый распространенный способ доставки данных — email.
И два основных недостатка:
- Невысокая скорость доставки данных.
- Размер пакета данных не должен превышать размер обычного email вложения.