Golden Key 8.1 Prototype




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

22 Comments

  1. Yasen

    Отлично!

    Но если у клиента отключен JS?

    Reply
  2. O-Planet

    (1) Хочет посмотреть демку — включит 🙂

    Reply
  3. afanasko

    Гениально просто!

    Reply
  4. awa
    Думаете, это легко будет восстановить? Попробуйте!

    Попробовал. Получилось.

    Может надо как-то по особенному настраивать HTML Guardian?

    O-Planet, не мог бы ты выложить какую-нибудь готовую защищенную обработку? Или хотя бы зашифрованный тобой html-файл?

    Reply
  5. Valerich

    Очень интересно, надо взять на заметку

    Reply
  6. O-Planet

    (5) А это как если не секрет? 🙂 Я что-то в сети мало нашел инфы про дешифрование гуардиана.

    Reply
  7. O-Planet

    Если кому-то кажется что HTML Guardian — не серьёзно, то всегда можно выбрать любой из имеющихся в сети шифровальщиков: http://www.securitylab.ru/software/1232/

    (А интересно, получится наложить один на другой? 🙂 )

    Reply
  8. O-Planet

    Кстати, обновил обработку. Появилась возможность контроля корректной совместимости текстов запроса с html и более продвинутые возможности по подготовке файлов.

    Reply
  9. O-Planet

    Блин. Досадное недоразумение… В спецификации были перепутаны местами аргументы в методе «Добавить» у списка. Голову сломал, прежде чем нашел. Исправил…

    Reply
  10. awa

    (7) Ты опять наступаешь на те же грабли, что и в голден кее для семерки. Любое шифрование подразумевает под собой момент дешифровки. Чтобы браузер смог отобразить HTML-страничку, она должна быть расшифрована.

    Впрочем, я в этих всяких веб-технологиях ничего не понимаю.

    У меня стоит Google Chrome (нравится мне он очень!), открыл в нем сформированную с помощью HTML Guardian страничку, полюбовался на сплошные рекламы, и открыл через меню «Управление текущей страницей» — «Разработчикам» — «Консоль JavaScripts». И, о чудо!, вижу там расшифрованный исходный текст HTML странички. Свою функцию увидел я там в таком виде:

    // u043Fu0440u0438u043Cu0435u0440
    function awa(z)
    {
    var t=»u0412u042Bu0411u0420u0410u0422u042C
    «+
    » u0421u0441u044Bu043Bu043Au0430 u041Au0410u041A u0421u0441u044Bu043Bu043Au0430
    «+
    «u0418u0417
    «+
    » u0414u043Eu043Au0443u043Cu0435u043Du0442.u0417u0430u044Fu0432u043Au0430u041Du0430u041Fu043E­u043Au0443u043Fu043Au0443 u041Au0410u041A u0417u0430u044Fu0432u043Au0430u041Du0430u041Fu043E­u043Au0443u043Fu043Au0443″;
    z.u0422u0435u043Au0441u0442=t;
    var Res=z.u0412u044Bu043Fu043Eu043Bu043Du0438u0442u044C();
    return Res;
    }
    

    Показать

    Ну тут понятно, русские буквы заменены на их коды в кодировке Unicode. Написав маленькую обработку по преобразованию такого текста я получил

    // пример
    function awa(z)
    {
    var t=»ВЫБРАТЬ
    «+
    » Ссылка КАК Ссылка
    «+
    «ИЗ
    «+
    » Документ.ЗаявкаНаПокупку КАК ЗаявкаНаПокупку»;
    z.Текст=t;
    var Res=z.Выполнить();
    return Res;
    }

    Показать

    В общем слов нет. Как и защиты.

    Reply
  11. O-Planet

    (11) Ты вот скажи, от юзеров оно защитит? 100%! Даже гуардиан. Но я ведь написал, что он — не окончательный вариант. Имеются более интересные перекодировщики. Сейчас подготовлю одну коммерческую разработку, как ты и просил, и попробуй… 😉

    Reply
  12. O-Planet

    (11) Вот по этой ссылке http://www.belkamag.ru/index.php?priceorg:download качай «Прайс-органайзер 8.1». Типа программка, как и обещал…

    Reply
  13. awa

    (12) Для защиты от простых юзеров пойдет и пароль на модуль. По крайней мере пока, твоя защита не кажется сильнее пароля на модуль. Однако, подождём обещанную защищенную коммерческую разработку.

    Reply
  14. awa

    (13) Вскрылось на ура!

    Макет1 у тебя — это HTML, закрытый каким-то PowerHTML.

    Вот, для примера, одна из функций:

    // ПолучитьСвойствоХарактеристики
    function f_5619496224619844(z,Par)
    {
    if(!GG_UU000)
    return Null;
    var t=»ВЫБРАТЬ
    «+
    «СвойстваОбъектов.Ссылка
    «+
    «ИЗ
    «+
    «ПланВидовХарактеристик.СвойстваОбъектов КАК СвойстваОбъектов
    «+
    «ГДЕ
    «+
    «СвойстваОбъектов.Наименование = &Наименование
    «+
    «И СвойстваОбъектов.НазначениеСвойства = &НазначениеСвойства
    «+
    «И (НЕ СвойстваОбъектов.ПометкаУдаления)»;
    z.Text=t;
    var tek;
    for(var k=0; k<Par.Count(); k++)
    {
    tek=Par.Get(k);
    z.SetParameter(tek.Presentation,tek.Value);
    }
    var Res=z.Execute();
    z.Text=»»;
    return Res;
    }
    

    Показать

    Если разрешишь, выложу все))

    Макет2 — внешняя обработка с запароленным модулем, в котором одна функция:

    Функция ВыполнитьКоманду(МояСтрока) Экспорт
    Результат = Неопределено;
    Выполнить(МояСтрока);
    Возврат Результат;
    КонецФункции
    

    Ну и сам внешний отчет с запароленным модулем….

    Этого достаточно? Так как УТ у меня нет, то твой отчет я ни разу не запускал, и в чем состоит ограничение (а так же, что он делает)- понятия не имею. Или надо разобраться до конца?

    Reply
  15. vip

    (15) Так его, болезного.

    (0) Опять на Golden Key нашелся Ferrous Lock? 😀

    Reply
  16. venger

    (15) дежа вю… 🙂

    Reply
  17. O-Planet

    (15) Ты крут и монстЁр 😀 Что ж, так и придется самому писать перекодировщик js, поскольку не умеют буржуи ничего. И еще 30 у.е. за такое просят. Впрочем, смею предположить, что не все смогут так легко найти то, что хотят. И потому это остается в силе: «Golden Key 8.1 Prototype с успехом может использоваться для защиты демо-версий недорогих коммерческих разработок.» Но, как выяснилось, не на Инфостарте, потому как тут сидит awa…

    (16) Да я и рад, в общем-то. Мне лучше здесь увидеть все, чем от клиентов получать сюрпризы. И у меня есть идейки, как все это обойти. Только нужно время. Вот ты скажи, почему в «коммерческих» шифраторах html нельзя было не тупо шифровать текст, а хотя бы динамически его формировать в процессе выполнения скрипта? Как пример — сделать виртуальную скрипт-машину, исходный код заменить набором смайликов, и по ним выполнять сценарий? NTKrnl так и работает, в общем-то…

    (17) Ты ваще не в теме…

    Reply
  18. venger

    (18) Семки на галерке заканчиваются;-)

    Reply
  19. d.snissarenko

    💡 Даешь starforce в каждую обработку.

    Reply
  20. O-Planet

    Так и будет… Реально, зацепил одну идею… Не хватает катастрофически времени.

    Reply
  21. Bacchus

    Пример 1

    Процедура Кнопка1Нажатие(Элемент)

    Сообщить(ЭлементыФормы.ХТМЛ.document.parentWindow.hello());

    КонецПроцедуры

    не работает — ЭлементыФормы.ХТМЛ.document.parentWindow.hello() возвращает COMОбъект

    Пример 2 не работает — та же ерунда.

    ну и сама обработка тоже не работает.

    JS-разрешил , проверил на хтмл файлах из примерах.

    Я не спец по IE8, поэтому считаю данное решение сильно ограниченным. Больше гемора решать проблемы нерабочей обработки из-за IE у клиента, чем продать ещё пару.

    Сам использую похожий способ, но без IE8, а через JS Shell. Текст скрипта в макете зашифрован самим скрипом с паролем, и если пароль не верный, то функции не работают вообще. Для триала отдельный пароль и отдельный макет со скриптом с огрниченным функционалом.

    Reply
  22. Sintson

    Хотелось бы напомнить, что 1С задумывалась как открытая система.

    Думаю что демку всегда можно сделать просто вырезав ключевой функционал или просто сделать хорошую презентацию, если уж мы начинаем претендовать на оригинальные идеи.

    То, что один человек сделал — другой завсегда сломать сможет (Народная мудрость).

    Reply

Leave a Comment

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