Автоматизация контроля границ




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

18 Comments

  1. yogaga

    Местами несколько заумно, но в целом статья полезна.

    Не совсем понятна необходимость ретроспективного анализа для текущей оперативной деятельности, можете пояснить?

    Reply
  2. 1c-intelligence

    (1)

    Местами несколько заумно

    это ж учебник. Но замечание учту.

    Не совсем понятна необходимость ретроспективного анализа для текущей оперативной деятельности, можете пояснить?

    это не для текущей оперативной деятельности. Об этом будет отдельный параграф.

    Reply
  3. yogaga

    На практике наибольшую сложность вызывают процессы, предполагающие несколько итераций, и требующие параллельной работы нескольких исполнителей, например, согласование договора, когда каждый согласующий смотрит свою часть, и в случае разногласий с контрагентом могут быть повторные итерации. Как тут лучше всего организовать контроль и оценку процессов?

    Reply
  4. pm74

    Время нахождения в очереди -мысль хорошая нужно будет это использовать

    Reply
  5. acanta

    Вы ничего не путаете с процессом принятия решения?

    Reply
  6. 1c-intelligence

    (4) на эту тему еще будет информация, здесь лишь вскользь упомянуто.

    Reply
  7. 1c-intelligence

    (5) принятие решения — это не процесс, а действие. Ровно такое же, как обработка детали на фрезерном станке, или создание отчета о прибылях и убытках. К нему применимы те же метрики, что и к остальным действиям.

    Трудность в том, что «принятие решения» считается чем-то вроде таинства. Такой миф искусственно создан и поддерживается менеджерами. Иначе их разогнать придется.

    Программный код, когда исполняется, постоянно решения принимает. Помните, типа

    Если КоличествоИтераций > 1000 Тогда

    Прервать;

    КонецЕсли;

    И никакого таинства. Идет процесс, дошел до точки принятия решения, исполнил это действие, и пошел дальше.

    Reply
  8. 1c-intelligence

    (3) ваш вопрос затрагивает несколько параграфов учебника, которые еще не опубликованы. С вашего позволения, не буду давать спойлеров.

    Reply
  9. yogaga

    (8) Ну так не интересно, по частям отлавливать ответы на конкретный вопрос…

    Reply
  10. 1c-intelligence

    (9) ну, у меня варианта два: или на вопросы отвечать, или новые материалы писать.

    Reply
  11. yogaga

    (10) Любой учебник без рассмотрения практических задач бесполезен.

    Reply
  12. 1c-intelligence

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

    Reply
  13. acanta

    (7)

    действие

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

    Порог выхода, это сумма/количество опыта/навыки/объем работы который человек/команда заработал/приобрел/выполнил на данном рабочем месте. Но каждый рабочий день это процесс принятия решения уйти. Как и каждый бизнес-процесс это набор действий для передачи результата в другую зону ответственности.

    Никакого таинства нет, это факт выполнения определенного плана, о котором зачастую известно. А вот вмешательство в этот процесс с целью увеличить/уменьшить количество итераций в цикле или изменить порог выхода — это нарушение границ. Не говоря уже об изменении этого плана.

    Reply
  14. genayo

    (13) И вот вопрос — а что делать, когда понимаешь, что решение это на самом деле не твоё…

    Reply
  15. acanta

    (14) Определить порог выхода и количество итераций лица принимающего решение.

    Reply
  16. genayo

    (15) Решение принимаешь ты, но в итоге оказывается, что на самом деле, никакого выбора решения у тебя не было. Я вот про что.

    Reply
  17. acanta

    Выбор есть всегда. Но мы изучаем ответы на тесты для экзамена 1С-Профессионал. И проблема в том, что решение всегда находится вне множества «правильных ответов».

    Reply
  18. mcgoblin

    Было бы не плохо добавить ссылки на прошлые статьи из этого цикла.

    Reply

Leave a Comment

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