Обработка для сравнения-объединения ролей




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

25 Comments

  1. kapustinag

    Нужная вещь, но чуть пораньше бы. В последней версии платформы 8.2 уже есть «продвинутое» сравнение ролей. Вашу обработку пока не скачивал. Есть дополнительные возможности по сравнению с возможностями платформы?

    Reply
  2. Mavin

    (1) Платформа предоставляет только визуальное сравнение ролей и ничего более. Если посмотреть на возможности сравнения модулей, то там например можем явно указать какую процедуру возьмем из новой конфигурации, а какую оставим из текущей (доработанной). Моя обработка по-сути помагает сделать объединение ролей по-объектно, т.е. указать что возьмем из новой, а что из текущей.

    Reply
  3. wolfsoft

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

    Reply
  4. Mavin

    (3) Согласен. Но ситуации всякие бывают. Например в УПП роль Пользователь назначается всем пользователям и нужно добавить некоторое разграничение прав на объекты, к которым данная роль дает доступ. Тут проще и правильнее наверное доработать именно эту роль, чем пытаться либо ее дублировать, либо дорабатывать ограничения через код.

    Reply
  5. wolfsoft

    (4) А почему не скопировать роль «Пользователь», назвать её «хПользователь», назначить её всем пользователям вместо роли «Пользователь», а дальше заниматься «разграничение прав на объекты, к которым данная роль дает доступ»? При последующем обновлении нужно будет только скопировать вашу роль «хПользователь», при необходимости дополнить её нужными правами новых объектов (насколько я понял из первого комментария, отличия типовых ролей можно будет увидеть штатными средствами).

    Reply
  6. Mavin

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

    Что касается «отличия типовых ролей можно будет увидеть штатными средствами», то да можно увидеть типовыми средствами, но если таких отличий много, то их все придется переносить руками.

    Приведу простую аналогии с модулями: Пусть у нас есть общий типовой модуль и мы захотели доработать некоторую в нем процедуру. Мы можем либо просто доработать процедуру в типовом модуле, либо скопировать эту процедуру в наш общий модуль и уже там ее доработать, а вызов перенаправить на наш модуль. Во втором варианте (по-сути то что предлагаете вы с ролью хПользователь), помимо того, что нужно везде сделать перенаправление вызова, так и еще нужно следить, что изменят в типовой процедуре, чтобы эти изменения внести в нашу для корректной работы.

    А можно поступить проще, просто немного доработать типовую. Если в новом релизе изменения не коснулись данной процедуры (при этом другие процедуры общего модуля могли изменится), то мы просто при объединении возьмем ее из нашей конфы. Если же типовая тоже была исправлена (это сразу увидим), то просто сделаем аккуратное их объединение. Я по-сути предлагаю с ролями действовать точно также.

    Reply
  7. wolfsoft

    (6) Ладно, дело личное, останемся при своих мнениях 🙂

    Что касается сравнения ролей, рекомендую вот эту обработку http://infostart.ru/public/14922/, она, кстати, RLS обрабатывает, в своё время мне очень помогла сэкономить время при обновлении чужой конфы с изменёнными RLS-ами. А это версия под 8.2 от того же автора http://infostart.ru/public/103851/ (ей не пользовался, пока не было необходимости).

    Reply
  8. Рамзес

    (5) wolfsoft,

    назначить её всем пользователям вместо роли «Пользователь»

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

    Reply
  9. Mavin

    (8) Доработать конечно можно всякое, что и без роли «Пользователь» можно зайти. Но все-таки самое логичное в данной ситуации это доработать типовую роль «Пользователь». А далее остается только уметь обновлять эту самую Роль, что и позволяет моя обработка с наименьшими трудозатратами.

    Reply
  10. nk1c

    делаю настройку папок, выгружаю туда роли в xml , нажимаю обновить файлы, но список файлов остается пустой и дерево сравнения ролей также конфа упп

    Reply
  11. Mavin

    (11) Для того, чтобы роль попала в список файлов, должны во-первых заполнены быть все 4 папки, во-вторых должны быть выгружены роли в первые 3 папки, причем все они попарно должны отличаться (3 роли с одним именем), а иначе можно автоматически определить какаю роль взять полностью в новую конфигурацию.

    Reply
  12. Sashares

    (12) то есть, если нужно сравнить роли 2х релизов типовой конфигурации (роли во 2 папке будут совпадать с ролями в 1), данная обработка помочь не сможет?

    Reply
  13. Mavin

    (14) Да, текущая реализация обработки такую ситуацию автоматически обработает и данную роль в список для сравнения не выведет. Основное предназначение было все-таки не для простого сравнения ролей, а именно при обновлении.

    В вашей ситуации, если вам нужно все-таки просто сравнить 2 роли и как предлагаете 3-ю роль добавить аналогичную 1-й или 2-й, то это можно либо сделать элементарной доработкой обработки, либо в качестве 3-й роли взять любую другую роль из конфигурации.

    Reply
  14. Manaka

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

    Reply
  15. ZhokhovM

    1.Когда будет обработка на управляемой форме?

    2.Нет ли возможности сократить до 3ёх папок(типовая, доработанная и пустая)?

    Reply
  16. Mavin

    (17) 1. А зачем это нужно? Тут ведь нет привязки к конфигурации, в которой запускается обработка. Можно всегда создать пустую конфигурацию и запустить ее в обычном приложении. Да и вообще, любую конфигурацию можно будет запустить в обычном приложении.

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

    Reply
  17. ZhokhovM
    1. А зачем это нужно? Тут ведь нет привязки к конфигурации, в которой запускается обработка. Можно всегда создать пустую конфигурацию и запустить ее в обычном приложении. Да и вообще, любую конфигурацию можно будет запустить в обычном приложении.

    Затем чтобы заменять фрагменты MRG в ролях(в закладке «Шаблоны» И «Ограничение доступа к данным»). Ну или чтобы выгружать файлы конфигурации в определенную папку, а обработкой брать из этой папки файлы, анализировать их и потом грузить их обратно.

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

    В типовой что-то поменялось по сравнению моей конфигурацией, мне нужно быстро объединить роли с приоритетом новой конфигурации поставщика.

    Reply
  18. Mavin

    (19)

    Затем чтобы заменять фрагменты MRG в ролях(в закладке «Шаблоны» И «Ограничение доступа к данным»). Ну или чтобы выгружать файлы конфигурации в определенную папку, а обработкой брать из этой папки файлы, анализировать их и потом грузить их обратно.

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

    В типовой что-то поменялось по сравнению моей конфигурацией, мне нужно быстро объединить роли с приоритетом новой конфигурации поставщика.

    Вот тут то вам как раз и нужно знать данные старой типовой конфигурации. Ведь типовое объединение ролей с приоритетом каким-нибудь тоже осуществляется на основании того, что известны данные всех 3-х конфигураций.

    Reply
  19. KapasMordorov

    (17)

    Сравнение нескольких ролей, УФ и обычная форма.

    http://infostart.ru/public/256247/

    Объединения нет.

    Reply
  20. Mavin

    (21) KapasMordorov, Насколько понимаю, ваша обработка помогает более наглядно проанализировать какую-то роль, чтобы потом вручную можно было ее доработать. Для целей обновления ее тоже конечно можно использовать, но вот все найденные различия тогда вам придется переносить вручную.

    С помощью моей обработки обновление можно практически делать в автоматическом режиме. Руками приходится вмешиваться совсем редко, причем делается это тоже в самой обработке и достаточно просто.

    Reply
  21. ZhokhovM

    (21) KapasMordorov, да, нет объединения — это плохо, а в остальном — неплохо.

    Reply
  22. Borisych

    Хотел сам такую обработку писать, буду проверять как этой разработкой пользоваться. СПАСИБО!

    Reply
  23. Niko_la

    Мне не совсем понятно следующее.

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

    Выгружу роли соответственно в 3 папки. В каком положении необходимо расставить галки для того чтобы в результирующих ролях были и новые типовые и чтобы не затерялись старые измененные права. Нужно ли после «сравнения ролей» вручную что то проставлять для получения требуемого мне результата?

    Reply
  24. Mavin

    (25) В дереве сравнения колонки расположены в следующем порядке: типовая старая, доработанная, типовая новая. Брать данные естественно подразумевается либо из доработанной, либо из новой типовой. Назначение галочки примерно такое же как назначение галочки в диалоге сравнения-объединения — галочки нет, берем из 2-й колонки (доработанная); галочка есть, берем из 3-й колонки. По-умолчанию галочки устанавливаются в зависимости от того, в какой конфигурации было изменение. Если для какого-то узла было двойное изменение, то в данном случае ячейка в колонке Узел закрасится сиреневым цветом и плюс к этому аналогично закрасятся ячейки — родители. Тем самым если после сравнения ячейка корня дерева не закрашена сиреневым, то не присутствует узлов с двойным изменением и тем самым можно сразу автоматически формировать итоговый файл.

    Reply
  25. ZhokhovM

    Скачал вашу обработку. Подпилил ее немного, теперь у меня можно 2 каталога указывать, например, типовая и доработанная, и узнать какие права нужно добавлять с любой ролью для любых объектов. На УФ в закладке «Сравнение ролей» http://infostart.ru/public/367989/

    Reply

Leave a Comment

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