Расширенная настройка прав пользователей




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

45 Comments

  1. Romarius

    Хорошая идея!

    Reply
  2. Свой

    Спасибо за разработку, если можно, задам вопросы по внедрению этой системы:

    1. кто значально был постановщиком задачи ? (руководство, отдельный ответственный работник), в каком виде ставлась задача — кратком или подробном?

    2. как восприняли работу системы те, кого ограничивают — операторы, менеджеры?

    3. сложно ли осваивалась система руководством, настраивают ли они сами доступы ?

    4. каков уровень удовлетворенности заказчиков этой системы в вашем случае ?

    Reply
  3. victuan

    (2):

    1) По совместительству на этом предприятии я не только программист, но и постановщик учета. Задачу поставил я.

    2) Пока об этом говорить рано. Разработка системы началась 22.05.09 (4 дня назад), закончена сегодня и внедрена на предприятии (т.е. это бета-версия). Поэтому никто еще ничего не почувствовал. Следующим шагом будет тотальное ужесточение всех прав, чтобы методом проб и ошибок вычислить оптимальный набор прав пользователей (принип прост, если пользователю дать лишние права изначально, он промолчит, если забрать, он прибежит и начнет их (права) качать)

    3) инструкцию по настройке я отдал сегодня гл. бухгалтеру, время покажет как она справится

    4) об этом говорить еще рано. Но думаю результат удовлетворит многих: и постановщика учета и потребителей системы.

    Reply
  4. Shaman342

    (3) можно ли инструкцию по настройке в студию? … чтобы не изобретать велосипед 😉

    Reply
  5. victuan

    (4) Инструкция по настройке в описании сабжа (начиная со слов «Настройка прав пользователей осуществляется через вызов справочника Пользователи…»).

    Другой пока нет 😉

    Reply
  6. artbear

    >>Планы доработок на будущее:

    >>1) избежать сильного изменения конфигурации при внедрении системы прав

    >>(видимо, буду использовать ВК (формекс?))

    Рекомендую юзать ВК 1С++.

    В этой ВК я специально для подобных задач реализовал класс Перехватчик — универсальный перехват практически любых событий 1С и различных ВК без переписывания кучи кода в конфигурации.

    Читай доку на 1С++ 3.0.1.ХХХ и форум компоненты на 1cpp.ru

    ЗЫ я специально делал этот объект, потому что надоело для каждого метаданного прописывать спец.код в модуле формы и модуле документа.

    Очень рекомендую.

    Reply
  7. victuan

    (5) Спасибо за рекомендации, наверное, я так и сделаю. И даже, наверное, класс ВыполняемыйМодуль задействую, чтобы можно было задавать в пользовательском режиме произвольное условие на право доступа.

    Reply
  8. artbear

    (5+) Перехватчик как раз позволяет избежать «идиотского» для подобных задач встраивания спец.кода во все формы 🙁

    Reply
  9. artbear

    (8) Да, для произвольных условий ВМ весьма удобен.

    Reply
  10. alexk-is

    (0) Может быть текст процедур раскрасить?

    Reply
  11. victuan

    (11) В описании разработки? Раскрасил.

    Reply
  12. Ёпрст

    не работает:

    http://s48.radikal.ru/i121/0905/d4/cbc09541e1c0.jpg

    спокойно дает создавать…

    Reply
  13. victuan

    (12) Набор прав пользователя: [Вася]:*

    Звездочка (*) дает мне право утверждать, что набор прав не записан для текущего пользователя, следовательно, не действует.

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

    Reply
  14. artbear

    (8) Онлайн-дока на Перехватчик http://www.1cpp.ru/docum/html/Hooker.html

    Reply
  15. victuan

    (14) Попозже посмотрю. Блиц-вопрос по перехватчику: он позволяет перехватить метода объекта, выполнить код, а затем продолжить выполнение перехваченного метода?

    Reply
  16. Ёпрст

    (15) да.

    Reply
  17. victuan

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

    Reply
  18. Ёпрст

    (18) смотри Undo в моём профиле, например.

    Reply
  19. victuan

    А перехватчик умеет перехватывать события, не объявленные в форме объекта (напр., проц. ПриЗаписи используется не во всех справочниках, а интерактивную запись нужно перехватывать везде)

    Reply
  20. artbear

    (18) Или юзай поиск в форуме 1cpp.ru по слову Перехватчик, примеров там море + ! разбор ошибок использования Перехватчика ! 🙂

    Reply
  21. artbear

    (0) Кстати, на этом сайте уже вроде выкладывался пример работы с правами для 77 на базе Перехватчика.

    Правда, ссылку не помню.

    На форуме 1С++ в разделе Репозитарий точно есть.

    Reply
  22. Ёпрст

    (20) Конечно! Перехватывает не их, но еще и все события формекса…

    Reply
  23. Ёпрст

    +23 не только их..

    Reply
  24. artbear

    (20) Да, в этом вся прелесть/фича Перехватчика — что для нормальной работы универсальной механизмов совершенно не нужно прописывать обработчики событий в каждой форме, а достаточно определить их на верхнем уровне.

    Любое перехваченное событие в Перехватчике можно отменить, не пропустив на следующий уровень, например, в модуль конкретной формы — т.е. полное управление на разработчике.

    Reply
  25. artbear

    (23+) Перехватчик перехватывает не только штатные события 1С, как форм, так и глобальника, но и все события ФормЕкс, а также события других ВК, реализованные аналогично событиям 1С и ФормЕкс — например, события ВК RIK_SQL, RWidjets.

    Причем код классов перехватчиков совершенно не зависит от этих ВК, все универсально.

    Reply
  26. Alex1c

    «5) создать менеджер внешних отчетов, настраивающий права использования внешних отчетов (заменив Сервис — Дополнительные возможности).»

    Рекомендую ознакомиться с http://www.infostart.ru/profile/1723/projects/615/

    использую уже давно, полностью устраивает. Решение весьма продумано и оригинально

    Reply
  27. artbear

    (27+) Ага, Навигатор рулит, очень удобно.

    Reply
  28. victuan

    (27) Спасибо за ссылку! Вещь, судя по описанию, хорошая!

    Я же хотел просто интегрировать нечто подобное с моим справочником пользователей.

    Reply
  29. victuan

    Обновил демо-конфигурацию: исправил ошибки:

    1) не учитывались мгновенно изменения прав пользователя при переносе в другую группу

    2) При создании нового пользователя он автоматически помещается в группу пользователя Константа.ПраваПользователяПоУмолчанию

    Reply
  30. victuan

    Обновил демо-конфигурацию: исправил ошибку:

    3) При вводе нового документа копированием неверно устанавливались Автор и Дата создания документа

    Reply
  31. victuan

    Обновил демо-конфигурацию: исправил ошибки:

    4) глюки интерфейса (ошибки отображения при редактировании дерева набора прав)

    5) при удалении проведенного документа проверяется дополнительно право «ОтменаПроведения»

    Reply
  32. victuan

    Обновил демо-конфигурацию: исправил ошибку:

    6) для новых документов не проверялось право «Дата запрета редактирования».

    ЗЫ: как видите на практике обработка активно используется. Но руки прикрутить 1с++ пока не доросли, т.к. в моей деятельности достаточно уже имеющегося функционала.

    Reply
  33. DeepDiver

    Рарус Администратор не смотрели?

    Reply
  34. victuan

    (34) Нет, и почему-то не хочется что-либо от Раруса смотреть.

    Reply
  35. DeepDiver

    А зря! Отличная администрилка для 77 не защищённая никакими ключами…

    Reply
  36. rosalin

    Спасибо! Отличная обработка давно ищу что то подобное , возможно ли доработать что бы можно было выставлять ограничение прав на группу или строку справочника ❓

    Reply
  37. anig99

    (37) перейдите на 8.1 Там есть RLS (;

    Reply
  38. rosalin

    (38) Спасибо конечно но ищу более радикальное решение на 8.1 нет технической возможности перейти

    Reply
  39. victuan

    (37) Да, у меня в планах стоит контроль прав с точностью до групп и элементов справочника, а также с точностью до реквизитов объектов.

    Вопрос в том, когда руки найдут свободное время это реализовать.

    Reply
  40. yanis

    (40) Эту идею удалось реализовать? Если да — то можете выложить?

    Reply
  41. victuan

    (41) Пока не реализовал. Возможно займусь этим в межотчетное время.

    Reply
  42. Timson1234

    Спасибо большое, очень помогло)

    Reply
  43. victuan

    (44)Это что? Клоны тупым копипастом моих сообщений набирают себе балы? Модераторов прошу обратить внимание!

    Reply
  44. das58

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

    Reply
  45. JuliettT

    Нужен такой же для 8.2 Ут, может есть у кого на сайте?

    Reply

Leave a Comment

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