Выгрузка журнала регистрации




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

49 Comments

  1. betepon

    Что-то не получается.

    Задаю период 01.03.09 — 31.03.09

    Задаю колнонки — все.

    Нажимаю выполнить получаю XML с заголовком но без данных.

    Задача — выгрузить из ЖурналаРегистрации все записи за период.

    Reply
  2. anderson

    (1) странно. При тех же параметрах у меня выгружается 😐 . Может еще какой отбор установлен?

    Reply
  3. betepon

    (2) Еще раз.

    ни один Фильтр не устанавливаю.

    Период 01.03.09 — 31.03.09

    Колонки — Все

    Выходной файл задал

    Обработка работает где-то полминуты.

    Результат — файл размером 194 байта содержащий строку

    <?xml version=»1.0″ encoding=»UTF-8″?>

    <v8e:EventLog xmlns:v8e=»http://v8.1c.ru/eventLog» xmlns:xsd=»http://www.w3.org/2001/XMLSchema» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»/>
    Reply
  4. betepon

    (3) elf файл не указываю — выгрузка из текущей базы.

    Если использую в вашей обработке конструкцию

    ВыгрузитьЖурналРегистрации(ВыходнойФайл, , , ВходнойФайл);

    Тогда появляется XML размером 282 Мб

    Обнаружил следующее — скорее всего это глюк процедуры ВыгрузитьЖурналРегистрации

    Когда просматриваю журнал регистрации через сервис — журнал регистрации, вижу записи за период 01.03.09 — 31.03.09, по если посмотреть в XML после выгрузки процедурой

    ВыгрузитьЖурналРегистрации(ВыходнойФайл, , , ВходнойФайл);

    то в середине XML наткнулся на следующее:

    Одна запись за 2008-04-16, а следующая запись за 2009-08-26. и дальше журнал идет с 2009-08-26 по сегодняшнюю дату.

    Вопрос №1 — что бы это могло быть

    Вопрос №2 — как это можно исправить.

    Данные то есть в журнале. Я их вижу.

    Reply
  5. anig99

    А журналы у Вас не архивируются регулярно?

    Reply
  6. betepon

    (5) журналы архивируются.

    Но не в этом дело, как я понимаю.

    Журнал регистрации показывает данные, а ВыгрузкаЖурналаРегистрации их не выгружает.

    Спрашивается, откуда Журнал регистрации берет данные, и почему эти данные не видит ВыгрузкаЖурналаРегистрации.

    Reply
  7. anderson

    А что будет если зайти в Журнал регистрации и там сохранить как xml-файл? Тоже часть данных выпадает?

    Reply
  8. betepon

    (7) Происходит нечто странное картинки по шагам.

    1. Задаю интервал данных

    2. Получаю результат



    3. Пытаюсь получить табличный документ



    4. Получаю табличный документ, но он оказывается пустым



    5. И отбор тоже оказывается пустым. А ведь только что был.


    Reply
  9. anderson

    (8) к сожалению, ссылки не открылись. Может действительно что-то связано с архивированием журнала (5)? Март у Вас не выгружен в архивный файл? У нас журнал не архивируется и все хорошо 🙂

    Reply
  10. betepon

    (9).

    В прикрепленных файлах картинки

    Reply
  11. betepon

    И вот еще

    Reply
  12. betepon

    Собственно говоря хотелось уменьшить архив журнала регистрации (там уже 300 мб).

    И для этого предполагалось выгрузить записи помесячно в xml, а потом убрать старые логи.

    Reply
  13. anderson

    (10), (11) интересно…

    (12) XML по-любому будет занимать больше места чем сам журнал регистрации, так что мне кажется логичнее просто скопировать журнал в какое-то файловое хранилище. Оттуда XML можно получить этой же обработкой, а дальше закинуть в отчет

    Reply
  14. anderson

    кстати (12) у нас журнал регистрации 6 Гб )))

    Reply
  15. betepon

    (13)

    Не понимаю я что-то. Данные есть, но выгрузить их нельзя.

    Предполагается, что данные будут хранится в xml по месяцам, и оттуда их читать.

    А вот выгрузить я и не могу.

    Может есть что-то, чем можно напрямую log файлы читать?

    Reply
  16. anderson

    (15) помясячно не обязательно выгружать данные в XML. можно и стандартными средствами выгружать журнал и читать стандартными средствами

    Reply
  17. betepon

    (16) Вот выгрузка стандартными средствами и не работает.

    За попытку помочь огромное спасибо и «+»

    Reply
  18. anderson

    (17) а почему бы просто не копировать журнал регистрации? в другое место, где нет проблем с дисковым простанством?

    Reply
  19. step_mc

    При открытии обработки выдает:

    {Форма.Форма.Форма(3,7)}: Процедура или функция с указанным именем не определена (ЗначениеНеЗаполнено)

    Если <<?>>ЗначениеНеЗаполнено(ВыходнойФайл) Тогда

    Платформа:8.1.16; конфигурация:УПП 1.2.34

    Reply
  20. privet20044

    Спасибо!!! Очень здорово 😀

    Reply
  21. tango

    + не глядя, просто за развитие тямы, актуально

    Reply
  22. tango

    Коллеги, а с какими объемами вся эта шняга может работать? ну, в гигабайтах

    Reply
  23. anderson

    (22) выгрузке все равно на объем. Лишь бы потом консоль переварила многогигабайтную XML-ку 🙂

    Reply
  24. tango

    (23) «выгрузке все равно на объем»

    сомневаюсь я

    Reply
  25. anderson

    (24) Ну не знаю. Конкретно с журналом регистрации при многогигабайтных XML-ках не работал. Но распределенная база спокойно генерирует файлы по 20 Гб. Думаю и тут платформа справится

    Reply
  26. tango

    Реально сейчас:

    на входе база 7 «настроенная» комплексная, где-то с начала века

    лог — с 01.07.09, размер 1,5 мг

    загружаю лог в базу из одного справочника на 8.1, локально, без скл

    начинаются траблы по нехватке

    Reply
  27. tango

    лин, в 26 наврал, размер лога, щас уточню

    419 MB (440 381 371 bytes)

    Reply
  28. tango

    Идея была такая:

    берем семерошный дог, запихиваем его в 8.1 базу, и там как хотим, строим отчеты.

    всё хорошо, только в файловом варианте 8.1 все настолько тормозит, что хоть нах всё

    ну, блин, и время загрузки тож великовато

    Reply
  29. anderson

    (26),(27),(28) Так проблемы на этапе выгрузки или загрузки? При загрузке думаю легко упереться в ограничение 32-битной системы 🙁

    Reply
  30. sommid

    за что 8.1 обделяете? 🙁

    Reply
  31. anderson

    (30) Извините 😳 уже сконвертировал в 8.2

    Reply
  32. sommid

    пришлось «сконвертировать» вручную в 8.1. работает

    Reply
  33. icemurm

    Как то не так сработала у меня

    Reply
  34. icemurm

    даешь 10 центов)

    Reply
  35. anderson

    (34) подробности в студию! а (35) не понял

    Reply
  36. PVG_73

    Спасибо, удобная вещь.

    Reply
  37. А почему в Консоль анализа журнала регистрации не все поля выдает? Это может быть потому-что я скачала для 8.0, а использую для 8.2

    Reply
  38. lastrain

    база 20 гб sql. все висело минут 20 и все благополучно закрылось. само.

    Reply
  39. anderson

    (39) lastrain, обработка представляет собой графический интерфейс к процедуре, предлагаемой платформой. Могу предположить, что есть какие-то повреждения журнала регистрации и платформа не может корректно их отработать

    Reply
  40. a_a

    Честно говоря не очень поноравился функционал. Попользовался всего один раз больше не пригодилась

    Reply
  41. Ольга_tmp

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

    Reply
  42. anderson

    (43) Ольга_tmp, Всегда можно написать свою с блэкджеком и … выложить сюда на пользу общественности

    Reply
  43. Ольга_tmp

    (44) я думаю что шикарен вариант с блэкджеком и…все таки думаю что моя лень не позволит мне сотворить достойный вариант

    Reply
  44. forever-lilya

    Намного быстрее отрабатывает обработка, удобно. Спасибо! Под себя немного поправила, под свои задачи

    Reply
  45. wbazil

    Обработка очень полезная

    есть один вопрос, как сделать так что бы в колонке данные были данные как и в Журнале Регистрации?

    или же эти данные выгружаются только в ХМЛ а в отчет не попадают?

    http://s43.radikal.ru/i101/1212/b5/92d7ccbb498b.jpg

    Reply
  46. klel

    Спасибо большое за обработку!!! Классная штука и работает быстро, нужная вещь при просмотре изменений чего либо 🙂

    Reply
  47. Ignat_n

    Намного быстрее отрабатывает и были «косяки» в журнале регистрации, она все проблемы решила.

    Reply
  48. weissfeuer

    Поставил плюс за наводку на «консоль анализа».

    Reply
  49. sokir

    Файл — «Сохранить копию» и не надо никакой обработки.

    Reply

Leave a Comment

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