"Нет прав доступа!" при проведении документа




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

22 Comments

  1. rasswet

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

    Reply
  2. morozov.sv

    Если нет прав на запись в регистр, то в сообщениях перед названием регистра будет написано «Нет прав! — …».

    Reply
  3. O-Planet

    Правда, стоит более нагляднее сделать, хотя бы зеленым-красным. Но идея супер. Простая и по теме…

    Reply
  4. itbilding

    Спасибо. Обработка очень полезна. Не раз выручит.

    Reply
  5. vasilykushnir

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

    Reply
  6. фотина

    СПАСИБО!!! отличная идея, экономит кучу времени.

    Reply
  7. ivanoa

    Супер! Спасибо большое! Помогло!

    Reply
  8. Romanik

    у меня в 7.7 не открывается

    Reply
  9. artbear

    (0) Так вроде в последних версиях 1С 8.1 при недостаточных правах показывается, какое право запрещено/недоступно ?

    Reply
  10. wolk

    (9) Так оно и не должно там открываться :-))))

    Reply
  11. dushechka_n@mail.ru

    Открываю в УПП, выбираю документ, нажимаю выполнить и…. НИЧЕГО! никакой реакции 🙁

    Reply
  12. MSensey

    Обычно нарушение прав возникает не по причине отсутствия доступа к регистру, а по причине записи в регистр данных, которые конфликтуют с настройкой прав на уровне записей.

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

    Для выявления проблемы можно использовать существующие средства — «Отчет по движениям документа»:

    1. сформировать его под полными правами

    2. сформировать под «проблемным» пользователем

    3. найти отличия (обычно в них проблема)

    Reply
  13. tormozit

    В 8.2 появилось событие журнала регистрации для регистрации отказа доступа в RLS. Здесь уже выкладывалась обработка для его включения и выключения. Вроде бы она решает задачу более универсально и надежно.

    Reply
  14. fggf

    Народ, киньте обработку на e-mail (budykom@gmail.com), очень надо. Заранее благодарен!

    Reply
  15. fggf

    (14) кинь линк на эту обработку, потому что проблема довольно серьезная

    Reply
  16. andrewPt

    Правда, стоит более нагляднее сделать, хотя бы зеленым-красным. Но идея супер. Простая и по теме…

    Reply
  17. Программулькин

    Минус. Движение по регистрам можно и просто глянуть движение документов… А вот полноценный тест роли не получается. Скачал. Потестил. Проблему не помогла решить. Есть документ. Ошибка прав доступа.

    Reply
  18. vlanik

    Задумка неплохая, доработать еще нужно, имхо.

    Reply
  19. dismoitout

    С пасибо помгло решить проблему с » Есть документ. Ошибка прав доступа. »

    у определенного пользователя.

    Reply
  20. natarezn

    мне ничего не помогает. говорят конфликт — ввели характеристики. но такого не бывает. две недели работы в 1с ут и тут такая информация что еще регистры

    Reply
  21. kredko

    За обработку минус. Пользы от этой обработки никакой. Все регистры, по которым документ делает движения можно просмотреть через конфигуратор. Ну и что из этого, если я узнаю, что нет у пользователя прав доступа на данный регистр??? А если эти права есть, а документ не проводится?

    Например, сейчас хотим включить RLS по проектам. Включили на тестовой базе для тестового пользователя, а документ не проводится. Смотрю Журнал регистрации. Отказ в доступе: Имя регистра. Права доступа на этот регистр есть, а документ всё равно не проводится. Вот это засада. И эта обработка тут помочь мне ничем не сможет.

    Reply
  22. fugu

    (14) Вот человек предложил наулучший действующий метод. Спасибо огромное.

    Reply

Leave a Comment

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