Конфигурация для автоматического ежедневного архивирования баз .dbf v7




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

27 Comments

  1. CheBurator

    имхо вариант решения через PGC/

    вопрос: как бэкапить конфигурацию, созданную для бэкапа других баз?

    Почему не использовать внешнее решение для бэкапов?

    Reply
  2. v.l.

    Классически — конфигуратором. 🙂

    Reply
  3. CheBurator

    А почему бы тогда драгие базы тоже не бэкапить классически — конфигурпатором..? Зачем привлекать доп.средства?

    Reply
  4. v.l.

    Писал для шефа, чтобы он не напрягался с именованием архивов и чтоб база всегда переиндексированная была. А над самобэкапством я сейчас корпю. Добавил к имени архива время. Чтоб можно было несколько архивов в день делать. Немного доработал интерфейс. Но база сейчас на работе.

    Reply
  5. CheBurator

    ну так вопрос вообщем-то без ответа…

    есть конфига с помощью которой бэкапятся конфиги другие. итого — если сломается «инстумент» — пипец всему процессу бэкапирования.

    ИТАК ВОПРОС! вопрос: как бэкапить конфигурацию, созданную для бэкапа других баз?

    Reply
  6. v.l.

    Дык вот и ответа: залил обнофление с самобэкапированием. Выбираешь из списка самого себя (в самом низу), нажимам кнопочку «Переиндексировать и сохранить». После этого нужно нужно будет обязательно закрыть Конфигуратор с Хранителем. А программа из Предприятия сама закроется. Так что, уважаемый Че Бурашка, думаю, Ваш запрос выполнил.

    Reply
  7. v.l.

    А кто теперь спросит: а не хотите ли, чтобы программа сама искала зарегестрированные в реестре базы и может, еще и нарезала диски?

    А я отвечу — хотим. И даже интересно, но лень и шурупов не хватает. Скорее лень.

    Предположительно запустить regedit с параметром командной строки выгрузить ветку HKUSoftware1C1Cv77.7 в текстовый файл и потом обработать. Создать новый элемент в справочнике БазыДанных, пройтись циклом на присутствие уже имеющегося пути и подкорректировать наименование, чтоб всё было как в окошке запуска предприятия. Ну и добавить отсутствующие базы. А еще лучше отдельной обработкой включать флажки на отображение/скрытие баз в списке. ну и т.д. А? Всех перехитрил?

    Reply
  8. v.l.

    2 Che Burasha: А что такое PGC ?

    Reply
  9. CheBurator

    ЗПС это… пунтосвитчер перекинул… ;-0)

    Reply
  10. v.l.

    2 Che: а… А что тогда ЗПС? (а я на пунто недоволен — он как кейборд ниндзя не может перекинуть произвольнй кусок текста или корректно отменить. ему по-горячему подавай.)

    Reply
  11. CheBurator

    может произвольный кусок — выдели и горячей клавой…

    поставил я короче в конторуу mz архиватор и все….

    ЗПС — антипод ППС (летчиков спроси)

    Reply
  12. v.l.

    про mz говорят, он платный…. кряки ищут

    Reply
  13. Abadonna

    Начинаю беззлобно критиковать:

    1. Папку для Админа «Хранитель» мог бы в архив и положить (места не занимает пустая). А то при запуске сразу «Рабочий каталог пользователя не обнаружен»

    2. Выбор справочнике пути к базе можно было бы приделать из через ФС. Лично мне влом туда готовую строчку с путем вносить.

    пока всё… дальше еще не смотрел

    Reply
  14. v.l.

    По просьбе Abadonna добавил каталог пользователя в архив, который «готов к употреблению».

    Reply
  15. CheBurator

    mz — 400 руб стоит — не так уж и много, если для фирмы покупать… всем кому поставил — все довольны.

    Reply
  16. v.l.

    ик. и не так страшно. а то на одном форуме чел. разорялся, что не может mz взломать, а платить нету.

    Reply
  17. v.l.

    По посту 13 «Влом готовую строчку вносить» — предлагаю в окне со списком баз нажать кнопочку Изменить, потом из окрывшегося диалога скопировать готовый путь в буфер обмена.

    Reply
  18. Borisych

    (17) категорически не согласен

    Хотя бы диалог выбора каталога открывал и от туда путь

    Но лучше из списка баз, и список пользователей тоже исходя из текущей базы

    Reply
  19. v.l.

    (18) Давно хотел сделать автозаполнение списка баз из реестра. Вот, как уже 2 года …

    Я Вас оповещу, как сделаю.

    Reply
  20. Borisych

    (19) Спасибо

    Reply
  21. roskmv

    А вот ссылка на vbs-скрипт который умеет работать не только с 7.7, но и с 8.1 — 8.2

    + дополнительные функции !

    http://infostart.ru/public/72057/

    Единственно не имеет собственной оболочки, но это нисколько не влияет на его функциональность. 🙂

    Reply
  22. v.l.

    (21) Спасибо, это тоже интересно.

    Reply
  23. v.l.

    (21) Ваш скрипт помог сохранять файловые базы на 2003 сервере.

    Reply
  24. flaks

    Спасибо

    Reply
  25. EVGENSPB

    Спасибо. Для домашнего использования установил.

    Reply
  26. mt111

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

    Reply
  27. v.l.

    (26) Пожалуйста.

    Reply

Leave a Comment

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