Запись документов по расписанию.




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

19 Comments

  1. gutentag

    Я не программер, поэтому извините за дилетантский вопрос:

    — что помешало сделать решение данной задачи как внешнюю обработку(т.к. имхо мне попадалась обрабротка типа «групповое перепроведение документов по расписанию») + сохранение файла(можно и архивного) с нстройками в комьютере?

    > Внедрение в конфигурацию дополнительных метаданных

    — А что это дает? …имхо недостаток :-/



    Резюме: имхо автор усложнил поставленную задачу.

    Reply
  2. Шёпот теней

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

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

    вооОооотТакоеЕстьМнение…

    Reply
  3. Шёпот теней

    (2) + … гыЫыыы разволновался мальчишка (это я о себе)…. последнюю фразу читать так:

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

    вооОооотТакоеЕстьМнение…

    Reply
  4. larisab

    Имхо, лучше разделить на обработку и статью, а то тяжело читать…

    Reply
  5. Шёпот теней

    (4) … скорее всего ты права… кАк всегда… воОот…

    Reply
  6. Шёпот теней

    (5)+ …учту в следующий раз… спасибо larisab… вооОооот….

    Reply
  7. coder1cv8

    ыыы… муууу… А мОжно шрифТ читАбельный сдЕлать? …ВоооООооот…

    Reply
  8. ValeriVP

    (0) да, подобные механизмы иногда нужны. но плюса не будет. много написано, но мало понятно.

    Reply
  9. Шёпот теней

    по поводу шрифта могу сказать следующее — вставляю везде один и тот же шрифт … если это тАк нравится разработчикам сайта то пусть тАк и будет…

    …с одной стороны пользователь всегда прАв (т.е. читатель) — с другой стороны заниматься «творчеством» со шрифтами нет никакого желания…

    …впрочем куда я денусь… попробую сделать….

    (8) дело ведь не только в «+» дело и в критике — а ваше сообщение весьма непонятно … что..? где..? … возникают смутные подозрения…

    … воОотГотоВОсОшрИФтом…

    Reply
  10. ValeriVP

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

    Reply
  11. Шёпот теней

    (10) в ваших талантах нет сомнения господин Rebelx… и пока не могу принять вашу критику по поводу «не понятно»…

    … то, что ЭтО кто-то когда-то делал сомнения нет… и я не претендую на открытие «америки» — наоборот ищу тех кто этим уже озадачивался, ищу сомышленников и учавствующих критиков…

    …просмотрев «историю» этого вопроса не нашЁл тАкого решения вооот и решил поделиться и заодно выслушать мнение коллег по цеху…

    …если вы эТо делали — значит имеете опыт -вот опытом и поделитесь — думаю все только выиграют от этого…

    воооОооооттАкоемАленькОемнЕние….

    Reply
  12. ValeriVP

    (11) попробую объяснить по другому: в описании очень много воды. сократи описание в три раза. (… он же писатель, а не читатель …)

    Reply
  13. Шёпот теней

    могу ответить тАк: всЁ что ни сделаешь — всЁ будет плохо… то «воды» мало… то «воды» много… всЁ таАак относительно товарищ Rebelx, что из простой вредности оставлю всЁ кАк Есть…

    если у вас есть желание можете текст сократить как Вам хочется и считаете нужным — прислать мне на почту, адрес есть в личной карточке, и мы добавим его в сокращЁнном варианте… если он уж «совсем» будет талантливым, в смысле «краткость сестра таланта» можете это описание продемонстрировать в следующем своЁм комменте…

    воОооооттаАакоЕЕстЬпрЕдлОжЕниЕ…

    Reply
  14. Ish_2

    Понятая мной суть статьи :

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

    решается при помощи механизма подписки на события (событие «Запись» для документов) , в регистре же сведений указывается время записи для конкретного вида документов.

    Замечания:

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

    Шепот Теней, в своей борьбе ты решил ударить по нечитающей публике длинным текстом.

    В этой борьбе я тебе лишь робкий и пугливый попутчик.

    Reply
  15. Шёпот теней

    (14) … ничего … ты же прочитал … можно взять твой текст и вставить в предисловие к обработке если не возражаешь … мне понравилось … воооОооот…

    Reply
  16. Ish_2

    Возражаю.Оригинал есть оригинал (и текст статьи и автор)

    Reply
  17. Шёпот теней

    Венгер или Венгеровщина … ?

    Доколе можно терпеть и не иметь возможность либо избежать общения с некоторыми товарищами …

    Доколе будем терпеть и не иметь возможности отвечать на хамство, откровенные оскорбления, матершину …

    Предлагаю на ИС организовать «черные список» пользователя … ТоварищЪЧи в него попадающие не смогут остАвлять свои комментарии в ветках пользователей отказавшихся от их мнения …

    У нас же есть списки друзей … Пусть бУдут списки Нежелательных лиц …

    Прошу организовать модераторство «своихВеток» …

    Официально прошу товарищЪЧа ВЕНГЕРА не посещать мои вЕтки и не оставлять свои комментарии …

    Прошу администрАцию, если есть техническая вОзможность оградить меня от общения с ним в моих «ветках» … я в его не «полезу» …

    Также прошу удАлить все его «+» выставленные в моих работах, статьях и комментариях …

    … ВОТ …

    Reply
  18. Шёпот теней

    … странные дЕла Творятся …

    … наверное Я не буду слишком НЕ точен если выскажу мнение что НЕтовариЩЧЪ упомянутый мною в (93) — является основным «оскорбителем и посылателем» в простонароДе — работником флудА и по-совместительству основным Хамом …

    … и что жЕ МЫ видИм — ОН ещчЁ и «Советник Администрации» …. вОзникАет вопрОс… а КАК же Совет и Администрация собираются бороться с «флудом» есЛИ основные его поставщИки находятся у власти …

    …хм…

    видимО как у клАссиков — сами себя …

    … вОООбщем не Совет а «Татупед»ство (по М.Задорнову: Депутат — Татупед) …

    … не Модератер а ФЛУДератор …

    …. ВОТтакоеМНЕНИЕотНАРОДА …

    Reply
  19. pinskgortop

    Ваше решение обеспечивает правильное размещение документов лишь в течение дня?

    Reply

Leave a Comment

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