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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *