Отмена предупреждения безопасности. Расширение




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

19 Comments

  1. atb-mdv

    А при запуске обработки из командной строки предупреждение безопасности убирается?

    Reply
  2. the1

    (1) Не тестировал в таком режиме, но по идее, т.к. это расширение, то и на командную строку это должно подействовать. Скиньте синтаксис своей командной строки, могу проверить.

    Reply
  3. atb-mdv

    «C:Program Files1cv8common1cestart.exe» ENTERPRISE /S»192.168.1.81UP» /N»Admin» /P»Admin» /DisableStartupMessages /Execute «***.epf»

    Reply
  4. Fragster

    Воспользоваться документацией не предлагать? см. https://its.1c.ru/db/v8315doc#bookmark:dev:TI000001873 пункт 7.10.2

    Reply
  5. Fragster

    (4) работает и для (3)

    Reply
  6. the1

    (4) Не предлагать) Даже при выключенной защите от опасных действий предупреждение безопасности выдается пользователю

    Reply
  7. Fragster

    (6) не надо путать предупреждение БСП и платформы. Для (3), например, ваш способ точно не подойдет.

    Reply
  8. the1

    (7) Именно, что не надо путать. Публикация служит для отключения предупреждений БСП, а Вы мне предлагаете отключение предупреждений платформы.

    Reply
  9. zeegin

    Отключать предупреждения безопасности это плохо. Они предостерегают от опасных действий. Это тоже самое, что отключить UAC в виндовс. Это плохо само по себе и рекомендовать такое кому-либо я считаю нельзя.

    Никто не застрахован от халатности, из-за которой можно случайно выбрать не то что хотели. Предупреждение защищает и от таких случаем, т.к. останавливает процесс и дает возможность прочитать что может произойти.

    Reply
  10. Fragster

    (9) после десятого клика на «продолжить» он будет уже делаться мимо мозга. Вообще эта так называемая «защита» должна была остановиться на вынесение права на интерактивное открытие в отдельную роль. В формах можно бы оставить как текст (не требующий клика)

    Reply
  11. the1

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

    Reply
  12. atb-mdv

    (4) Всё это. естественно, пробовал. Но предупреждение появляется после внесения изменений в запускаемую обработку. После первого появления предупреждения и нажатия на кнопку «Продолжить» безопасность затихает и обработка запускается без предупреждений до следующей корректировки.

    Т.к. обработка запускается в дебрях серверов куда доступ по RDP для нажатия кнопки «Продолжить» сильно затруднён, то расширение автора сильно заинтересовало.

    Reply
  13. the1

    (12) Проблема ясна. Расширение не поможет, а вот рекомендация (4) — то, что надо. Это предупреждение платформы, и расширение его не перехватывает.

    Reply
  14. atb-mdv

    (9) У нас программисты написали скрипт для нажатия на «Продолжить». Безопасность должна быть разумной, а не заставляющей писать «костыли» для её обхода.

    Reply
  15. atb-mdv

    (13) Жаль. Подумал — вот он, «грааль». На увы ((

    Рекомендации (4) пробовали во всех видах, но ситуацию в (12) победить не удалось.

    Reply
  16. Fragster

    (12)

    Всё это. естественно, пробовал.

    Странно. Если все сделать правильно — то платформенное предупреждение не вылезает. Единственное — при настройке через conf файл — надо делать в том месте, где это действие выполняется, а чтобы наверняка — и на клиенте и на сервере :).

    Reply
  17. zeegin

    (14) Есть форма БСП для администрирования расширения. Она нужна для решения проблем с продуктивом, когда нужно подключить или отключить что-то в частном случае.

    Если ведется какого-либо рода разработка, и этот процесс поставлен и в ходе сборки нужно подготовить базу с расширениями, то можно воспользоваться установкой расширений пакетным режимом и это будет правильно.

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

    Пример того как поднимать режим агента можно всегда найти на гитхабе, например воспользоваться моим петом https://github.com/zeegin/1c-ssh-agent-sample

    А команды ssh управления конфигуратором в режиме агента можно смотреть в официальной документации https://its.1c.ru/db/v8315doc#bookmark:adm:TI000000738

    Reply
  18. Fragster

    (16)

    написать простенький скрипт на питоне onescript

    исправил 🙂

    Reply
  19. zeegin

    (18) это все офтоп, я предпочитаю питон, потому что там большее коммунити и потому что решаемые им задачи не замыкаются на 1с сообществе, вы можете использовать то, что вам больше нравится или то, что вы лучше знаете.

    Reply

Leave a Comment

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