<?php // Полная загрузка сервисных книжек, создан 2025-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='\
Это круто!
Что это за правило такое — «Золотой» ?
(2) в данном случае это когда два туза сразу выпало…
Респект таким парням. Ждем реализации на мобильной платформе
Это cool !
ps В базовую поставку 1С уже давно требуется пасьянс «косынка» )))).
Круто! Лет 10 назад делал тоже 21 на Делфи 7… Интересно, можно будет его теперь в 1С встроить 🙂
(3) Не заметил в коде, а где-то проверяется, что это именно два туза, а не, например 10 + 10 + 2?
(7) Проверка на Золотой сразу после раздачи первых двух карт, если счет будет 22 — то это и есть 2 туза
А слабо на делфях в 7-ку сделать форму, да что бы калбэки уходили в 1С? 😉
https://github.com/WorldException/v7SimpleAddIn
Если делфи еще интересно, могу посоветовать глянуть
там уже XE2, но сам принцип использовать RTTI для внешних компонент может быть интересен.
(9) Если кому интересно, могу статью опубликовать отлавливание событий из формы ActiveX в 1С…можно на примере игры морской бой или на примере ведения карты склада ячеистого газобетона
Выкладываю обработку с компонентой
(10) Нужно бооооольше уроков
Немного полезной критики =) Delphi? Гхм, пора бы ей уже на покой. Компонента не переносима на другие платформы, про веб-клиент, можно забыть. В безопасном режиме работать не будет. Тут возникает главный вопрос, зачем было связывать это вообще с 1С? Хотите того же самого — используйте HTML5 и JavaScript. К сожалению тоже будет не переносимо, т.к. Internet Explorer нет в Linux. Легких путей, к сожалению, разработчики 1С нам не предлагают. Управляемые Формы, опять же к сожалению, оказались менее управляемые чем Обычные. Надеюсь они когда нибудь встроят в свою платформу браузер Chromium и позволят управлять всем исходным кодом страницы при использовании веб-клиента.
Старайтесь вот так не писать (красиво, но не практично), я обжегся уже на этом
1С настолько тупа, что по Ctrl+Space не находит переменных ОбщийСчетИгрок и ОбщийСчетПК объявленных через запятую.
Только так будет находить:
(13) Delphi — это классика.
HTML5 не обязателен, обычного HTML + JS достаточно будет.
Получение следующей карты сделано конечно плоховато. На такой игре, как очко, конечно сойдёт, так как много карт всё-равно не выходит, но для игр с длинной раздачей — для последних карт может кучу раз цикл вхолостую крутить, пока попадёт в еще не выданные карты. Обычно делают нормальное тасование колоды. Для 1С например, можно сделать ТЗ с колонками ЗначениеКарты и КлючСортировки. Заполнить КлючСортировки случайными числами и отсортировать по ней. Потом брать последовательно карты из отсортированной ТЗ.
(13)
Ну, может человек снегопат использует и знать не знает ни о ctrl+space, ни о таких тонкостях его использования 🙂
(15) Александр полностью с вами согласен. Алгоритм можно оптимизировать до бесконечности…но главная цель данной статьи не в алгоритме игры…а в навыках применения компоненты актив икс