Игра "Самоцветы" (Bejeweled теперь и в 1С) + звук




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

67 Comments

  1. Tatitutu

    Bejeweled теперь и в 1С — без комментариев…

    комментируйте вы , все для вас и для вашего досуга !

    Reply
  2. Широкий

    У разделителей поставь доступность=Ложь

    Reply
  3. Широкий

    ПолеКартинки = ЭлементыФормы.Добавить(Тип(«ПолеКартинки»), ИмяКартинки, ИСТИНА);

    Плохо!!! Утечка памяти!!

    Меняй просто изображение

    Reply
  4. Tatitutu

    (2) изменил.Спасибо

    Reply
  5. Не понятно, как играть то? В одном ряду подряд 3 одинаковых не выпадают, два подряд и один не рядом, нажимаешь на любой из перечисленных, ничего не меняется и ничего не исчезает. Подсказка показывает на камушек и тоже ничего. Что я делаю не так?

    Reply
  6. Tatitutu

    (5) В одном ряду подряд 3 одинаковых не выпадают

    правильно — они и не должны выпадать

    Ваша задача собрать по вертикали или горизонали группу фигур >=3

    для этого Вам нужно сделать 2 клика

    1 клик по той фигуре которую хотите переместить

    2 клик по тому месту куда ее хотите переместить

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

    Reply
  7. (6) Вооот, теперь все ясно, спасибо 🙂 (в том числе и за доступ — ВСЕ)

    Reply
  8. Ёпрст

    Остаются артефакты от старых картинок, + тормоза..

    Reply
  9. Ёпрст

    Ну и «пробелы» между самоцветами — а должны падать по идее, + происходит не замена одного на другой, а тупо 1 перемещаем, а на месте второго — «дырка» остаётся..

    Что-то недоделано, не помню, как оно в оригинале было ужо.

    Reply
  10. Tatitutu

    (8) ничего не остается

    (9) у меня они падают — т.е. 3 удаляются и на место их падают другие сверху

    тормозов не замечено.Странно

    Reply
  11. Ёпрст

    Артефакт:

    Пустые клетки, + перемещаем…

    Было:

    Стало:

    Ну и куда делся красный квадрат + почему висят все остальные кристаллы ?

    Reply
  12. Ёпрст

    +11 + игра всё время на время, в не зависимости от галки.

    Reply
  13. У меня вот так было:

    Reply
  14. Tatitutu

    (11) Согласен. Перезалил обработку

    добавил еще одну проверку на перемещение фигур из разных столбцов и строк. Исправил и время

    (13) почему у тебя появляются горизонтальная и вертикальная полоса прокрутки не понял.

    Reply
  15. (14) Видимо потому, что камни перемещаются за поле.

    Reply
  16. Tatitutu

    (15) Скачайте заново файл и проверьте пожалуйста. Вроде все устранил.

    Reply
  17. Ёпрст

    (16) теперь половина не работает — не перемещаются элементы..

    Reply
  18. Tatitutu

    (17) все работает.

    Перемещать можно только из соседник строк или столбцов

    Reply
  19. Ёпрст

    (18) ??

    Раньше было с любого места в любое.

    Правила на ходу меняешь ?

    Сделай нормальное описалово тогда.

    Reply
  20. Ёпрст

    Ну и на время так и осталось, ничего не делаешь и .. Финиш

    Reply
  21. (18) >Перемещать можно только из соседник строк или столбцов.

    Да, теперь работает. Но все же интереснее и приятнее было бы из любых мест перемещать (на дальнейшее развитие игры).

    Таймер все таки не отключается. Вернее с определенного количества ходов он запускается и «финиш».

    Reply
  22. Tatitutu

    (19)(21) Нет ! Во первых не я придумал правила и не мне их менять.

    Да и подумать — если как вы предлагаете — играть было бы не интересно со всем — что такое набрать нужное количество одинаковых фигур, а тут самая перчинка в том что нужно НАЙТИ на поле где можно сделать ход. Посмотрите под этим углом и все станет на свои места.

    посмотрите в сети полно версий этой игрушки , у меня такая есть на телефоне — было интересно продумать ее алгоритм и реализовать на 1С

    Время поборол. Файл перезалил. Спасибо за комментарии

    Reply
  23. Ёпрст

    (22) у тебя так было изначально.

    А правила ты нигде не удосужился описать..

    А как там в оригинале было, я уже не помню..

    например.

    Reply
  24. Tatitutu

    (24) Правила добавил в описание, более расширенные

    Игра сама по себе [:|||||:] уже не нова, по простоте душевной думал что правила давно известны.

    Reply
  25. Ёпрст

    (24) теперь кнопка доступный ход хню показывает..

    Reply
  26. Tatitutu

    (25) Не знаю, у тебя называется хню

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

    или что переставить или место куда переставить

    «такой большой и подсказками пользуешся 😀 «

    Reply
  27. Ёпрст

    + Иногда дает недопустимый ход..

    Reply
  28. Ёпрст

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

    🙂

    Reply
  29. Tatitutu

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

    если ходов нет то поле перерисовывается и заново ищет.

    просто иногда кажется , что хода нет

    Reply
  30. Tatitutu

    (28) ну за это отдельное спасибо.

    Reply
  31. Ёпрст

    + неверно показывается рамка, какие ячейки будут удалены для вертикальных кубиков — всегда горизонтальная «полоска»

    Reply
  32. Ёпрст

    +31 и только на 1 кристалле, а не на 2-х..

    А при горизонтальном «удалении», рамка съехана в сторону.

    Reply
  33. Tatitutu

    Bejeweledfor1C8v3.epf от 22.10.2010 15:30 увечил значение задержки — шарики изменили свое движение (странно вчера на 300 тупило, сегодня на 800 летает — взаимосвязь не могу понять)

    (31) что за рамка ? количество очков ? она всегда горизонтальная — примерно по центру удаленных

    Reply
  34. Ёпрст

    (31) нет, рамка подсветки удаленных кристаллов — нужно у вертикальных вертикальную лепить, у горизонтальных — горизонтальную.. и на 2 кристалла, а не на 1..

    Reply
  35. Tatitutu

    (34) честое слово , не могу понять про какую рамку удаленных кристалов ты говоришь. Про «доступный ход» ?

    Reply
  36. Ёпрст

    Нет, когда кристаллы удаляются — ты подсвечиваешь их рамкой желтой..

    Reply
  37. Tatitutu

    (37) 😀 😀 😀 да нет, это не подсветка удаленного

    это по идее рамка с очками за удаленные фигуры

    (рамка желтая, фон красный, и цифры) но иногда только одна рамка вылезает

    я постил тему:

    Вчера на досуге написал игру Bejeweled

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

    1.объект ПолеКартинки с прозрачным фоном (сама картинка тоже с прозрачным фоном) красиво смотрится на форме, но при наложении на другой объект ПолеКартинки — прозрачность пропадает (ни руками, ни программно не получилось сделать) т.е. картинка по форме «скользит» красиво, но если на ее пути попадается другой объект прозрачность проподает.

    2. Кнопка «Подсказка» или после окончании хода (нужно же проверить если еще ходы для игрока).

    вот вопрос есть заполненный цифрами массив (8,8),т.е. поле 8х8 , как наиболее быстро найти возможный ход (чтобы образовалось поле по горизонтали или вертикали >3 фигур)

    Reply
  38. Tatitutu

    (36) я (38) пост скрыл, только из-за того что косяк с картинкой — долго не отображается

    да я понял о чем ты говоришь

    но посмотри в конфигураторе — это НЕ РАМКА

    и на разных компах она ведет себя совершенно по разному ))))

    Reply
  39. (39) В процедуре УдаляемПоле() Сделай Выигрыш.Видимость = Ложь; В обоих блоках.

    Reply
  40. Tatitutu

    (40) поконткретнее если можно, где ?

    там есть в обоих блоках пробовал и так и сяк

    чтобы хоть как то видно было

    Н=0;

    для сч =1 по 1000 цикл

    Выигрыш.ПорядокОтображения = 93;

    Выигрыш.Видимость=Истина;

    Н=Н+1;

    КонецЦикла;

    Выигрыш.Видимость=Ложь;

    Reply
  41. Н=0;

    для сч =1 по 1000 цикл

    Выигрыш.ПорядокОтображения = 93;

    Выигрыш.Видимость Истина;

    Н=Н+1;

    КонецЦикла;

    Выигрыш.Видимость=Ложь;

    Reply
  42. +42. Ни при каких условиях эту рамку не должно быть видно, счет баллов от этого не пострадает.

    Reply
  43. Tatitutu

    (43) что не пострадает счет — это понятно

    хотел сделать как в оригинале

    если поле сходится — шары «взрываются» и исчезают и появлеяется поле с заработанными очками.

    Еще раз повторяю — раз на раз не приходится (иногда все отлично кажет, иногда только рамка) почему не знаююю….

    а показывать нужно

    Reply
  44. (44) Тогда вот так:

       для сч =1 по 1000 цикл
    Выигрыш.Заголовок=БаллыЗаКлик;
    Выигрыш.ПорядокОтображения = 93;
    Выигрыш.Видимость=Истина;
    Н=Н+1;
    КонецЦикла;

    А вверху заремить.

    Reply
  45. +45 И попробуй число ПорядкаОтображения повысить, например до 150, тогда всегда сверху будет, и вообще идеально все будет.

    Reply
  46. Tatitutu

    (46) да вот….. нет

    сначала так и думал, что оно так будет отрабатывать

    но нет….максимальное число = количество элементов на форме

    попробуй сам проверить

    Выигрыш.ПорядокОтображения = 100;

    Сообщить(Выигрыш.ПорядокОтображения);

    «приятно» удивишся

    Reply
  47. +45 Правда пришлось ЗадержкаДвижения 500 поставить, иначе вертикальные разделители иногда накрывают края поля с цифрами.

    Reply
  48. (47) Да уж.. Совсем убрал — раз все равно никак не регулируется.

    Вертикальные разделители накрывают, причем тогда, когда вылетает 2и более окошко с цифрами (((

    Reply
  49. Ish_2

    Даешь каждую неделю по одной новой игре на 8-ке !

    Что , Юра ? Слабо ?

    Reply
  50. Tatitutu

    (51) да мне то не слабо… но хобби превращать в график — не по мне

    игрушка должна быть от души и для души

    Reply
  51. Tatitutu

    Bejeweled for 1C8.2.epf от 17.05.11 17:00

    (толстый клиент) со звуком.

    Reply
  52. SergeyGladyshev

    Классная игра, автору респект!

    Reply
  53. baldorc

    Поставил бухгалтерам, так у них глаз выпал 🙂 щас втихую играют

    теперь жду пока директор игры в 1С запрещать начнет 😀

    Reply
  54. Tatitutu

    (56) Играть тоже нужно — стимулирует умственную деятельность.

    Там же есть кнопочка «Шеф идет»

    Пусть это останется нашей маленькой тайной

    Reply
  55. baldorc

    (57)

    кнопкой пользуются 🙂 но шила в мешке то не утаишь.когда-нибудь спАлит.:)

    я думаю, наиграются, сами перестанут

    Reply
  56. ric-77

    Даже боюсь такое ставить засосёт невырвусь. И неувидит директор обещанного отчёта.

    Reply
  57. ilonnaa

    А сколько времени ушло на создание? Просто интересно очень))

    Reply
  58. LND_gaz69

    (60) ilonnaa,

    плюсую. наверняка простые обработки автор пишет за получасы 🙂

    Reply
  59. ilonnaa

    (61) LND_gaz69, простые, то понятно) а на эту

    Reply
  60. Dr.DragoN

    Плюсанул за сам факт реализации, но от скачивания воздержусь. Боюсь затянет)

    Reply
  61. aximo

    Спасибо, интересная реализация. Подчерпнул несколько идей.

    Reply
  62. Sagirus

    Автору +1. Хорошая реализация классического «убийцы времени». Попробую скачать и не втянуться 🙂

    Reply
  63. AlexSunS

    (65) Sagirus, Пиаришься ?

    Reply
  64. Sagirus

    (66) AlexSunS, ошибочка… Вместо аватарки приложился файл к сообщению. Спасибо, что ткнул носом.

    Reply
  65. amalarius

    Здорово

    Reply
  66. baykovsky

    На какую версию платформы расчитана обработка?

    На платформе 8.3.8 выдает ошибку «Ошибка чтения внешних метаданных…»

    Reply
  67. Tatitutu

    Почти 8 лет назад. А сегодня случайно увидел и партнеров и играют )

    Reply

Leave a Comment

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