Обработка удаляет выбранный объект (безвозвратно!!!)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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. WiseSnake

    Что со ссылками на этот объект делает?

    Reply
  2. I_G_O_R

    УниверсальныеПодборИОбработкаОбъектов.epf — поделка от 1С, удаляет непосредственно, и еще много что делает, зачем изобретать велосипед???????

    Reply
  3. Borisych

    (1) ссылки бьются, естесственно

    Reply
  4. Borisych

    (2) спасибо, не пользовался

    Reply
  5. DimaP

    я тоже такое делал, меня потом залошили )))))

    Reply
  6. WiseSnake

    (3) Не вижу смысла в такой обработке.

    (5) Ну посмотрите сколько людей скачало…

    Хотя кто нибудь все равно скачает и испортит свою базу…

    Вы написали что она удаляет объект безвозвратно, но не написали, что она нарушает ссылочную целостность…. Считаю обработку вредной. Посему минус

    Reply
  7. Душелов

    Люблю разработки в 1 пару строк.

    Reply
  8. Borisych

    (6) Виноват, в описании не добавил предупреждение об опасности использования, я и не рекомендую пользователям пользоваться удалением объектов без контроля ссылочной целостности, у меня возникала и неоднократно такая небходимость — быстро и удобно решает мои потребности, поэтому и выложил пару строк кода оформленные в виде маленькой обработки ДЛЯ ПРОГРАММИСТОВ

    Reply
  9. Vitek

    (7)Собери лучше коллекцию перенумероваторов 🙂

    Reply
  10. GerHard

    Борисыч, ты не прав. 😉

    Это прям «вирусная реклама». Ещё допиши: «Починю случайно битую этой обработкой базу. Недорого» :-)).

    Reply
  11. Borisych

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

    Reply
  12. WiseSnake

    (11) Одно дело салата и хлеба. А другое дело своих собственных пальчиков )))

    У меня вот за довольно продолжительную практику никогда не возникло таких потребностей. Спросите почему? Да потому что себе дороже!!

    Ну назовите хоть одну ВАЖНУЮ причину для применения данной обработки?

    Reply
  13. Borisych

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

    Reply
  14. 02RUSlan

    Борисыч, ну ты Мозг!

    Reply
  15. Alraune

    А это точно для 8.1? Мне выдало вот что

    1С:Предприятие 8.1 (8.1.15.14)

    Управление производственным предприятием, редакция 1.2 (1.2.23.2)

    Reply
  16. Borisych

    нет, для 8.2. 8.1 уже больше года не в ходу

    Reply
  17. xxl_1

    Мало того что изобретен велосипед, она еще и вредна изначально, так как нарушает ссылочную целостность базы.

    Для самоубийц адназначна

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

    Для этого есть стандартные инструменты от 1С (ПоискИЗаменаЗначений)

    Reply

Leave a Comment

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