Портянки




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

30 Comments

  1. genayo

    Хорошо, когда постановщик задачи не знает, что он хочет. А когда хочет именно портянку, чтобы потом в ексель её, да так-сяк покрутить? Надо его переубеждать? Или аналитик, который хочет «покрутить» цифры в кубах…

    Reply
  2. 1c-intelligence

    (1)

    А когда хочет именно портянку, чтобы потом в ексель её, да так-сяк покрутить? Надо его переубеждать? Или аналитик, который хочет «покрутить» цифры в кубах…

    в статье речь про руководителей, а не про аналитиков.

    Reply
  3. 1c-intelligence

    (1) важно уметь делать не только портянки. У портянки своя цель, она решает одни задачи, но не все.

    Reply
  4. Timur.V
    Руководитель захочет смотреть отчеты удаленно, через интернет. Желательно – со смартфона.

    Со смартфона можно смотреть графики,

    а табличные отчеты для смартфона могут превратиться в Топ-10. Т.к. много не покажешь.

    Reply
  5. genayo

    (2) Так аналитики предоставляют отчёты руководителям. Не барское дело — самому руководителю по 1С-кам и прочим фигням шариться…

    Reply
  6. 1c-intelligence

    (5) о том и статья. Зачем нужен аналитик в этой цепочке? Если речь о ежедневных отчетах.

    Зачем руководителю по 1С-кам шариться? Если можно в смартфоне на одном экране все увидеть.

    Reply
  7. genayo

    (3) Вот в 1С Документобороте максимально универсальные отчёты, которые можно настроить до необходимого минимума, и в автоматическую рассылку впихнуть. С диаграммами, итогами и отборами.

    Reply
  8. 1c-intelligence

    (6) да, только там данных о продажах нет.

    Reply
  9. genayo

    (7) Чтобы руководителю не напрягаться, конечно. И чтобы программисту не придумывать, как из цифр максимально полезную информацию извлечь.

    Reply
  10. genayo

    (8) А в ERP есть. Принцип тот-же — универсальная «портянка», и крути её сколько хочешь.

    Reply
  11. 1c-intelligence

    (10)

    и крути её сколько хочешь.

    скорее «и крути ее, если хочешь»

    Reply
  12. genayo

    (11) Ну да, чаще всего так 🙂

    Reply
  13. Nio

    Эх а у меня руководители хотя портянку. Сегодня только закончил в один отчет добавлять 30 колонок. Изначально сделал одну где было все консолидировано.

    Reply
  14. starik-2005

    Нет предела совершенству, при этом любой вопрос в предельной сути — это вопрос на «Да» и «Нет».

    Reply
  15. alex-l19041

    (13) это круто из ОДНОЙ колонки сделать 30!

    Reply
  16. JohnGalt

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

    Reply
  17. pm74

    (0) ну если система сама все умеет и знает , может и решения принимать (читай руководить) тоже будет

    сама ?

    Reply
  18. vcv

    Какой-то у вас руководитель пассивный. Сидит и ждёт, когда ему система СМСку пришлёт с одной строчкой информации. А еще, желательно, фамилией сотрудника, которого нужно вые… простимулировать.

    Reply
  19. Hans

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

    Reply
  20. Hans

    (13) Скриншот покажи до и после.

    Reply
  21. genayo

    Пока одни «клепают» отчеты, другие делают вот такие крутые штуки https://habr.com/post/422151/ :))

    Reply
  22. PLAstic

    Хочется спросить автора: а ты сам вообще писал отчёты?

    1) Отчёт с кучей аналитики позволяет настроить различные варианты в одном отчёте, оставив только нужную аналитику.

    2) Отчёты на СКД изначально включают в себя функции группировок, фильтрации, сортировки и прочего, что перечисляется в статье как «а потом он захочет».

    3) Програмист делает такой результат, какой ему сказали сделать. Если сразу дали нужную руководителю форму — именно её он и получит.

    4) Если программист работает стиснув зубы и делает на работу «на отвали», то гнать такого программиста.

    Статья выполнена по схеме «сначала создаём проблематику, потом предлагаем её решение». Но для специалиста видно, что проблематика надуманная. Написал бы просто «а вот ещё один вариант отчётности», без сгущения красок.

    Reply
  23. erazer

    «Работает — не трожь», тем более когда руководитель сам не знает чего он хочет.

    Reply
  24. profiprog1c

    Статья — очередное ведро воды. Да и цель автора этих статей, как он сам как то тут писал в комментах, набить плюсики в рейтинге. По сути, по его же словам, и статьи он начал писать именно для этих целей. Эту статью также не смог прочитать до конца, застрял на половине.

    Reply
  25. Hans

    (24) Думаю автор скоро какой нибудь платный курс выпустит типа «как стать успешным».

    Reply
  26. unpete

    (25) А вы, на пару с профипрогом1с, первыми за этот курс заплатите.

    Reply
  27. profiprog1c

    (25) Да)) У него даже есть своя «история успеха», ускорение х4. Он даже книгу пишет)))

    Reply
  28. Nio

    (20)

    Вот.

    То что стало я не представлю как должно выглядит. Настраиваем. Видимо процесс на несколько месяцев

    Reply
  29. Hans

    (28) а где то что было «По Белокаменцеву».

    Reply
  30. dumsik

    Дельные вещи написаны в статье, но у меня как у программиста сразу возник вопрос по реализации. Для формирования таких управленческих отчетов в информационной системе будет необходимо создавать «обвязку» из метаданных которые будет подсказывать как сворачивать/скрывать/выводить данные в отчете, чтобы все было информативно. Допустим вот Ваш пример с новым оборудованием «Как определять что оно новое, когда и как оно переходит из состояние новое>-текущее». Если допустим определять это по каким-то реквизитам номенклатуры, кто их будет изменять в будущем?. В общем может сложится ситуация при которой пару месяцев отчет будет показывать все правильно, а потом из-за неизбежного устаревания НСИ станет просто показывать погоду. В общем встает вопрос кто будет поддерживать НСИ для таких отчетов в актуальном состоянии, ведь не программист же должен это делать.

    Reply

Leave a Comment

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