Резервное копирование информационных баз 1С:Предприятие 8 с помощью xStarter




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

17 Comments

  1. alexk-is

    Здесь есть список ссылок на публикации аналогичной направленности http://infostart.ru/public/19363/

    Reply
  2. director04

    Программа может и многофункциональна, но рядовому пользователю слишком замудрена. Есть варианты значительно проще, а возможно и функциональнее (ну хотя бы Гендальф)

    Reply
  3. tomvlad

    (2) А никто и не говорит о рядовом пользователе. Речь прежде всего о администраторе базы данных или продвинутом пользователе. Лично мне довольно удобно, что приходя на работу, меня ждет свежая тестовая база, где я могу не опасаясь, моделировать различные ситуации, искать ошибки и т.п. Ни один архиватор не даст тех возможностей, которые можно настроить здесь. Да, придется немного потрудиться, зато потратив 30 минут во время первоначальной настройки можно забыть об этом достаточно удобном планировщике, переложив на него часть рутины.

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

    Reply
  5. tomvlad

    (4) Предлагаемый вариант и не рассчитан на работающих пользователей. И это не самый большой его недостаток. Отключение пользователей неактуально для файловой версии и не существенно для клиент-серверной версии, если не пользоваться стандартными возможностями системы 1С:Предприятие. Кстати, задание на отключение пользователей можно запланировать и перед архивацией, но в данном контексте важно не оно, а возможность практически безграничного количества вариантов настройки администратором, а как один из вариантов — создание тестовых баз. Все же утилиты для создания архивных копий ориентированы в основном на кнопконажимателя, которому потратить полчаса на настройку системы под себя либо жалко, либо не хватает знаний.

    Reply
  6. a-novoselov

    (0) Как этой программой отрубить пользователей базы? Особенно тех, кто еще не выполнил вход, т.е. закрыл окно терминального клиента с окном выбора пользователя и ввода пароля… которых даже установкой блокировки ИБ не выкинуть.

    Reply
  7. tomvlad

    (6) «Эта» программа тут ни при чем. Это просто один из самых продвинутых планировщиков. Остальное зависит от Вашей фантазии.

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

    ragent.exe -stop

    ragent.exe -start

    и после этого уже запускать задачу на бэкап

    Reply
  8. a-novoselov

    (7) Если уж заводить разговор про самый продвинутый планировщик, то с http://www.autoitscript.com/autoit3/downloads.shtml xStarter врядли сравнится 🙂 А вообще хорошая программа, только для запуска .cmd файла сисадмину win планировщика более, чем достаточно.

    Reply
  9. den_vladimir

    я этой прогой уже полгода пользуюсь, хорошая прога, но, соглашусь, мудреная! Но я просто архивирую. Если архивация не прошла — запускаю заново.

    Reply
  10. VEkaterina

    Супер ❗ Возник только вопрос, как прописать пароль пользователя, из-под которого запускается приложение?

    Reply
  11. VEkaterina

    вопрос снят (нашла ответ при настройке клиент-серверного варианта) 😳

    Reply
  12. strange2007

    Пользовался ей очень давно, думал это круто. Планировщик+cmd+архиватор рулят

    Reply
  13. lsp71

    Спасибо за приличный планировщик.

    Reply
  14. Greypro

    Проще будет если поставить прогу Saver. Настройки простые работает с rar,zip. У меня она давно стоит отлично работает проблем нету. Советую посмотреть!

    Reply
  15. Boris-Leleko

    Скажите пож-ста кто-нибудь. Я так понял в квадратных скобках указывается время. Я попробовал вставить переменную среды %DATE% но ничего не помогло. Пришлось в батнике сделать и запускать этот батник. Кто-нибудь знает как текущее время вставить?

    Reply
  16. sinjevla

    Пример хороший но есть пару но

    1. Как выгонять зависших пользователей

    2. Удалять старые архивы

    Если это все решить то было бы просто супер

    Reply
  17. alenakrr

    Как выгонять зависших было описано выше — рестартовать службу агента.

    А удалять старые архивы также как и создавать — смотрите картинки — там можно удалять файлы старше количества дней (см. 4-ю картинку). Просто хранить копии надо по блокам: за год и за месяц удалять не надо, за неделю надо удалять через месяц, за день надо удалять через неделю.

    Пробуйте))

    Reply

Leave a Comment

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