"пАздрАвлЯлкА" для семёрки …




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

36 Comments

  1. Шёпот теней

    … моя первая программа на 7-ке за последние пять лет … уффф … даже вспотел … вот …

    Reply
  2. Alraune

    (1) Лучше бы вспотели посильнее, но написали правильно название

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

    … нуууу … ужжж … а мне понДравилось … ))) … вот …

    п.с. первый блин всегДА комом …

    Reply
  4. Rusk51

    Ох уж эти поздравлялки. Все надоело.

    Reply
  5. Abadonna

    Наконец-то! Свершилось! Додуматься ПриНачалеРаботыСистемы() запустить стартовую обработку — уже вспотеть можно, а придумать к ней название

    «программный шлюз» — это уже за рамками реальности.

    И где, простите,

    Небольшой пример обработок смотри в прилагаемом файле-архиве.

    ?????

    вОт таК КАк-ТО….

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

    (4) … в принципе СОгласен … а чтоБЫ ВЫ хотели ? например как максимизировать окно обработки штатными 1С и Виндоус средствами ? …

    (5) … СпАсиБО ! Абадонна ! … испрАвил … (хм, странно … точно помню что вставлял. виноват не проверил) …

    … ОДНАКОвот …

    Reply
  7. Ish_2

    (6) Шепот , ты пугаешь людей своими последними разработками.

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

    (7) … да лаТно уж … пугаю прямь … ))) …

    Reply
  9. Tatitutu

    (0) это что ? и для чего ? Или где ?

    Фон = СоздатьОбъект(«Картинка»);

    Фон.Загрузить(КаталогИБ() + «AdditionImageНГ_02.bmp»);

    Reply
  10. Abadonna

    (9) Все нормал 😉

    Просто надо подсократить

    … моя первая программа на 7-ке за последние пять лет …

    до

    … моя первая программа последние пять лет …

    😀

    Reply
  11. OlgaG

    Спасибо! 😀

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

    (9) … блин … это надо удалить … совсем вспотел, в двух соснах блуждаю … исправил …

    (10) злые «вы» …

    (11) удачи ! …

    … вот …

    Reply
  13. Abadonna

    (12)

    злые «вы» …

    Конечно, злой. И ты должен догадываться, где и когда меня разозлил.

    А я не злопамятный: просто злой с отличной памятью 😉

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

    (13) … ))) … знАмо где …

    … хм … может стоит посмотреть на проблему шире … к тому же задача «злить» — не ставилась и не подразумевалась и вОООбще «никак» … ОДНОЗНАЧНО …

    … вот …

    п.с. часто то что «есть» — не есть «что» а есть «то» … )))

    Reply
  15. Abadonna

    (14)

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

    Пізно, панна: померла так померла

    Reply
  16. Abadonna

    (0)

    Проблема в том, что если захотеть устроить калейдоскоп картинок формы (фона), то такой возможности в 7-ке нет.

    Шёпот, зачем смущаешь неокрепшие умы? Есть такая возможность, вполне штатная. Если ты не нашел, не значит, что её нет.

    Перем ТекНомер;
    Перем КаталогКартинок;
    
    Процедура СменитьКартинку()
    ТекНомер=ТекНомер+1;
    Если ТекНомер>4 Тогда
    ТекНомер=1;
    КонецЕсли;
    ТекФайл=КаталогКартинок+»К»+Строка(ТекНомер)+».bmp»;
    КартинкаФормы.Загрузить(ТекФайл);
    //КартинкаФормы — идентификатор объекта на форме типа «Картинка»
    Форма.Обновить();
    КонецПроцедуры
    
    Процедура ПриОткрытии()
    КаталогКартинок=»c:Картинки»;
    Форма.ОбработкаОжидания(«СменитьКартинку»,2); // тут таймер на 2 секунды
    ТекНомер=0;
    СменитьКартинку(); // чтобы сразу первая появилась
    КонецПроцедуры
    

    Показать

    Как два байта отослать, однако

    Reply
  17. Ish_2

    (13) «Пізно, панна: померла так померла»

    Не сразу понял, что «Пізно» это вполне приличное : «Поздно».

    Подумал , что ты озорничаешь..

    Reply
  18. Abadonna

    (17) Я ж хохол, причем западный 😉 Как и Кушнир

    Reply
  19. Altair777

    (0) > Спасибо Арчибальду и Альтаиру за помощь и поддержку

    надо было дать мне возможность получить «спасибо» и за бета-тестинг 😀

    почему не сказал что выложил?! 👿

    Reply
  20. Abadonna

    (19) Это ты ему рассказал, что «такой возможности в 7-ке нет» ❓

    😀

    Reply
  21. Altair777

    (20) спроси его сам

    Reply
  22. freetype

    А я сделал на основе использования компонента вэб-браузер 😐

    Reply
  23. alexk-is

    Программный код в тексте публикации можно раскрасить… 🙂

    Reply
  24. Abadonna

    (23) Алекс, ты стал напоминать мне мужика из рекламы:

    Вы всё еще кипятите? Тогда мы идем к Вам!

    😀 😀 😀

    Reply
  25. alexk-is

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

    В данном случае я бы хотел в первую очередь, чтобы публикации на infostart.ru были оформлены наилучшим образом, а всё остальное потом.

    Reply
  26. Abadonna

    (25)

    чтобы публикации на infostart.ru были оформлены наилучшим образом

    Раскрасить код — дело вкуса, однако. Знаю кучу людей, которые в Дельфи просто отключают раскраску — ну не нравится им цветной!

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

    (16) … менять картинку … можно конечно … мне важен был «фон» формы … чтобы изменение формы приводило к растягиванию и картинки … спАсиБО за код и помощь …

    (19) … не думал что «помощь» и «поддержка» являются морально-наказуемым деянием … п.с. могу убрать ваше имя если вас ЭТО смущает …

    (22) … как можно посмотреть ? …

    (23) … можно и раскрасить … (неужели это тАААк важно) а если это важно то важно и форматирование текста в описаниях — которое вАААще непонятно как работает …

    … вОт …

    Reply
  28. Altair777
    Шёпот теней пишет:

    п.с. могу убрать ваше имя если вас ЭТО смущает

    наоборот! 😀

    можно было в (0) не просто имена написать, а вставить гиперссылку со ссылками на профиль

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

    (28) … совершенно прАвильно … виноват … испрАвился … вотВЕДЬ …

    Reply
  30. neo-rsx11

    Автор, вот мне до сих пор интересно, смысл выкладывать что-то если не давать подробнейшего описания. Зато хвалиться что написал.

    За изобретение 5, за инструкцию 2

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

    (30) … к сожалению сколько людей столько и мнений … отсутствие стандартов и разного понимания — какое уж тут однозначное отношение …

    п.с. сделайте краткое ТЗ для написания «описания» и я исправлю обработку под ваше понимание … или дайте пример … к тому же мы должны понимать что стоимость любой обработки с «описанием» и «без» это разная стоимость … написание инструкций пользователю занимает значителную часть времени программиста * нормоЧас = как минимум удвоенную стоимость …

    … вот …

    Reply
  32. neo-rsx11

    если ты работал ради денег, то зачем выкладывал. Выложил бы обявление о продаже и все дела.

    ИМХО, если выкладываешь свое творение для общего скачивания, то делай подробную инструкцию, либо невыкладывай вообще. Зачем людям голову морочить. Без обид

    Reply
  33. Spartan

    (30) Стесняюсь спросить… Что именно в описании публикации Вам не понятно и насколько подробная инструкция Вам нужна?

    Reply
  34. CheBurator

    Плохо искал.

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

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

    (33) … спАсиБО …!

    (34) … Че! мог бы и ссылку дать …

    Reply
  36. m818rt

    Спасибо) Порадовало)

    Reply

Leave a Comment

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