Бомбер для 7.7




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

65 Comments

  1. salexdv

    Супер вообще!!!! Только вот бомберу бы имя задавать :))))

    Reply
  2. Ёпрст

    Да можно и задать…

    Reply
  3. vip

    Мастер!

    Reply
  4. GSoft

    по окончании уровня бомбер продолжает летать над пустым городом

    Reply
  5. Ёпрст

    (4) Есть такое… поправлю..

    Reply
  6. Арчибальд

    Спектрум форэва!

    Reply
  7. Ёпрст

    (4) Обновил.. щас ужо не летает 🙂

    Reply
  8. ACE$

    в вайне от этерсофта не пре 🙁 тут же вылетает (конфликт самого вайна и формекса). В виндовом терминале не смог перехватить клавиатуру.

    Но идея — супер!

    Reply
  9. Ёпрст

    (8) А формекс какой версии?

    Попробуй явно воткнуть ПерехватКлавиатуры(НовоеЗначение) через объект Сервис.

    Reply
  10. brr

    При нажатии (-) скорость растет, при (+) падает. Нелогично

    Reply
  11. Ёпрст

    (10) Эт, чтоб лишний раз не баловались..

    🙂

    Reply
  12. brr

    Нет описания кнопки Esc :). Нет паузы — «Начальник пришел».

    Reply
  13. Ёпрст

    (12) ок.. ща будет.

    Reply
  14. Ёпрст

    +13 Обновил..

    Есть теперь и пауза и «защита» от начальства, описание кнопок управления, ну и скорость верная.

    Reply
  15. bpv

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

    ((Формулы, описывающие свободное падение v=gt, h=gt2/2, v2=2gh,

    где v — мгновенная скорость тела; t — время падения; h — высота, с которой падает тело; g=9,8 м/с2)).

    Тогда будет труднее попасть, а так мышку поставил над домом и сразу попал.

    Но вообще отлично.

    Reply
  16. Ёпрст

    (15) да можно попробовать, там бомба ни к чему не привязана — просто изменяются атрибуты реквизита..

    Reply
  17. bpv

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

    Reply
  18. Ёпрст

    (17) Неее… тут в этом и весь смысл — самолет снижается всё время и пока бомба не долетит до конца, новую сбросить нельзя..

    А так было бы — зажал пробел и стер с лица земли город за один проход…

    Це же прототип игрухи с спектрума.

    Reply
  19. Ёпрст

    +18 Нужно просто снижение побольше выставить — тогда врезаться в город будешь чаще и тут уже важна будет меткость бомбометания..

    Reply
  20. Оболтус

    Класс! 🙂

    Reply
  21. bpv

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

    Reply
  22. Ёпрст

    (21) хорошо…доделю.

    А вот, по-поводу параболлы…

    У меня для скорости вычисления попадания,после бомбометания сразу отсеиваются все дома, и добавляется в список попаданий только те дома, в которые попадает бомба, и потом в полёте бомбы сравниваются вертикальные координаты только этих домов и бомбы…

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

    Хотя… попробую в понедельник.

    Reply
  23. Поручик

    Что-то подобное пробовал на фокспро 2.6, ещё в досовском варианте, лет этак мнадцать назад.

    Reply
  24. Ish_2

    (23) Я тоже вытер слезу по фокспро 2.6.

    Reply
  25. boy13

    После того, как нажал на Enter и восстановил окошко — пауза не отрабатывает. Не выводит из паузы.

    Reply
  26. boy13

    вообще пауза не работает 🙁

    Reply
  27. Ёпрст

    (25) так и было задумано…

    по ентеру — скрытие, потом восстанавливаешь и жмешь паузу..

    Reply
  28. Ёпрст

    (26) всмысле ?

    Reply
  29. boy13

    (27,28) Ну вообще не работает… я ее жму, а эффекта — ноль…

    компутер: ноут Dell inspiron 1501, на борту Vista Home Basic

    Reply
  30. Ёпрст

    (29) можешь в коде написать

    Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши,Alt,Shift,Ctrl,Символ,ФСО)

    Сообщить(КодКлавиши);

    и посмотреть, равент ли он 19.

    Если не равен, то в коде поменять на любой другой подходящий код в этом месте

    ИначеЕсли КодКлавиши=19 Тогда

    Reply
  31. Sergey03

    когда открываю бомбера и нажимаю любую клавишу 1с вываливается. Оказывается при открытии «гРФорма=СоздатьОбъект(«Общие.Форма.Привязка»);»

    не создается, формекс загрузился , в чем проблема?

    Reply
  32. Ёпрст

    (31) Это тут вообще ни коим боком.. там всё в попытку обёрнуто.

    Нет 1с++ или соответствующего класса — нет и привязок формы..

    ЗЫ: Формекс какой версии?

    Reply
  33. Sergey03

    версия 2.0.5.92

    в том месте он в исключение уходит

    Reply
  34. Ёпрст

    (33) Так и должно быть.

    Это никак не влияет на «падение» 1с-ины..

    Помимо формекса, другие ВК есть?

    Reply
  35. Sir12

    Народ, у меня ошибка сразу идет, «РасшФ.УстановитьФорму(Форма); Значение не представляет агрегатный объект (УстановитьФорму)», что не так ?

    Судя по коду «ЗагрузитьВнешнююКомпоненту(«formex.dll»)» проскакивает без нареканий.

    Reply
  36. Sir12

    Все, разобрался, оказалось formex надо было в базу класть, а не в BIN.

    Reply
  37. Ёпрст

    (36) вовсе не обязательно, в бине тоже найдет.

    Reply
  38. Sergey03

    уже все закомментировал — все равно

    Reply
  39. Ёпрст

    (35) там ошибка в коде.. качай последнюю..

    Reply
  40. Sir12

    (37) Найти то нашел, тока вот не заработал.

    Reply
  41. Sergey03

    нашел , в бине валялся новый формекс а в каталоге старый . Видимо со старого грузился

    Reply
  42. Sir12

    (39) после того как DLL перекинул в каталог базы, пока ошибок никаких не было )

    Reply
  43. Ёпрст

    (38) На вкладке «О программе» какая версия формекса светится ?

    В глобальнике, или еще где нет случаем Сервис.ПерехватКлавиатуры(0); ?

    Reply
  44. Ёпрст

    (42) Првильно, ибо при первом запуске формекс загрузился, а я вот забыл там в исключение воткнуть РасшФ = СоздатьОбъект.. вот и ругалось на «нет метода»

    Reply
  45. brr

    ОФФ Вопрос автору, как вы думаете в семерке можно сделать что-то вроде С/Pascal (нужное зачеркнуть) robots?

    Reply
  46. Ёпрст

    (45) при желании можно всё.

    Reply
  47. brr

    (46) Я как то пробывал это сделать, уперся в распараллеливание работы нескольких алгоритмов.

    Reply
  48. Ёпрст

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

    Reply
  49. Ёпрст

    +48 либо так, например:

    http://avb1c.narod.ru/?=a20

    Reply
  50. brr

    (49) Это через функцию на форме?. Если да то я так и делал, предполагалось что модули роботов во внешних обработках. Эти обработки запускались внутри функций расположенных на форме, но 1С сказала что так делать нельзя :). И я это дело забросил. Может имеет смысл по другому сделать подключение модулей роботов?

    Reply
  51. Ёпрст

    (50)Открывать форму из формул диалога можно, либо в ложном закрытии формы, либо использовать метод формекса, который «лечит» это.

    Reply
  52. brr

    (51) Ага, спасибо

    Reply
  53. Paully

    РасшФ.ОбработкаОжидания(«БомберЛететь»,СкоростьБомбера);

    Поле агрегатного объекта не обнаружено (ОбработкаОжидания)

    — FormEx.dll стоит… Ошибка является после нажатия, к примеру, пробела…

    Reply
  54. Paully

    Все, ПРОСТО обновить до последней версии ВК. Все сразу работает. Этого не было сказано в описании на первой странице. Вот и не сделал в свое время))

    Надо бы добавить такой комментарий.

    Reply
  55. CheBurator

    а еще обезьяна была кидала палку по параболе…

    Reply
  56. Ёпрст

    (55) Да много чего было.. Ща поставлю эмулятор спектрума, покачаю игрушек..

    Reply
  57. Арчибальд

    (56) Неужели с кассетника? 8)

    Reply
  58. Ёпрст

    (57) не… хотя должен быть где то..

    Вот только кассетника давно нет

    вот с таких сайтов и им падобных:

    http://trd.speccy.cz/

    Reply
  59. Арчибальд

    (58) У меня до прошлого года еще на пятидюймовых дискетах с сотню игрушек хранились. Вынес на мусорку вместе с «Пентагоном», часа не прошло, как кто-то оприходовал :))

    Reply
  60. maxpiter

    (59) сначало ZX Spectrum 48 с Elite, а после Pentagon 128 с Lotus Esprit — были уже тогда в 3D!!! и круче GTA IV и современных симуляторов 🙂

    а фантазию как развивали!!!

    p.s. тогда — это в 89-93 годах 🙂

    Reply
  61. maxpiter

    +60 а еще раньше был компутер Башкирия 32к и Хобби (вроде 64 хм…) и там на них была игра Клад — это вообще шедевр тогда был 🙂

    год 87-88 вроде

    Reply
  62. Kolik007

    + Клевая игрулина, сразу вспоминаешь денди )))

    Reply
  63. Zhe_ka

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

    Reply
  64. Rockman

    Замечательная игрушка на Спектруме была, жаль так ни разу не прошел уровень.

    Reply
  65. masticore

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

    Reply

Leave a Comment

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