Принцип "Айсберг"




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

23 Comments

  1. genayo

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

    Reply
  2. 1c-intelligence

    (1) мне кажется, вполне можно в 1С сделать. У большинства людей только 1С да сайт есть.

    Reply
  3. Timur.V

    Заодно и систему восходящего реагирования можете выстроить. Например, сначала просрочку в дефицитке показывать снабженцу. Через сутки, если не устранил – начальнику снабжения. Через трое суток – коммерческому директору. Через неделю – директору.

    Это перекликается с 1С-Документооборотом ))

    Там есть эскалация до руководителя, в случает пропуска срока исполнения.

    Reply
  4. 1c-intelligence

    (3) да, есть в ДО такая штука.

    Reply
  5. acanta

    В противовес айсбергу есть система «все к лучшему в этом лучшем из миров».

    Эти позиции не заказаны снабженцами — значит они не нужны клиентам/сняты с производства/изменились условия закупок.

    Вариант — убрать из активного прайс-листа и найти замену.

    Напоминания в ДО приведут к тому, что само ДО превратиться в спам и перестанет работать как система взаимодействия.

    Reply
  6. pm74

    (0) еще некоторую информацию можно вытянуть из жр ,

    автозадачи рулят однозначно ,

    еще есть способ «светофоров» — это когда состояние процесса можно однозначно сопоставить документу, исполнителю и состоянию документа (мб регистра или другой сущности ). Это «шифруется» определенным цветом и выводится в журнал/отчет/табло . Многократная и мгновенная визуальная оценка позволяет оценить кто же в процессе постоянно самое слабое звено и , на выбор, исправить сам БП или выписать исполнителю волшебный пендель. Последнее кстати дополнительно стимулирует побыстрее «переключить сфетофор» и ускоряет процесс.

    Reply
  7. 1c-intelligence

    (6)

    автозадачи рулят однозначно

    вы пользовались автозадачами?

    Reply
  8. pm74
  9. genayo

    (8) О, а вот и практическая реализация. Статья однозначно полезна 🙂

    Reply
  10. 1c-intelligence

    (8) мне показалось, мы о разных автозадачах говорим. Я — вот об этих.

    Reply
  11. 1c-intelligence

    (9) мне показалось, или вы мне первый раз плюсик поставили?

    Reply
  12. genayo

    (11) Не помню, если честно. Я плюсики ставлю, чтобы публикация в избранное попала и проще найти, а ваши статьи итак найти просто.

    Reply
  13. pm74

    (10) без разницы

    пример » светофоров» на рисунке

    Reply
  14. 1c-intelligence

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

    Reply
  15. genayo

    (14)Хорошо, буду ставить, если для вас это важно.

    Reply
  16. 1c-intelligence

    (12) такие светофоры — объектные, привязаны к ссылкам — документам, процессам и т.д.

    Если нет объекта, то привязывать не к чему. Например, есть процесс «заказ позиций по дефицитной ведомости». Объектов там нет. Одна позиция номенклатуры может требоваться для разных потребителей — заказов покупателей, на производство, в пополнение буфера.

    Привязать светофор не к чему. Не к отчету же привязывать?

    Автозадача как раз и выступает таким объектом. Она берет кусок реальности, выделяет его, и начинает за ним следить. Например, за просроченными позициями в дефицитке. К автозадаче уже можно и нужно приделать светофор.

    Reply
  17. 1c-intelligence

    (15) не то чтобы важно, скорее — полезно.

    Спасибо.

    Reply
  18. pm74

    (16)

    такие светофоры — объектные

    я и говорил про объекты

    Автозадача как раз и выступает таким объектом

    ну да я это и имел в виду

    способы можно комбинировать

    Reply
  19. Rustig
    Кто-то, конечно, припоминает – о, это ведь уже было, не помню, вроде месяц назад, или может полгода.

    есть желания клиентов — которые желательно решить, но платить не хочется,

    есть проблемы — которые рекомендуется решить, но на это нет денег,

    а есть боли клиентов — которые надо решить, иначе потеряем деньги.

    Reply
  20. Rustig

    (14) прикольно, вы хакнули систему лайков

    я думал как разделить систему лайков — на «включить в избранное» и «просто лайк»

    Reply
  21. acanta

    (19) И все это субъективная оценка умноженная на стоимость человеко-часа конкретного субъекта, которую даже нельзя усреднить покером планирования.

    Reply
  22. Артано

    (1)

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

    (1) Клик далеко не крупнотиражное решение. Цена покупки и цена владения достаточно высока. Автор же предлагает методологию, позволяющую малой ценой иметь схожий результат на любом предприятии

    Reply
  23. genayo

    (22) Клик бесплатен на одного пользователя, что даёт определённые возможности. Длительность состояний вычислить в 1С иногда бывает слишком затратно без специально заложенных в архитектуре объектов. А методология нормальная, не спорю.

    Reply

Leave a Comment

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