Велостыли: Регламентные задания




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

28 Comments

  1. Synoecium

    Спасибо, что-то на ИС мало статей на тему как не надо делать, большинство пишут как надо (все ведь знают как правильно делать).

    Reply
  2. KAV2

    Себестоимость для Директора. — Возможно директор хотел не фактическую, а плановую, то есть cost price.

    Reply
  3. dsdred

    (2)Речь была именно про Факт

    Reply
  4. DAAbramov

    На инфостарте появилась рубрика «Вредные советы»?)

    Upd

    Спасибо, нашел

    Reply
  5. pm74

    С регламентными заданиями давно для себя решил проблему, универсальное параметризованное РЗ + справочник с хранилищем параметров. Вышло вполне удобно. Пытался опубликовать на ИС, зарубили по оформлению, до сих пор болтается в черновиках.

    Reply
  6. kiruha

    Отдельная база для директора решает множество других проблем :

    1) Кроме себестоимости может много чего меняться за день

    2) Ничего не тормозит

    3) Ничего не блокируется

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

    Reply
  7. Synoecium

    (6) кстати да, в статье пишется, что цель у директора была чтобы «себестоимость не менялась» и такую проблему можно решить гораздо проще, но такая копия базы очень полезна и возможно стоит потраченных на неё ресурсов. А бывает что нужна еще и третья база — кроме актуальной копии с неизменной информацией еще и тестовая копия которую можно убивать в хлам и она сама восстановится на следующий день.

    Reply
  8. dsdred

    (6)

    Отдельная база для директора решает множество других проблем :

    1) Кроме себестоимости может много чего меняться за день

    2) Ничего не тормозит

    3) Ничего не блокируется

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

    Обычно, но повторю. Задача была и возникла из-за одного единственного типового отчета на СКД и только для одного человека.

    При этом в конторе около 300 сотрудников, в том числе и финики.

    Reply
  9. ron1

    А мы тоже сделали копию, только на sql, и в ней директор, экономисты, финансисты и другие «исты» делают отчеты, потому что быстро. Обычно их не интересует текущий день, они делают отчеты за прошлые годы и уже закончившиеся кварталы и месяцы. Бухгалтерии удобно тем, что у них перестало тормозить, а «истам» удобно в том, что когда бухгалтерия закрывает период и почти каждый день запускает перепроведение документов это им не мешает . Все довольны.

    Reply
  10. ron1

    п.6 я догадываюсь о каком мобильном приложении речь. Мы тоже помучились, пока руководитель не понял, что это лохотрон.

    Reply
  11. dsdred

    (5)Сильно зарубили?

    Интересно было бы посмотреть на решение.

    Reply
  12. pm74

    (11) вот описание (сорри за качество записывал поздно вечером )

    Reply
  13. dsdred

    (12)Очень хорошее решение, подойдет для http и web сервисов, регламентных заданий. Надо допиливать статью и публиковать.

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

    Однозначно допиливайте статью и публикуйте!!!

    П.С. На ИС смотришь одни Com и XML заголовки мелькают, аж передергивает ;)) Поэтому и статьи стал писать чтобы народ прекращал старье в работе использовать.

    Reply
  14. pm74

    (13) код с тех пор уже сильно изменился , в старом тоже куча недочетов (лишних процедур , серверных вызовов итп) нужен рефакторинг .

    Думал сделать как расширение , жаль только в него регламентное задание не добавить

    Reply
  15. dsdred

    (14) Расширение + дополнительная обработка (БСП:Дополнительные отчеты и обработки) чем не вариант?

    Reply
  16. pm74

    (15) не думал на эту тему , можно попробовать.

    кстати из предыдущего моего комментария может сложиться мнение , что какая то нерабочая поделка, но это не так . Работает уже несколько лет в боевом режиме на 2 базах.

    Reply
  17. dsdred

    (16)Обязательно нужно публиковать!

    Реально то, что хотел писать сам))

    Reply
  18. Stim213
    5 ФЗ и Обработчик ожидания. РЗ чем-то не угодили?

    Это решение видел лично. Задача состоит в том, что нужно было проверять папку с небольшим интервалом и если в папке присутствует файл, обработать его и удалить. База Розница (Серверная).

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

    При использовании в клиент-серверном режиме сервер ни сном ни духом о файлах на клиенте и ваше РЗ или обработка с РЗ не будут иметь доступа к нужным файлам.

    Кроме того, даже если у вас клиент и сервер на одной машине(например, RDP), то, чтобы сервер видел папку пользователя — нужно давать права пользователю, под которым запущен сервер на эту папку. И в этом случае доступ к папке будут иметь все, т.к. что доступно серверу — доступно всем. По этой причине серверный пользователь должен быть максимально ограничен в правах.

    Подробнее можете почитать: https://infostart.ru/public/659098/

    Почитайте немного матчасть, прежде чем критиковать чужие решения.

    Reply
  19. Stim213

    + аналогично по прочим пунктам.

    Поймите же, что при выполнении РЗ серверный пользователь при всем своем(и вашем) желании не сможет увидеть файлы, хранящиеся на клиенте. Для этого нужен толстый/тонкий клиент, который запускается шедулером.

    Reply
  20. dsdred

    (18)В том то и дело, что я в курсе того, что вы описали.

    То есть Вы считаете нормальным решением на сервере по таску батником (в котором указан логин и пароль) открывать толстого клиента с обработкой под определенным пользователем который ломится в некую папку?

    Reply
  21. dsdred

    (19)Я это понимаю, так как описанные выше решения переводил на РЗ.

    Вы правда считаете, что «Папки для обмена» делают на «клиенте» у некого пользователя при клиентсерверном решении?

    Reply
  22. Stim213

    (20)


    То есть Вы считаете нормальным решением на сервере по таску батником (в котором указан логин и пароль) открывать толстого клиента с обработкой под определенным пользователем который ломится в некую папку?

    я не вижу другого решения, невозможно на клиент-сервере выполнить клиентский код в регл задании.

    Простой пример — Клиент-серверная база, пользователи работают по RDP на сервере1. При этом служба 1С запущена на сервере2, к которому никому, кроме админов, нет доступа. Папка с файлами находится на терминальном сервере 1.

    А теперь расскажите, как через РЗ вы организуете чтение файлов этой папки.

    Reply
  23. Stim213

    (21)

    Вы правда считаете, что «Папки для обмена» делают на «клиенте» у некого пользователя при клиентсерверном решении?

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

    Если секретных данных в папке нет или безопасность поддерживается на уровне ларька средней руки — то можно и сервер. пользователю дать доступ.

    Reply
  24. Stim213

    + я не говорю, что это правильно или неправильно.

    Может в вашей конкретной ситуации РЗ и является корректным решением. Но в более общем случае и при разработке универсальных решений такой подход может являться единственно правильным способом, поэ

    Reply
  25. dsdred

    (24)Отвечу на все разом, если Вы не против.

    Согласен, возможно, я не слишком подробно описал, но я предполагал, что упомянув 100 касс с Frontol и файловый обмен в 3 примере, это уже натолкнет на http://ftp... То есть с касс по ftp прилетали файлы в папки рассшаренные всем пользователям кроме того под которым крутилось 1с по принципу, что Вы описали выше(20). На стороне, где крутится 1с, запускалось то чудо, что я описал. Собственно я перерисовал код под ftp.

    По 5 примеру с удалением файла из папки. Инвентаризаторы создавали некий файл определенного формата и передавали его тоже через ftp из вне. Дальше работало то, что описано выше. Я такие вещи в принципе делаю через http сервисы.

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

    А по поводу «не следует давать права неё пользователю, под которым крутится сервер», а каким образом работают файловое хранилище в новых конфигурациях? 1С сама сделала именно такой вариант: пользователь, под которым крутится сервер, имеет доступ к папке с файлами, а уже остальным пользователям на уровне конфигурации запрещено использовать внешние обработки, и зарезаны различные доступы. (Хотя может, что то изменилось, но года полтора назад именно так и было)

    -> http://v8.1c.ru/doc8/4.htm

    Вырезка: «Для работы с файлами различных типов используются приложения, установленные на компьютере пользователя и ассоциированные с соответствующим типом файлов.

    Все файлы хранятся в информационной базе или томах на диске и копируются на локальный компьютер для просмотра или редактирования по требованию пользователя.

    В информационной базе для хранения файлов предусмотрена структура папок. Файлы распределяются по папкам. Доступ сотрудника к папке может быть ограничен заданными правами доступа.»

    Reply
  26. Stim213

    (25) Ну что тут можно сказать.

    На 1С полагайся, но своей головой все равно думай(с). В 1С много дыр в безопасности, пример взлома я выкладывал: https://infostart.ru/public/182849/

    Если хотите действительно сохранить данные — разделяйте их правами доступа на уровне учетных записей ОС, иначе — данные можно утащить.

    Reply
  27. dsdred

    (26)Красивая брешь безопасности

    Reply
  28. azubar

    (26) На уровне ОС дыр в безопасности не меньше 😉

    Reply

Leave a Comment

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