Запуск тестирования БД из командной строки.




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

15 Comments

  1. coder1cv8

    А то от 1С пока дождешься чего… 🙂

    Reply
  2. jeckfs

    «C:Program Files1cv81in1cv8.exe» config /FD:1 /NАдмин /DumpIBC:1Cv8Archiv_1C\%date%.dt /IBCheckAndRepair -ReIndex -LogIntergrity -RecalcTotals /OutC:1.txt

    типа того?

    Reply
  3. coder1cv8

    (2) Нет конечно. Это утилита тестирования файловой базы chdbfl.exe, а не ТиИ.

    Reply
  4. z-alexey

    А сообщения она куда-то сохраняет что исправлено, что повреждено?

    Актуальная вещь для филиалов, чтобы по телефону не объяснять куда тыкать для тестирования базы.

    Reply
  5. coder1cv8

    (4) Это просто обертка для chdbfl.exe, программно нажимающая кнопочки… ) Получить текст из окна, лично мне, не удалось, к сожалению…

    Reply
  6. ateymurlu

    a kka mojna zapuskat etot utility ?

    Reply
  7. stellzzz

    так и не воспользовался, хз почему, но в закромах лежит, может когда нибудь пригодится…

    Reply
  8. Babylka

    а в чем кардинальное отличие от проверки не из командной строки?

    Reply
  9. fixin

    (8) в том что можно тупо пользователи не объясняя как это работает, создать ярлык на рабочем столе.

    А откуда она берет путь к файлу CHDBFL? Если например, одинэсок несколько? Можно через параметр указать путь к исполнимому файлу?

    Идея супер.

    Reply
  10. fixin

    не работает, если в имени каталога базы есть русские буквы. Меняет их на какую-то ерунду. Просьба доделать, например если есть русская буква М.

    Reply
  11. Serj1C

    (10) поддерживаю, необходима поддержка русских букв

    (9) поддерживаю, каталог библиотек тоже было бы удобно указать

    Reply
  12. CaSH_2004

    Нашел, обрадовался что кто-то сделал что-то полезное, но «малость» разочаровался.

    Итак по порядку:

    Кто-нибудь пользовался утилитой? Автор я так понял забил на нее, а у меня при запуске вылетает окно с заголовком «AutoIt Error» и текстом:

    Line -1:

    Error: Unable to execute the external program.

    Не удается найти указанный файл

    Явно что написана на скриптовом языке AutoIt, я его не знаю т.к. хватает VBScript, но Википедия пишет что

    …этот язык компактен, самодостаточен и работает на всех версиях Windows «прямо из коробки», без внешних .dll-библиотек и записей в реестре, что позволяет безопасно использовать его на серверах.

    Значит проблема не в наличии AutoIt на ПК, получается автор не зря писал:

    Только для 1С 8.1 …

    Однако это связано не с какой 1С 8.1, а просто жесткой пропиской откуда берется утилита chdbfl.exe, а именно на «%SystemDir%:Program Files1cv81in» (9), соответственно если структуру воссоздать простым копированием любой платформы 1С в такую структуру (каталога bin) то все взлетает, однако с не так гладко как бы хотелось.

    С первого раза она мне вбила в строку ерунду (по несколько одинаковых букв) и вдобавок выкинула окно про то что не может найти точку входа в какую-то библиотеку. Так что стабильность под большим вопросом. Однако она работает — это факт, и восприимает русские символы в пути, странно что у (10)(11) это не взлетело, у меня на Windows XP работает.

    Я такую же делал на VBScript и как раз столкнулся с проблемой что русские символы не передаются, и при помощи VBScript нельзя переключить раскладку. Конечно AutoIt в этом деле получше, но все таки очень убого я бы сказал, если бы было хоть с открытым кодом — то можно было бы подшаманить, а так непонятно что делать дальше с отработавшей chdbfl.exe — ее же по хорошему закрыть нужно после завершения, и выполнять какие-то действия еще. Сама она не закрывается после выполнения, так что в качестве инструмента автоматизации — это не прокатит.

    ЗЫ:

    Если кто-то подскажет как решаются проблемы с передачей руских символов и переключением раскладки то я выложу открытый вариант аналогичного скрипта только без жесткой привязки к каталогу. И с ожиданием завершения выполнения с возможностью закрытия утилиты и оповещением.

    Reply
  13. CaSH_2004

    (1)

    А то от 1С пока дождешься чего…

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

    Получилась утилита к другой утилите и к которой нужно дописывать еще утилиту (для создания структуры а-ля 8.1 и отслеживанием завершения выполнения) 🙂

    Да и на запросы сообщества вы среагировали вполне в духе 1С: несколько лет найденным багам «а воз и ныне там». Вот это меня и раздражает в разработчиках: не выкладывайте сырые или полуработающие программы если не готовы их дорабатывать — вы подаете другим дурной пример. Если уж так неймется — то хотя-бы напишите что программа имеет кучу багов, и вы ответственности не несете и поддерживать не будете.

    А уж когда выкладывают утилиты с претензией на исправление чужих недоработок, то это просто улет 🙂 А потом тишина-а-а-а…

    Reply
  14. coder1cv8

    (13) CaSH_2004,

    Да-да, Вы абсолютно правы, все так.

    Уровень ниже плинтуса, багов куча и ответственности я, ясен пень, никакой не несу.

    Когда-то, давным-давно, выкладывал здесь что-то.. Теперь занимаюсь более интересными вещами чем 1С и размещаю свое «творчество» в других магазинах приложений. Сожалею, надо будет выделить время и все здесь подчистить.

    Reply
  15. fixin

    Проблема с русскими буквами решается через преобразование в 8.3 каталог так:

    http://infostart.ru/public/183109/

    Проблему с путем 1с81 можно решить через символьную ссылку (начиная с VISTA через mklink, ранее — через сторонние утилиты):

    mklink /D «C:Program Files (x86)1cv8in» «%Program Files%1cv81in»

    Результат: символическая ссылка создана для C:Program Files (x86)1cv8in <<===>> %Program Files%1cv81in

    Проверил — вот так нужно делать:

    Система = Новый COMОбъект(«WScript.Shell»);

    Команда = «mklink /D «»%ProgramFiles%1cv81in»» «»» + КаталогПрограммы() + «»»»;

    Сообщить(Команда);

    Система.Run(«cmd /C » + Команда, 0, 0); //первый 0 — невидимо, второй 0 — не ждать.

    //Система.Run(«cmd /K » + Команда, 1, 0); //первый 0 — невидимо, второй 0 — не ждать. для отладки /K

    Работает!!!

    Reply

Leave a Comment

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