Удаление документов за определенный период




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

8 Comments

  1. ice-net

    Что скажете про битые ссылки, некорректные остатки и,возможно, минуса по регистрам?

    Типичный пример того как не стоит никогда поступать..

    Ладно бы сделали для какого-нибудь клиента, который с ломаной 1с работает через пень-колоду и забрали гонорар, но что подтолкнуло Вас выложить это «невероятное» решение в массы?

    ПС. А чем именно аргументирован отказ от стандартного решения свертки базы? И, кстати, Вы просто удалили часть документов по своим критериям — это не свертка.

    Reply
  2. user970589

    (1)Я правильно понимаю, что то, что после свертки не удаляется лучше и не трогать? Хотя есть вот невероятные советы — типа после свертки и удаления «Выгрузить данные. Потом проделать обратную операцию: Администрирование — > Загрузить данные. «

    Reply
  3. user777249

    (1)

    Типичный пример того как не стоит никогда поступать..

    Как вы выразились, выложить в Массы» меня побудило то, что подобной обработки я не нашел на просторах, Интернета(замечания, что плохо искал будут уместны). Это обработка, и конкретно мой случай, никак не являются руководством к исполнению, а скорее возможный при некоторых условиях вариант событий. И даже если это «Типичный пример того как не стоит никогда поступать.. » думаю что многие извлекут из этого урок до того как начнут делать.

    По некорректным остаткам забыл сказать что, после завершения они были введены вручную. Соответственно минуса, скорректировались. Но еще раз напоминаю это мой конкретный случай, руководствоваться им «НЕ ОБЯЗАТЕЛЬНО». Ситуации бывают разные, потому думаю, что при некоторых условиях она может помочь решить часть проблем. Если эта публикация обидела чьи-то профессиональные, патриотические или религиозные чувства, приношу свои судорожные извинения.

    Reply
  4. Vovan1975

    чем так сношаться можно было развернуть из конфиги пустую копию базы и универсальной обработкой обмена перегрузить НСИ и документы за нужные периоды

    Reply
  5. user777249

    (4)

    чем так сношаться можно было развернуть из конфиги пустую копию базы и универсальной обработкой обмена перегрузить НСИ и документы за нужные периоды

    Это было первое что я попробовал, после переноса не сходились остатки за перенесенный период. Вариантов перепробовал огромное множество. Не утверждаю что нет других вариантов решения, просто в процессе этот решил поставленную задачу(можно сказать повезло), дальше я рассматривать не стал. Еще раз — эта обработка не предназначена для решения подобных задач, она лишь является дополнительным инструментом которая может помочь при определенных обстоятельствах.

    Reply
  6. Vovan1975

    (5) ну как бы они и не должны сходиться. Ввод первоначальных остатков никто не отменял.

    Вообще для бухии это просто гениальное решение. Интересно что у вас там с книгой покупок и продаж.

    Reply
  7. ice-net

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

    А в текущем случаем можно было не заморачиваться и сделать как предлагали в (4), все равно результат идентичный (остатки корректируете руками).

    Reply
  8. apostal86

    «Опасный» вариант «свертки базы». Настоятельно рекомендую все «не обязательно» (3) в предостерижительной и настоятельной форме и ярко выделить в основном тексте публикации. А так же требование о бэкапе базы пропишите от греха подальше. А то, как выясняется по комментариям, что в публикации не полностью описана суть вашей «свертки базы», так что найдется кто-нибудь неопытный или слишком расторопный — и его проблемы от использования данной публикации окажутся на вашей совести. А Вы, я в этом уверен, не желаете допустить такого развития событий. У Вас же есть желание, чтобы этим инструментом другие пользователись — затем и разместили здесь.

    Reply

Leave a Comment

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