Анализ ролей, проверка прав на объекты




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

36 Comments

  1. Barmaglot

    По выбранному объекту не получилось. Вывел все документы.

    Reply
  2. Diamond

    Для получения данных по выбранному объекту надо нажать кнопку с зеленой стрелкой

    Reply
  3. maljaev

    «Не забываем «плюсовать» рейтинг и оставлять комментарии! В противном случае — при несоответствии рейтинга количеству скачиваний — доступ к обработке будет ограничен»

    — я не понял, это че за шняга такая пошла? Почему в последнее время вошло в привычку ВЫМОГАТЬ себе рейтинг? И почему бездействуют админы? В конце концов, давно пора ввести меры за выпрашивание плюсов. И ладно бы там новичок какой был, но ведь пишет человек с уже заработанной репутацией. Так давайте возьмем это за пример и в заголовке КАЖДОЙ РАЗРАБОТКИ будем писать то же самое, что и Diamond. И что тогда будет? Вы представьте себе список разработок с подобной фразой в каждом заголовке! Нет, ребята, давайте либо как все — без просьб и угроз тихо мирно ждать, пока тебя оценят (или не оценят), либо для всех вводить другую систему рейтинга (на основе недавних жарких дебатов по этому поводу).

    Reply
  4. Abadonna

    +(3) Особенно понравилось «при несоответствии рейтинга количеству скачиваний».

    Ну тогда бы формулу что ли приложил Рейтинг=Скачиваний/Коэфф.

    Чему Коэфф равен должен быть? 10, 5, или может ваще 1?

    Reply
  5. anatoly1234

    Всегда удивлялся вот этому: «Не забываем «плюсовать» рейтинг и оставлять комментарии! В противном случае — при несоответствии рейтинга количеству скачиваний — доступ к обработке будет ограничен»! Можно еще хвалебную песню спеть!

    Reply
  6. Diamond

    хотелось бы чтобы коменты были по теме, с оффтопиком в форум.

    Reply
  7. jeckfs

    в нетиповой конфигурации не отразил внешние обработки… +-

    Reply
  8. v.l.

    Возможно, (5) и оффтопик, но эта надпись про плюсование часто раздражает. ИМХО. А разработка отличная, я бы плюсанул, но не имею возможности объективно оценить — нет платформы.

    Reply
  9. Skyer

    У меня обработка не окрылась. При открытии в конфигураторе нет ни модуля ни формы. Версия платформы 11.67. В чем может быть проблема?

    Reply
  10. Diamond

    (9) Платформа та же самая, скорее всего при скачивании сбой произошел, попробуйте ещё раз.

    Reply
  11. Abadonna

    2 Diamond. Ну и на фиг ты писал «Не забываем «плюсовать» …? Она и так нормальная. Убери из описания плиз, не дразни гусей 😉 Плюс

    Reply
  12. Skyer

    не могу скопировать — приходит обрубок (ни формы не модулей) Просьба большая — кто скачает пришлите п-та на адрес duyunov@yandex.ru. Спасибо

    Reply
  13. Diamond

    (12) Отправил оригинал, смотрите, пользуйтесь, комментируйте.

    Reply
  14. vitalidva

    то что надо

    спасибо

    Reply
  15. MSensey

    Можно бы добавить кнопку для выбора всех ролей

    Reply
  16. MSensey

    Не очень понравилось, что права находятся в строках.

    ИМХО лучше их разместить в колонке, так будет лучше просматривать

    Reply
  17. Diamond

    (16) в варианте сравнения прав имено в колонках права

    про какой режим говорите?

    Reply
  18. АлИв

    Ограничения доступа к данным можно добавить?

    Reply
  19. lion11

    (16,17) Согласен с MSensey, наличие/отсутствие конкретных прав лучше отображать не в виде дерева, а в таблице, как в шахматке, а то приходится для каждого интересующего объекта раскрывать список. Например, как в конфигураторе у ролей просмотреть «Все роли», только не по всем, а по выбранным ролям.

    Reply
  20. Yashazz

    MSensey, lion11, да, в таблице удобнее. Я для себя давно такую сделал и пользуюсь, она пусть и не настолько навороченная (анализ для пользователя не делал), но умеет всё в таблице-шахматке, т.е. в моксель с группировками.

    Reply
  21. akolomensky@gmail.com

    подскажите, как сделать,чтобы менеджеры видели только свои счета, и своих контрагентов?

    Reply
  22. Diamond

    to Kubik

    Используйте RLS

    Reply
  23. adapter

    кажется из всех подобных — самая здравая разработка. Хотелось бы еще увидеть РАЗЛИЧИЯ прав. т.е. показать только разницу между ролями. Это к вопросу «некуда развивать» 😉

    Reply
  24. Diamond

    (24) Закладка «Для ролей»

    Тип отчета «Сравнить выбранные права»

    это не подходит?

    Reply
  25. adapter

    он показывает все вместе. и совпадающие пункты тоже. это не наглядно. Но мы уже допилили твою и теперь показывает только те пункты, где не совпадает. Намного удобней вышло

    Reply
  26. alex2808

    Можно развивать в сторону копирование прав.

    Например по документам.

    😀

    Reply
  27. MamontS

    Достаточно удобная обработка, работает и после конвертации в 8.2, респект автору!

    Reply
  28. SKIFFler

    действенная вещь

    Reply
  29. kr_andr

    Спасибо

    Reply
  30. Программулькин

    не плохая штуковина для анализа, а то мы программисты как сапожник без сапог, для юзеров тьма всяких отчётов, а для анализа прав 1с даже пальцем не пошевелят. Нужно будет объедение с другими обработками по настройке. Или в эту добавить функционал для настроек юзеров.

    Reply
  31. webester

    Огромное спасибо! Вы меня спасли. От написания такого отчета )))

    Reply
  32. webester

    Не хватило функционала, полез в код. О мои глаза! Они кровоточат до сих пор! Это просто жесть. Вы сами то понимаете, что пишете? Названия переменных «лЭл», «пСпТипов», «лСтрТабл» и так до бесконечности, и не только стиль именования переменных.

    Reply
  33. V.Nikonov

    Вот ещё бы RLS припаять!!

    Reply
  34. LordPhoenix

    Спасибо ) Пригодится!

    Reply
  35. sergey3234

    Очень нужная вещь! Спасибо!

    Reply
  36. fixin

    Блин, это для 82, а не для УФ. 😉

    Reply

Leave a Comment

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