«Супербаза»

в 12:02, , рубрики: ERP-системы, разработка

Однажды мне поставили задачу — на офисно-бытовом железе (P4-2GHz, 1Gb RAM) формировать отчеты по данным из десятка филиалов, которые представлены в виде сотен отдельных баз данных по тысяче файлов каждая. Это были базы 1С-Торговля 7.7 (dbf), обрезаные по месяцам, которые приезжали из филиалов на флешках. Суммарный объем измерялся сотнями гигабайт, только на копирование уходило больше часа. Но отчеты за 3 года по всем филиалам выполнялись за несколько минут. Как?

«Супербаза»

Очень просто. Была создана супербаза. Нет, это не одна большая общая база, куда слиты данные со всех баз. Я пробовал, фигня получается. Слишком большие объемы, слишком много проблем с синхронизацией данных. Все гораздо проще…

Супербаза представляет собой пустую базу, которая может работать с другими базами. В ней есть список доступных баз и набор обработок (скриптов) для получения данных и формирования отчетов.

Например, нужен отчет по взаиморасчетом с клиентом ООО «Спартак». Указываем часть названия и ИНН (если есть), задаем период и прочие параметры. Супербаза поочереди стартует известные ей базы данных и через API (через OLE) передает им команду сформировать такой-то отчет с такими-то параметрами. База формирует отчет и отдает его супербазе. Из отдельных отчетов по каждой базе собирается один общий отчет. Собранные для отчетов данные кешируются, при повторном формировании с похожими условиями не требуется заново собирать данные.

Поскольку обращение к базам идет через API, то совершенно не важна версия и структура конкретной базы. Филиалы автономны, у каждого свои заморочки, каждый их по-своему решает. Общий только формат выдачи отчетов и формат получения первички (накладные, платежки, счета, ордера и прочие стандартные бумажные документы). Кроме того, качество данных на каждом филиале разное. Одни аккуратно ведут справочники и документы, заполняют все основные реквизиты. Другие пишут как зря, с ошибками и дублями, реквизиты либо не заполнены, либо с ошибками. Но это не столь важно, достаточно части названия. В итоговом отчете будет разбивка по разным вариантам названий, убрать лишние проще, чем добрать недостающие.

Еще одно огромное удобство — базы могут лежать на разных носителях. Это могут быть флешки, USB-HDD, сетевые шары. Базы можно подключать-отключать «на ходу» — они ведь запускаются автономно и атомарно, сбой отдельной базы никак не вредит. Можно одновременно запускать несколько баз с разных носителей без потери производительности на IOPS и блокировках. Такой вот динамический partitioning для бедных.

Быстродействие достигалось гораздо большее, чем на одной общей базе, даже если использовать MS-SQL на SSD и более мощное железо. Одновременно запускалось несколько баз с разных носителей, при этом не было проблем с блокировками и однопоточностю каждой отдельной базы. На флешках базы порой работали даже быстрее, чем на HDD. Отчеты формировались частями, что позволяло начать их рассмотрение до окончания всего процесса. В случае ошибок в условиях можно тормознуть отчет, не дожидаясь, пока он полностью сформируется.

Очередной плюс — безопасность. Поскольку базы на филиалах обрезались каждый месяц и хранились на переносных носителях, то:
— не оставалось лишних данных для посторонних (данные всего за текущий месяц максимум)
— нет возможности хитрому персоналу портить данные за прошлые периоды. А если вдруг решат испорить — можно легко сравнить с состоянием на конец предыдущего периода
— потеря данных в случае форс-мажора не больше месяца. Однажды была рейдерская атака. Потеряли данные всего за 3 дня, а злодеям достался огрызок одной базы за неделю.
— переносные носители (особенно флешки) в случае форс-мажора можно легко уничтожить или спрятать. И никаких следов, паролей, и прочих намеков. И на работу не влияет.

Немного о деталях реализации. Все это было сделано на 1С-Предприятие 7.7 релиз 25. Два варианта открытия баз — один через OLE, для неспешного выдергивания первички и справочников. Второй — автономный запуск из командной строки, с запуском обработки autorun.ert. Перед открытием базы этот autorun.ert и файл с настройками копировались в каталог базы. После выполнения обработки результат сохранялся в файл (обычно как СписокЗначений или ТаблицаЗначений, сериализованные через ЗначениеВФайл() ).

Чаще всего супербаза использовалась для переноса первички из оперативных торговых баз по «чистовым» базам юрлиц. Для этого сперва создавался большой список всех накладных без табличных частей. Потом этот список вручную (почти вручную) отфильтровывался бухгалтерами, в нем оставались только «чистые» документы по конкретному юрлицу. И после этого из доступных баз документы из отфильтрованного списка копировались в чистовую базу юр.лица.

Автор: serbod

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js