OLAP для 1С с помощью Pentaho BI




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

20 Comments

  1. DoctorRoza

    Вы, вообще, о чем? Зачем это нужно? Какой выигрыш в работе? Чем плох имеющийся аналог?

    Reply
  2. stanru1

    Спасибо за статью; я делал кубы на MSAS. Тоже смотрю в сторону Пентахо.

    А каким образом реализован просмотр кубов? Есть свой клиент или через веб интерфейс можно крутить кубы?

    Reply
  3. pt_olga

    автор, пишите дашборд как хотите, не обращайте внимание на тех, кого что-то бесит (1) 😉

    а статья хорошая, кому-то может пригодиться

    Reply
  4. bandy18

    (3) stanru1,

    на первом (стартовом) слайде показан веб-клиент для просмотра куба и публикации полученных срезов.

    к сожалению Pentaho CE имеет несколько других клиентов для просмотра кубов, на мой взгляд менее удобных чем в Pentaho EE.

    Если Вы уже имели опыт применения MSAS, то использовать Pentaho OLAP (mondrian) вам будет значительно проще, т.к. использование MDX практически идентично.

    (2) DoctorRoza,

    разговор идет о применении OLAP сервера для обработки большого количества данных. Применение отдельного сервера для анализа данных всегда более продуктивно чем использование встроенных обработок или решения OLAP задач с помощью Excel таблиц.

    Reply
  5. bandy18

    (3) stanru1,

    еще, Mondrian поддерживает XMLA протокол.

    я сам не пробовал, но видел в сети десктоп-клиентов типа Rex (waRehouse EXplorer), которые могут смотреть и в Pentaho и в MSAS.

    Reply
  6. Yashazz

    Дельно. Надеюсь на развитие темы.

    Reply
  7. monsta

    В 2005 у Инталева нечто подобное не взлетело

    Reply
  8. SkorikA

    Понимаю что сейчас меня забросают камнями — но все же попробую задать вопрос.. Кто может мне рассказать что такого нельзя сделать 1С (например, связкой СКД+агрегаты) и что есть в OLAP (в части получения/формирования отчетов)? Буду очень благодарен если кто-то мне кинет ссылку на подходящую статью.

    Reply
  9. gaglo

    (5) Насчет «большого количества данных»: пожалуйста, дайте оценку, какое количество данных можно считать уже достаточно большим, чтобы описанный подход был заметно быстрее встроенных обработок. Ну там десяток тысяч документов, сто тысяч, миллион?

    Reply
  10. AlX0id
    создадим набор Views для MS SQL Server

    Странным образом коррелирует с названием статьи.. От 1с тут чуть больше, чем ничего.

    Судя по всему, при создании чуть более сложных отчетов, нежели выборка справочников, процесс разработки затянется..

    Reply
  11. pt_olga

    (10) gaglo, в количестве документов не скажу, но мы в свое время использовали OLAP для построения отчетности за последние 3 года.

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

    Вообще для отчетности больших баз можно конечно использовать отдельную БД 1С, но если шаблоны отчетности практически не изменяются, то куб обслуживать проще и реально работает быстрее, плюс не нужны лицензии 1С. Был опыт создания кубов на SQL, а просмотр отчетов в Excel, получая данные из внешнего источника. Дешево и сердито. 🙂

    Reply
  12. monsta

    (12) А 1С:Консолидацию не пробовали использовать?

    Reply
  13. stanru1

    (9) SkorikA, я могу из своего опыта пример привести.

    Да, в 1с можно на СКД изобразить все то же самое, что и с помощью кубов, но!

    Кубы дают поразительную возможность пользователю манипулировать данными: выбирать одним движением мыши различные разрезы, показатели и т.п.

    Например, смотрим продажи за период в разрезе партнеров. Раз, добавляем себестоимость и величину наценки. Раз, и смотрим то же в разрезе товарных групп. А теперь — по поставщикам. А теперь — по регионам, куда доставляли товар. Кубы на то и многомерные, что из одной таблицы данных в связке с измерениями можно получить огромное количество срезов данных.

    Еще один плюс кубов в том, что они в разы быстрее соответствующих отчетов в 1С. Таблица данных для кубов сознательно денормализована: с целью хранения данных ее использовать не стоит, а вот для быстрого получения аналитики это то, что нужно.

    Reply
  14. SkorikA

    (14) Хранить данные и не предполагалось, то, что таблица избыточна — и так понятно (равно как и таблица итогов/агрегатов в 1С).

    Кубы дают поразительную возможность пользователю манипулировать данными: выбирать одним движением мыши различные разрезы, показатели и т.п.

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

    Встречный вопрос: а насколько [просто/удобно/прозрачно] в кубе можно настроить сложный расчет итоговых полей (например цена, % скидки, % выполнения плана — т.е. когда показатель рассчитывается в контексте текущей группировки от других показателей)?

    Кубы на то и многомерные, что из одной таблицы данных в связке с измерениями можно получить огромное количество срезов данных.

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

    По производительности — здесь я согласен что СКД может проигрывать, однако при правильно подготовленном регистре эта разница будет не существенна. А возможность формировать отчеты в фоновом задании подслащает пилюлю:-)

    Так же, насколько я понимаю, отдельно стоит вопрос актуализации данных в кубе — т.е. какой-либо механизм подготовки данных или трансляций (не люблю это слово после Инталева:-( ). Что не позволяет (или позволяет, но с накладками) получать отчеты по текущим данным — т.е. механизм OLTP

    p.s. Перечитал свое сообщение. Если у вас возникло ощущение что я хочу потролить — уверяю, это не так — только желание разобраться в области.

    Reply
  15. gaglo

    (12) это не опечатка?

    если шаблоны отчетности практически не изменяются, то куб обслуживать проще

    Мне показалось, что в числе прелестей куба находится как раз возможность лёгкого изменения шаблонов.

    Reply
  16. AlexanderKai
    По производительности — здесь я согласен что СКД может проигрывать, однако при правильно подготовленном регистре эта разница будет не существенна. А возможность формировать отчеты в фоновом задании подслащает пилюлю:-)

    Просто интересно, а вы замеряли?

    Reply
  17. V_V_V

    (15)

    я согласен что обычному средне-рядовому пользователю разобраться в настройках СКД не очень просто

    с кубом у некоторых пользователей могут возникнуть не меньше проблем. А у администраторов доступа — проблемы с разграничением данных…

    Но я не противник кубов! 🙂

    Reply
  18. SkorikA

    (17) Замерял. Используя секундомер и субъективные ощущения. СКД проигрывает при «больших» (30-50 страниц текста и больше) отчетах. Т.к. огромное время тратится просто на перегонку данных между сервером и клиентом и их отображение. Вопрос целесообразности отображения таких [«больших»] отчетов оставим в стороне.

    (18) Так и я не противник кубов:-) Я просто отношусь к ним достаточно сдержанно (не считаю их серебряной пулей в «отчетостроении»). Но согласен, что в умелых руках они могут творить чудеса:-)

    К сожалению, не IT пользователям кубы увидеть так и не довелось — поэтому статистики удобства пользования/настройки/администрирования куба я не имею.

    Reply
  19. AlexanderKai

    (19) SkorikA,

    Меня в СКД больше всего раздражает, что это черный ящик, и если какая-нибудь «нештатная» проблема случится, то ковырять можно очень долго.

    Т.к. огромное время тратится просто на перегонку данных между сервером и клиентом и их отображение.

    Тут 1С конечно вне конкуренции.

    Пример: Форма при довольно невинном изменении (видимость = не видимость) полностью перестраивается на сервере, хотя можно было сделать это на клиенте.

    Reply
  20. SkorikA

    (20) Насчет того что СКД это черный ящик, позволю себе не согласиться. Ни разу не сталкивался с тем, чтобы СКД действительно вело себя действительно не однозначно (за исключением явных косяков платформы, которых было не так много). Опыты + ИТС + курс по СКД (от Гилева, не сочтите за рекламу; у Хрусталевой, имхо, не так подробно и глубоко) позволили мне понять принципы его работы и множество неочевидных вещей.

    А для отладки рекомендую консоль компоновки данных в «Инструментах разработчика» (опять же, не сочтите за рекламу).

    По видимости/невидимости ничего не скажу — тоже болезненная тема:-)

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *