<?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='\
Нужная вещь, но чуть пораньше бы. В последней версии платформы 8.2 уже есть «продвинутое» сравнение ролей. Вашу обработку пока не скачивал. Есть дополнительные возможности по сравнению с возможностями платформы?
(1) Платформа предоставляет только визуальное сравнение ролей и ничего более. Если посмотреть на возможности сравнения модулей, то там например можем явно указать какую процедуру возьмем из новой конфигурации, а какую оставим из текущей (доработанной). Моя обработка по-сути помагает сделать объединение ролей по-объектно, т.е. указать что возьмем из новой, а что из текущей.
Пмсм, роли лучше не менять типовые, а делать свои с префиксом каким-нибудь. Меньше проблем при обновлении.
(3) Согласен. Но ситуации всякие бывают. Например в УПП роль Пользователь назначается всем пользователям и нужно добавить некоторое разграничение прав на объекты, к которым данная роль дает доступ. Тут проще и правильнее наверное доработать именно эту роль, чем пытаться либо ее дублировать, либо дорабатывать ограничения через код.
(4) А почему не скопировать роль «Пользователь», назвать её «хПользователь», назначить её всем пользователям вместо роли «Пользователь», а дальше заниматься «разграничение прав на объекты, к которым данная роль дает доступ»? При последующем обновлении нужно будет только скопировать вашу роль «хПользователь», при необходимости дополнить её нужными правами новых объектов (насколько я понял из первого комментария, отличия типовых ролей можно будет увидеть штатными средствами).
(5) Вот как раз «при необходимости дополнить её нужными правами», т.е. сюда придется переносить все изменения типовой роли Пользователь для корректной работы, а это намного тяжелее, чем просто поправить типовую роль.
Что касается «отличия типовых ролей можно будет увидеть штатными средствами», то да можно увидеть типовыми средствами, но если таких отличий много, то их все придется переносить руками.
Приведу простую аналогии с модулями: Пусть у нас есть общий типовой модуль и мы захотели доработать некоторую в нем процедуру. Мы можем либо просто доработать процедуру в типовом модуле, либо скопировать эту процедуру в наш общий модуль и уже там ее доработать, а вызов перенаправить на наш модуль. Во втором варианте (по-сути то что предлагаете вы с ролью хПользователь), помимо того, что нужно везде сделать перенаправление вызова, так и еще нужно следить, что изменят в типовой процедуре, чтобы эти изменения внести в нашу для корректной работы.
А можно поступить проще, просто немного доработать типовую. Если в новом релизе изменения не коснулись данной процедуры (при этом другие процедуры общего модуля могли изменится), то мы просто при объединении возьмем ее из нашей конфы. Если же типовая тоже была исправлена (это сразу увидим), то просто сделаем аккуратное их объединение. Я по-сути предлагаю с ролями действовать точно также.
(6) Ладно, дело личное, останемся при своих мнениях 🙂
Что касается сравнения ролей, рекомендую вот эту обработку , она, кстати, RLS обрабатывает, в своё время мне очень помогла сэкономить время при обновлении чужой конфы с изменёнными RLS-ами. А это версия под 8.2 от того же автора (ей не пользовался, пока не было необходимости).
(5) wolfsoft,
вместо не получится. Если у пользователя не будет роли «Пользователь», он не сможет войти в систему.
(8) Доработать конечно можно всякое, что и без роли «Пользователь» можно зайти. Но все-таки самое логичное в данной ситуации это доработать типовую роль «Пользователь». А далее остается только уметь обновлять эту самую Роль, что и позволяет моя обработка с наименьшими трудозатратами.
делаю настройку папок, выгружаю туда роли в xml , нажимаю обновить файлы, но список файлов остается пустой и дерево сравнения ролей также конфа упп
(11) Для того, чтобы роль попала в список файлов, должны во-первых заполнены быть все 4 папки, во-вторых должны быть выгружены роли в первые 3 папки, причем все они попарно должны отличаться (3 роли с одним именем), а иначе можно автоматически определить какаю роль взять полностью в новую конфигурацию.
(12) то есть, если нужно сравнить роли 2х релизов типовой конфигурации (роли во 2 папке будут совпадать с ролями в 1), данная обработка помочь не сможет?
(14) Да, текущая реализация обработки такую ситуацию автоматически обработает и данную роль в список для сравнения не выведет. Основное предназначение было все-таки не для простого сравнения ролей, а именно при обновлении.
В вашей ситуации, если вам нужно все-таки просто сравнить 2 роли и как предлагаете 3-ю роль добавить аналогичную 1-й или 2-й, то это можно либо сделать элементарной доработкой обработки, либо в качестве 3-й роли взять любую другую роль из конфигурации.
Спасибо за обработку.
1.Когда будет обработка на управляемой форме?
2.Нет ли возможности сократить до 3ёх папок(типовая, доработанная и пустая)?
(17) 1. А зачем это нужно? Тут ведь нет привязки к конфигурации, в которой запускается обработка. Можно всегда создать пустую конфигурацию и запустить ее в обычном приложении. Да и вообще, любую конфигурацию можно будет запустить в обычном приложении.
2. Я так понимаю, вам это нужно либо чтобы посмотреть различия в двух ролях, либо в доработанную что-то вернуть из типовой. Мне же обработка нужна была именно для целей обновления конфигураций. И если роль в типовой никак не поменялась, то мы можем спокойно взять нашу доработанную роль.
Затем чтобы заменять фрагменты MRG в ролях(в закладке «Шаблоны» И «Ограничение доступа к данным»). Ну или чтобы выгружать файлы конфигурации в определенную папку, а обработкой брать из этой папки файлы, анализировать их и потом грузить их обратно.
В типовой что-то поменялось по сравнению моей конфигурацией, мне нужно быстро объединить роли с приоритетом новой конфигурации поставщика.
(19)
Так вроде бы вопрос был про обработку на управляемых формах, а не про ее использование. Про управляемые формы еще раз повторю, что смысла в ней никакого нет.
Вот тут то вам как раз и нужно знать данные старой типовой конфигурации. Ведь типовое объединение ролей с приоритетом каким-нибудь тоже осуществляется на основании того, что известны данные всех 3-х конфигураций.
(17)
Сравнение нескольких ролей, УФ и обычная форма.
Объединения нет.
(21) KapasMordorov, Насколько понимаю, ваша обработка помогает более наглядно проанализировать какую-то роль, чтобы потом вручную можно было ее доработать. Для целей обновления ее тоже конечно можно использовать, но вот все найденные различия тогда вам придется переносить вручную.
С помощью моей обработки обновление можно практически делать в автоматическом режиме. Руками приходится вмешиваться совсем редко, причем делается это тоже в самой обработке и достаточно просто.
(21) KapasMordorov, да, нет объединения — это плохо, а в остальном — неплохо.
Хотел сам такую обработку писать, буду проверять как этой разработкой пользоваться. СПАСИБО!
Мне не совсем понятно следующее.
Допустим, имеется у меня конфа с измененными ролями. Её необходимо обновить до актуального релиза.
Выгружу роли соответственно в 3 папки. В каком положении необходимо расставить галки для того чтобы в результирующих ролях были и новые типовые и чтобы не затерялись старые измененные права. Нужно ли после «сравнения ролей» вручную что то проставлять для получения требуемого мне результата?
(25) В дереве сравнения колонки расположены в следующем порядке: типовая старая, доработанная, типовая новая. Брать данные естественно подразумевается либо из доработанной, либо из новой типовой. Назначение галочки примерно такое же как назначение галочки в диалоге сравнения-объединения — галочки нет, берем из 2-й колонки (доработанная); галочка есть, берем из 3-й колонки. По-умолчанию галочки устанавливаются в зависимости от того, в какой конфигурации было изменение. Если для какого-то узла было двойное изменение, то в данном случае ячейка в колонке Узел закрасится сиреневым цветом и плюс к этому аналогично закрасятся ячейки — родители. Тем самым если после сравнения ячейка корня дерева не закрашена сиреневым, то не присутствует узлов с двойным изменением и тем самым можно сразу автоматически формировать итоговый файл.
Скачал вашу обработку. Подпилил ее немного, теперь у меня можно 2 каталога указывать, например, типовая и доработанная, и узнать какие права нужно добавлять с любой ролью для любых объектов. На УФ в закладке «Сравнение ролей»