Расширенные дополнительные возможности




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

16 Comments

  1. Хряк

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

    А вообще понравилось!

    Reply
  2. Diamond

    Исправил. Спасибо за информацию.

    Reply
  3. Хряк

    ИМХО, поторопился ты заявить об иправлении… :(((

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

    Reply
  4. Diamond

    Вроде всё работает. Ты уверен что обновил обработку? Дата обработки должна быть 20.05.06

    Reply
  5. CheBurator

    было бы хорошо если возможно просмотреть описание обработки.

    Есть такое?

    Reply
  6. Diamond

    Теперь можно

    Reply
  7. mdzen

    Если Отчеты.Уровень<0 Тогда

    Если запустить в пустом каталоге выдает ошибку:

    {C:ОБРАБОТКИ_1С_77ДОПОЛНИТЕЛЬНЫЕВОЗМОЖНОСТИ.ERT(77)}: Операции сравнения на больше-меньше допустимы только над значениями совпадающих базовых типов (число, строка, дата)

    Побеждаем так:

    Код
     Если Число(Отчеты.Уровень)<0 Тогда 

    Показать полностью

    и т.д.

    И еще:

    Если (Отчеты.ТекущаяСтрока()>0) и (Отчеты.Уровень>=0) Тогда

    {C:ОБРАБОТКИ_1С_77ДОПОЛНИТЕЛЬНЫЕВОЗМОЖНОСТИ.ERT(80)}: Операции сравнения на больше-меньше допустимы только над значениями совпадающих базовых типов (число, строка, дата)

    Побеждаем так:

    Код
     Если (Отчеты.ТекущаяСтрока()>0) и (Число(Отчеты.Уровень)>=0) Тогда 

    Показать полностью

    Reply
  8. mdzen

    Нелохо было бы сделать поле описания на форме со скроллингом ( фОписание ) , заменив текстовое поле полем ввода многострочным неограниченной длины., тогда можно будет спокойно просматривать длинные описания — мелочь, а юзеру приятно.

    Reply
  9. Diamond

    mdzen: исправил баг, только более простым способом. спс

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

    Reply
  10. mdzen

    Сам использую нечто подобное данной обработке для навигации по обработкам и отчетам на флэшке — весьма удобно.

    Когда информации много — длинное описание весьма полезно.

    Reply
  11. CheBurator

    Попжите картинку, хоть посмотреть как это выглядит!

    Reply
  12. Хряк

    Добавил отчет из другой папки (т.е. не из папки БД)

    лТекст.Открыть(лФайлОписания);

    {D:1C_DB\__WORKSACCBARS6EXTFORMSДОПОЛНИТЕЛЬНЫЕВОЗМОЖНОСТИ.ERT(90)}: Неверное имя файла

    И такая хрень выходит дважды.

    Reply
  13. Diamond

    Хряк: зафиксил баг

    выложил картинки

    Reply
  14. coch

    +1

    Спасибо, в ближайшее время буду вставлять в свою конфу.

    Как предложение

    >ОткрытьФорму(«Отчет», «Менеджер», КаталогИБ() + «ExtformsДополнительныеВозможности.ert»)

    >в этом случае открются отчеты из папки Катало

    Reply
  15. Diamond

    coch: спасибо

    Reply
  16. lelusha

    До сих пор работаем с доп возможностями, и эта обработка, как ни странно, еще актуальна. Спасибо разработчику.

    Reply

Leave a Comment

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