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




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *