Самый суровый рабочий стол — на основе доступных прав пользователя




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

28 Comments

  1. Virikus

    С таким же успехом можно было и интерфейс программно рисовать.

    Каждый раз переключаться в это окно при 10-20 открытых окнах очень удобно будет пользователям.

    Reply
  2. Lancelot-2M

    (1) Virikus, практика показывает, что мои пользователи ЗУП любят пользоваться рабочим столом. И да, можно было и интерфейс программно рисовать — но только чтобы блуждать в нем и ломать глаза. Прелесть в том, что на этом рабочем столе легко найти нужный объект, набрав 3-4 буквы на клавиатуре, плюс он достаточно гибок в настройке и доработке.

    Reply
  3. Yashazz

    Неудобная штука. Разбиение на классы объектов 1С уже давно никак не связано с логикой предметных областей, кругами задач и сферами ответственности. Поди пойми, что из нужного тебе — справочник, а что регистр сведений… Кстати, где они, регистры сведений-то?

    Reply
  4. Lancelot-2M

    (3) Yashazz, для регистров все есть, для всех объектов данных есть кроме констант (для них все равно своя общая форма всегда) — просто небольшая проверка на полные права… и бизнес процессы с задачами закомментированы)

    «Поди пойми, что из нужного тебе — справочник, а что регистр сведений… » — это точно, этого понимания и не хватает юзерам. Пусть научатся, наконец, им понравится понимать что они делают.

    А логика предметных областей, круги задач и сферы ответственности задаются конкретному пользователю ролями, которые в данном случае и являются основанием для наполнения рабочего стола. Концепция отнюдь не оригинальная)))

    Reply
  5. Yashazz

    (4) Не согласен. Не нужно им такое понимание. Нет никакой разницы, чем является список требуемых данных по физической сути. Важно, с чем он связан по смыслу.

    Я, знаете, в типовых конфах и «Ставки НДС» как справочник видел, и валюты как перечисление… Нет тут критерия, и морочить голову юзверям именно этим разбиением тоже пользы мало.

    Reply
  6. Lancelot-2M

    (5) Yashazz ну-ну, и как долго вы будете искать какой-либо объект чтобы посмотреть в чем трабл, если юзер будет называть его на своем «птичьем» языке и упорствовать в своей неспособности сделать принтскрин?) сколько писем это займет? Сколько минут разговора? как быстро вы объясните одному из полутора сотен где в ЕГО интерфейсе находится нужное ему действие/объект?

    Reply
  7. anig99

    хм…явно сродни http://infostart.ru/public/88030/

    те же…только в профиль и попроще…

    Кстати, у меня всё-таки пошло внедрение, когда избранное добавил. Добавь избранное, пользователи оценят.

    И вопрос. Как делаете проверку на права, где доступ есть, но условие стоит «ГДЕ ЛОЖЬ»?

    Reply
  8. Lancelot-2M

    (7) anig99, имеете ввиду ограничение доступа на уровне записей бд? — тогда никак, в нашей организации не предполагается такового. в то же время стоит задача очень жесткого разделения прав на объекты — поэтому и созрело такое решение, т.к. приходится много времени тратить на создание нужных ролей — некоторые роли, увы и ах, только для редактирования одного-двух документов. Но таковы реалии. Сроки и так горят у наших внедряющих франчей, так что подключились и мы — аборигены (по их просьбе, а у нас и текучки за глаза хватает). И вот — такое решение. Быстро и, думаю, эффективно.

    И вашу идею не плагиатил) — вчера уже все готово было, кроме исключаемых объектов — и ночью наткнулся))))

    А для избранного нужно регистр добавлять или внешний источник данных — вроде файлика DBF или XML, а хотелось бы получить «stand alone» решение. Конечно, можно надеяться на механизм сохранения настроек формы… вообщем, если пристанут — добавлю)

    Reply
  9. anig99

    (8) неее. про плагиат я не говорю, написал же, что «в профиль» (:

    А про ограничения. В конфе в ролях есть очень много объектов, для которых стоит заглушка, чтобы отчеты не вываливались с ошибкой. Стоит галочка на доступ к чтению, но в условиях стоит ГДЕ ЛОЖЬ. Т.е. при обращении к этому объекту ошибки не будет, но результатом обращения будет пустота. RLS тут не при чем. Если проверять доступ к этим объектам через команду платформы, то она покажет доступность объекта, что по сути будет неверным. Если у вас самописные роли без RLS совсем, то тогда проканает, но для стандартных ролей — это проблема. Список объектов на вашем рабочем столе будет слишком большим.

    Избранное можно хранить в регистре(справочнике) настроек (для типовых решений) или просто в настройках формы (средствами платформы)

    Reply
  10. Lancelot-2M

    (9) anig99, а у меня проверяется не на чтение, а на редактирование и просмотр — права на действия пользователя(интерактивные). И списки действительно большие для стандартных ролей, особенно справочников, совершенно не к месту — делаем свои роли, как уже говорилось.

    Reply
  11. Confucius

    В практике был и такой опыт составления интерфейсов..но практика показала что со временем, когда юзеры начинают понимать немного упп, приходит аппетит и начинается тут добавь тут поправь, и это всё согласовывается..и превращается в свалку. Поэтому я сторонник того что нужно по максимуму стараться внедрять стандартные механизмы. ДА по началу сложно и непонятно..но ко всему привыкаешь, а потом будут удивляться что так всё просто оказывается.ИМХО

    Reply
  12. TODD22

    (5)

    Я, знаете, в типовых конфах и «Ставки НДС» как справочник видел, и валюты как перечисление…

    Это в какой типовой валюты это перечисление? А ставки НДС это справочники?

    Reply
  13. Yashazz

    Валюты, кажется в Производство+БУ, точно не вспомню, а НДС часто делали справочниками во времена 7.7

    Reply
  14. Lancelot-2M

    (13) Yashazz, неа, в ПУБ валюты в справочнике, и СтавкиНДС тоже справочник — тут вы правы. На мой взгляд ставкам НДС в справочнике самое место.

    Reply
  15. Fenicss

    Смысл вообще отучать от стандартных интерфейсов ведь все равно придется на него перейти? Да и как то некрасиво это все смотрится)

    Reply
  16. DrAku1a

    Суровые сибирские внедренцы, они не дремлют 🙂

    Мысль сделать список вместо всяких фентифлюшечек — ИМХО правильная. Следующий этап — динамически настраиваемый интерфейс + списки документов на рабочем столе сразу (для некторых ролей типа диспетчер/оператор).

    Reply
  17. Stas_Gromov

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

    Reply
  18. Lancelot-2M

    (15) Fenicss, смысл в том, чтобы задействовать другой тип памяти у пользователя. Есть мнение, что тогда можно забить на классические интерфейсы — меню и панели.

    Reply
  19. Fenicss

    (18) Я с программистами психологами еще не сталкивался просто я всегда стараюсь все делать стандартно. Так как ваше задействование памяти может вам аукнутся))

    Reply
  20. Lancelot-2M

    (19) Fenicss, ну пока что люди, принимающие промежуточные работы не расстроены))) Все равно, кто потолковее, те лезли в Операции и выбирали объекты из списка, а не блуждали по меню — это внушает некоторую надежду на успех)

    Reply
  21. tadem

    Ну вот у нас инженера-строители. им не надо нечего больше кроме своих пяти документов. У них нет времени изучать больше. Вот для них вообще супер.

    Reply
  22. zfilin

    (6) Я пользователь, я не хочу понимать что и как называется, я хочу делать свою работу.

    Reply
  23. Lancelot-2M

    (22) zfilin, а счетами сможете пользоваться, не понимая, что следующий ряд костяшек соответствует следующему разряду в десятичной системе исчисления?

    Если Вы не хотите понимать разницу между справочником и документом, между документом и его печатной формой — ну что тут скажешь, видимо вам пора сменить вид деятельности…

    Reply
  24. zfilin

    (23) Боюсь, мой друг, вы слишком категоричны.

    Reply
  25. born85

    Мне нравится идея — и не надо путаться. Все деликатно и строго.

    Reply
  26. Lancelot-2M

    (24) zfilin, а вы толсто троллите)

    Reply
  27. zfilin

    (26) ;))

    Reply
  28. mikhailovaew

    (12) кажется, в комплексной 7.7 был справочник «Варианты расчета налогов», где были разные извращенные комбинации с НДС по разным ставкам в сумме / сверху и НП. И там же, вроде, и сами ставки были справочником, хотя утверждать не берусь.

    Reply

Leave a Comment

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