Удаление значений периодических реквизитов




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

19 Comments

  1. su_mai

    Оформление темы слабовато… Скрины, описалово, принцип действия…

    Reply
  2. su_mai

    Как удаляете периодические значения если они установленны документом?

    Reply
  3. kordell

    Так же как и все остальные «Периодический.Удалить();». А вообще, чтобы не задавать такие вопросы откройте модуль (там все 100 строк) и Вам будет все понятно.

    Reply
  4. vovan519

    Конечно на вкус и цвет товарищей нет…

    Для сравнения: http://www.infostart.ru/projects/2788/

    Reply
  5. poppy

    (3) обработку сам писал? Или помогал кто?

    Перед «Периодический.Удалить();», стоит условие «Если Периодический.ТекущийДокумент().Выбран() = 0 Тогда».

    Т.е. правильный ответ на (2) = Никак…

    Reply
  6. kordell

    (5) Написал её года 3-4 назад. Тогда же и выложил на Proclub.

    Reply
  7. Altair777

    (6) интересно… а зачем выкладывать непроверенную обработку?

    100 строк просмотреть трудно было? Вы же не новичок 🙂

    Reply
  8. kordell

    (7) а в чем проблема с обработкой? Более 900 скачиваний и ни одного нарекания. То что написал «poppy» (5), я вообще не понял ни слова, кроме вопроса сам ли я это написал.

    Reply
  9. larisab

    Выбираю справочник, ВЫБИРАЮ ДАТУ, в 3 ночи дело происходит, не особо читаю предупреждение, не хожу сначала в код, думая, что понимаю логику весь смысл обработки групповое удаление пер.реквизитов на ДАТУ (один на дату я и стандартно удалю) смотрю результаты и холодею — сметены ВСЕ пер.реквизиты на ВСЕ даты, улетела работа за сутки, иду в код, смотрю в коде честно все прописано или весь справочник на все даты или на дату и один реквизит. Я в шоке!!! Убери дату совсем, или сделай еще одно иначе!!!

    Или хотя бы доступность даты убери при НЕВЫБОРЕ элемента справочника. Есть же защита от дурака, должна быть по всем канонам для усталых путников!!!

    Reply
  10. larisab

    не особо читаю предупреждение — просто «на все

    даты» очень похоже «на такую-то дату»…

    Reply
  11. larisab

    Флажки:

    -удалить значения элементов на дату,

    -удалить все значения у всех элементов справочника,

    должны быть взаимоисключающими, или надо переключатели ставить.

    Вот такое мнение, не хотела писать, сама виновата и наверняка на это укажут, но увидела (8) и Остапа понесло.

    Reply
  12. magus

    (8)

    В (5) poppy написала о том, что ты в (3) дал неправильный ответ на (2). Отсюда имхо и возник вопрос, сам ли ты писал? С обработкой вроде все нормально, но знаешь ли ты как она работает?

    Reply
  13. magus

    > Более 900 скачиваний и ни одного нарекания

    Пока только 38 скачиваний. Откуда цифра 900?

    Reply
  14. kordell

    (13) c Proclub

    Reply
  15. Abadonna

    (14)>c Proclub

    Да я уж сто лет не смотрел сколько с проклуба моих накачали! Там уж, поди, за мульон перевалило :))))))))))))))))

    Reply
  16. Dolly_EV

    Вот еще мой скромный вариант: http://infostart.ru/projects/2071/

    Reply
  17. genie

    Хорошая обработочка, мне понравилась ;), сэкономила мне время ;), спасибо автору!

    Reply
  18. www2007

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

    Reply
  19. Ariko-sv

    Я попробовала, мне подходит. Спасибо!!!

    Reply

Leave a Comment

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