OLAP Анализ счёта




Принцип обмена данными из 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='\

37 Comments

  1. Вадимко

    Большой плюс авансом!

    Отлично!

    Как я понимаю нужна ДБФ база и наличие бух. итогофф

    Проверю дома

    Reply
  2. JohnyDeath

    Нее, от базы не зависит. Там куб создаётся штатными «БухгалтерскимиИтогами»

    Reply
  3. Вадимко

    Ясно, проглядел 🙂

    Reply
  4. JohnyDeath

    Сначала была идея сделать всё на прямых запросах с помощью класса berezdetsky, но он работает только в SQL, поэтому отказался. Для Торговли всё попроще и реализуемо как в SQL так и в DBF. Ветку, где я начинал осваивать OLAP и пытал steban’a, наверняка читал: http://www.1cpp.ru/forum/YaBB.pl?num=1164626462

    За что ему ОГРОМНОЕ СПАСИБО!

    Reply
  5. azernot

    Хе-хе… У меня-то побогаче функционал будет (судя по скриншотам). Правда вот не встроенная в 1С сводная получается, а прямо в Excel. Зато измерения произвольные и ресурсы любые 🙂

    Вобщем на мой взгляд идея хорошая.

    Reply
  6. JohnyDeath

    azernot, да, видел, поэтому не спорю. Эту обработку выложил в качестве очередной пропаганды 1с++ и аргументом против тех, кто утверждает, что «семёрке хана».

    Reply
  7. Вадимко

    2(5) Хде оно?

    Reply
  8. Вадимко

    +(7) По-моему нечто подобное выкладывал вроде Steban

    Reply
  9. JohnyDeath

    Наверное вот это: http://infostart.ru/projects/1076/?ref=1630

    А steban делал для ТиСа. Ссылку смотри в (4)

    Reply
  10. Вадимко

    Сеньк, что-то мимо я все гляжу сегодня 🙂

    Reply
  11. steban

    Судя по первому скриншоту, это сделано на основе обработки Максима Головина, впервые опубликованной на hare.ru в 2003 году.

    http://mista.ru/articles1c/hare/article.69.html

    Reply
  12. JohnyDeath

    По наводке Степана немного обновил описание.

    Reply
  13. berezdetsky

    К стати сказать, установка офиса не обязательна — OWC 11 можно бесплатно скачать с микрософта:

    http://www.microsoft.com/downloads/details.aspx?displaylang=ru&FamilyID=7287252c-402e-4f72-97a5-e0fd290d4b76

    Reply
  14. steban

    Бесплатно скачать, конечно, можно.

    Есть одно «НО»:

    Примечание. Если лицензия на программу Office 2003 отсутствует, то лицензия на веб-компоненты Office позволяет использовать их в статическом, автономном режиме на стороне клиента исключительно для просмотра. Если же лицензия на программу Office 2003 имеется, лицензия на веб-компоненты Office позволяет использовать их в интерактивном режиме.

    Reply
  15. JohnyDeath

    Степ, если это перевести эту фразу на понятный язык применительно к данной обработке, то получается примерно следующее:

    «Вы не сможете создать файл куба с помощью этой обработки, а сможете только просматривать ранее сформированный куб».

    Так?

    Reply
  16. berezdetsky

    to steban

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

    Т.е. можно создавать, просматривать и печатать.

    Reply
  17. steban

    Для создания куба нужен только OLEDB provider 4 OLAP. Его, кажется, можно использовать без лицензии.

    Без лицензии на MS Office не будет работать Design Mode для компонентов OWC (проверено).

    «лицензия на веб-компоненты Office позволяет использовать их в интерактивном режиме». насчет этого не знаю. Проверю и отпишусь.

    Reply
  18. JohnyDeath

    Стёп, ну как проверка?

    Reply
  19. Zab

    Очень понравилась разработка. Однозначно плюсую. Ради этого и зарегистрировался. Но есть одна проблемка, при попытке заполнить куб другими данными выводит такое сообщение:

    Выгрузка в cub неудалась: Microsoft® OLE DB Provider for OLAP Services: The cube file ‘c: estunloading.cub’ cannot be opened for writing.

    Помогает только перезагрузка 1С. Можно ли это как-то решить?

    Reply
  20. JohnyDeath

    (19) Да, есть такая проблема. Пока могу посоветовать только выбирать другой каталог выгрузки данных.

    Reply
  21. Трофимов_Николай

    Выгрузка в cub неудалась: Поставщик Microsoft OLE DB для служб Analysis Services 2005: Ошибка OLE DB: Ошибка OLE DB или ODBC : Вылезла такая ошибка.Использую Офис 2007.

    Reply
  22. Zab

    (21) Насколько я понял, 2007 оффис не включает OWC… я решил эту проблемку установив его из комплекта 2003-го.

    Reply
  23. Трофимов_Николай

    (22) Это слишком просто.Я тоже установил OWC из 2003 комплекта…В результате имеем:

    Выгрузка в cub неудалась.Есть еще какие-то варианты(предположения?)

    Reply
  24. JohnyDeath

    (21) а у тебя стоит:

    4. Драйвер доступа к данным MS Access (находится в ODBC Data Source)?

    Reply
  25. Трофимов_Николай

    (24)Да,конечно.

    Reply
  26. quick

    Хорошая тема, если бы было под OpenOffice то цены бы небыло.

    Reply
  27. JohnyDeath

    (26) а ты прочитай комментарий berezdetsky № 13 и следующий комментарий steban’a. Исходя из этого можно сделать вывод, что это реально использовать и под ОпенОфис, если отчеты будут просматриваться в автономном режиме.

    Reply
  28. korpas

    Интересная вещь, спасибо =)

    Reply
  29. korpas

    Кстати, вот есть о проблеме, описанной в (19): http://support.microsoft.com/kb/230958

    Reply
  30. snicke

    Нужно в него добавть проверку на наличие записей иначе ошибку выдает.

    Reply
  31. alexols

    проблему «Microsoft® OLE DB Provider for Analysis Services: Error while processing a partition: ‘Processing error [Source data contains no r» как можно решить ?

    Reply
  32. 7up@online.ua

    скорее, пожелание

    Для ВерсияОфис=10 По 12 Цикл

    Попытка

    Сводная.СоздатьЭУ(«OWC»+ВерсияОфис+».PivotTable»);

    Прервать;

    Исключение

    КонецПопытки;

    КонецЦикла;

    Reply
  33. JohnyDeath

    (32) OWC.12 — нету. 2007-й офис также идет с OWC11

    Reply
  34. 7up@online.ua

    (33) Виноват, пусть будет «По 11». В любом случае, у разных юзеров может быть установлен как ХР, так и 2003

    Reply
  35. JohnyDeath

    (34) Хозяин — барин. Код открыт 😉

    Но я, если честно, Office XP уже давно не встречал

    Reply
  36. respect

    «Неудачная попытка создания объекта (Общие.Форма.Привязка)»

    При открытии пишет

    Что надо сделать ?

    Reply
  37. respect

    (36) Не прочитал хелп. Сори

    Reply

Leave a Comment

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