Подсистема "Дополнительные права доступа v 1.0.2" для Управления торговлей 10.3




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

17 Comments

  1. Поручик

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

    «Кнопочек» в конфе очень мало, но пока подсистема насущные потребности удовлетворяет.

    Reply
  2. Поручик

    Обновление подсистемы от 17.06.2010

    + добавлены две роли дп_УстановкаГраницыЗапретаИзмененияДанных (для администратора или иного ответственного лица), дп_ЧтениеГраницыЗапретаИзмененияДанных (для остальных пользователей) с шаблонами ограничения для использования механизма ОграниченияПравДоступаНаУровнеЗаписей

    + изменения в коде, справочной информации.

    ——————

    По результатам эксплуатации выяснилось:

    Если при изменении документа, например «ПоступлениеТоваровУслуг», есть вероятность изменения какого-либо подчинённого документа, например счёт-фактуры полученной, находящегося в том же периоде или на который распространяется общая дата запрета редактирования, рекомендуется установить такую же дату запрета и для этого подчинённого документа. В противном случае возможно получение ошибок в транзакции.

    Соответствующее сообщение выдаётся при редактировании границ запрета и при ошибке записи.

    Reply
  3. yuko

    Подсистема, просто супер! Очень отличная вещь.

    PS. Единственное не пойму…так это почему автоматическая установка даты запрета не предусмотрена в типовой конфигурации.

    Reply
  4. Поручик

    Обновление от 15.08.2010

    Версия подсистемы 1.0.1

    + В состав конфигурации включена обработка Матрица ролей пользователей ИБ http://infostart.ru/public/74210/ для установки прав доступа (ролей) пользователям.

    + Изменения в интерфейсе, коде, справочной информации.

    Reply
  5. stakanoff

    совет по развитию доработки: бухгалтеры и прочие пользователи систем обычно делят учет по участкам — учет ОС, реализация, поступление и т.п. — над документами накрути справочник «участки учета», с произвольным составом видов документов.

    закрывать границы по участкам — большое удобство + легко внедряется на уровне приказа с регламентом, понятным всем пользователям

    Reply
  6. Поручик

    Попробую, как время будет. Но это актуально наверное больше для БП, к тому же у нас такого нет.и с БП я практически не работаю.

    Все мои работы и апдейты, вываленные здесь, это выглаженные версии рабочих.

    Reply
  7. SmagOrg

    Впечатлен. Но метод интеграции весьма косоват. Вместо

    #———— [OPEN] ————

    #———— [FIND] ————-

    ПроверкаПериодаЗаписейРегистров(Источник, Отказ);

    #———— [REPLACE WITH] ————-

    //[begin] Added by Sergey. http://infostart.ru/profile/18346/ Подсистема Дополнительные права доступа.

    //ПроверкаПериодаЗаписейРегистров(Источник, Отказ);

    ДополнительныеПраваДоступа.ПроверкаПериодаЗаписейРегистров(Источник, Отказ);

    //[end] Added Подсистема Дополнительные права доступа.



    Я сделал



    Процедура ПроверкаПериодаЗаписейРегистров(НаборЗаписей, Отказ, ВидРегистра = «РегистрНакопления») Экспорт

    //Начизм

    ДополнительныеПраваДоступа.ПроверкаПериодаЗаписейРегистров(НаборЗаписей, Отказ);

    Возврат;

    //Конизм



    Согласитесь или править больше десятка вхождений или форвардить в 2 местах.

    Reply
  8. Поручик

    (7) Спасибо, спорить не буду, 😀

    Посмотрю на досуге, что ещё можно сделать. Дело в том, что я уже уволился из той конторы, так что немного не до того.

    Reply
  9. Поручик

    Не совсем понял, что ты сделал. Понял только, у тебя УППырище.

    Reply
  10. shatt

    Спасибо за разработку!

    Reply
  11. Поручик

    Обновление от 29.05.2011

    Версия подсистемы 1.0.2

    Изменения в подсистеме:

    + обновлена обработка Матрица ролей пользователей ИБ.

    Reply
  12. seandr

    По каким то причинам, установка прав на виды документов не корректно отрабаывается. Все делал по инструкции. Пока что пришлось отказаться от использования. Но функионал очень полезен.

    Reply
  13. Поручик

    (12) В чём некорректность выражается?

    Reply
  14. dynamite

    Очень даже хорошая программа то что мне нужно,

    Я хотел написать сам по публикации http://infostart.ru/public/80499/ но что то у меня не получилась

    Попробую с вашим думаю поможет

    Reply
  15. serge_focus

    Начинание отличное. Жаль, что в типовых конфигурациях уж очень неудобно сделано управление ролями и доступами к обьектам. Добавили-бы в стандартную конфигурацию что-то вроде матрицы доступа к обьектам , привязанную к пользователю. Чтобы напрямую, не через конфигуратор, зашел , и проставил настройки для пользователя, на основании шаблонов ролей. А если нужно — топодправил. А то увы и ай. Приходится извращатся в конфигураторе…

    При этом херить полностью автоматическое обновление…

    Reply
  16. serge_focus

    Я так понял — продолжения пока нет…

    Reply
  17. Поручик

    (16) Если вопрос ко мне, то за деньги продолжение будет.

    Reply

Leave a Comment

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