Интерактивные права на доступ к объектам (beta)




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

    Еще не смотрел, но тема больная. Плюсик ставлю авансом

    Reply
  2. sound

    Вот тоже хотел свой динамический интерфейс развивать в этом направлении. Слушай вот еще бы подумать в сторону назначения прав для групп пользователей, было бы очень чудесно!

    Reply
  3. sound

    если быть точнее для справочника «Группы пользователей»

    Reply
  4. sound

    а вот в функции Функция ЕстьДоступ(ТипДоступа,Пользователь,Метаданные)

    вместо

    Возврат РезультатЗапроса.Парам;

    надо наверно написать

    Возврат РезультатЗапроса[0].Парам;

    у тебя же РезультатЗапроса — это таблица значений

    РезультатЗапроса = Запрос.Выполнить().Выгрузить();

    или я не прав?

    Reply
  5. sound

    вообщем довести бы это дело…

    Reply
  6. sound

    ээх по моему маловато событий у подписок

    Reply
  7. itmind

    (4) Прав. Исправил

    Reply
  8. sound

    уже хорошо, чо насчет групп? 🙂

    Reply
  9. ROM_1C

    Похоже сам делал…

    http://infostart.ru/projects/4262/

    Reply
  10. sound

    (9) дак в том то и дело, что

    «В те формы справочников, гду нудно запретить открытие и т.д нужно вставить в процедуру «ПередОткрытием» глобальну процедуру:»

    Вот если б можно было на все окна, по контексту, повесить подписку на событие «ПередОткрытием» а не писать в каждом справочнике и документе, тогда бы было гут…

    Reply
  11. ROM_1C

    (10)ага..

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

    Reply
  12. vasilykushnir

    Нечто подобное у меня на 7-ке.

    Куда выположить скрин?

    Reply
  13. sound

    (11) ну это как самое простое решение просто, взять и скопом сделать. А потом предупредить строго настрого всех программистов, чтобы в каждую форму вставляли пару строк 🙂

    Reply
  14. ROM_1C

    (11) ну это дело принципа..

    (10) возьми редактировать, там есть картинки — там и добавляеш…

    Reply
  15. itmind

    Добавил возможность установки ограничений по группам пользователей. Исправил несколько багов в обработке

    Reply
  16. Asdam

    В подписках очепятки или так задумано?:

    ДоступП(р)ометкаУдаления

    ДоступСправочникП(р)ометкаУдаления

    Reply
  17. sound

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

    Думаю любой здавомыслящий чел вряд ли станет ставить на живую базу такие штуки.

    А то когда выскакивает на чистой базе:

    Пользователь = <<?>>глЗначениеПеременной(«глТекущийПользователь»);

    сразу всякое желание юзать ЭТО пропадает.

    Я понимаю, это быстро лечится, но вот оно мне надо?

    Или дт-шник чтоли выложи с примером

    Reply
  18. anig99

    (17) это духи стырых версий типовых конфигураций

    Reply
  19. AHgpuXa

    Назначение прав по пользователям/должностям

    http://infostart.ru/projects/4527/

    Reply
  20. sound

    (19) Да видел я и твои деяния, но по подпискам мне кажется более логичным, хоть у них и маловато событий.

    В общем, что могу сказать: что одно что другое что третье — сплошное «можно делать так», ну то есть ни одной полнофункциональной версии. Идеи то хорошие, только бы до ума довести..

    Reply
  21. AHgpuXa

    (20) Согласен. Если внимательней присмотреться, то можно увидеть что все что можно было прицепить к подпискам реализовано подписками 🙂

    Мой вариант взят с рабочей конфигурации, но так она далека от типовой, никак руки не дойдут допилить до какой нибудь полнофункциональной версии.

    Reply
  22. sound

    (21) Как руки дойдут, отпишись 🙂

    Reply
  23. mr zafod

    решение по подпискам на открытие формы найдено не так давно — это ВК, генерирующая события при открытии дочернего окна 1С, она передает заголовок окна числом или hwnd — процедуа ЕДИНСТВЕННОГО внесенного в конфу доп.модуля получает по заголовку окно и собственно форму, затем через DOMDocument определяется основной реквизит формы и все остальные.

    Результат — вы получаете форму объекта (либо любую другую) перед открытием (по сут пользователю можно запретить открыть даже калькулятор), получаете основной реквизит формы, а он может быть СправочникСписок или же ДокументОбъект, ну дальше дело техники — прикрутить сюда какой нибудь справочник с правами пользователей.

    А вообще до полноценной 8.2 с ее суперкомандным интерфейсом уже недалеко, поэтому я думаю скоро это все станет не актуально.

    Reply
  24. sound

    (23) и что же это за ВК если не секрет

    Reply
  25. mr zafod

    мы заказывали ее в НИИ Автоматизации у программеров на шарпе при автоматизации одного холдинга. А вообще нечто подобное (в зачатке) я встречал здесь на ИС.

    А как, мне интересно при выводе в отчет для пользователя фильтруются контрагенты?

    Reply
  26. Bambrlog

    1с 8.1 УТ 10.3.7.8

    ошибка

    {Обработка.РедактированиеДоступаКОбъектам.Форма.Форма(28)}: Метод объекта не обнаружен (ГруппыПользователя)

    Запрос.УстановитьПараметр(«ГруппыПользователя»,ДоступКОбъектам.ГруппыПользователя(ВыбранныйПользователь));

    Reply
  27. iones

    P.S.S. Ограничение «Просмотр» не реализованно еще.

    Так как еще событие перед открытием или открытие отсутствует в 1С, предлагаю вот эту обработку парсинг модулей: http://infostart.ru/public/64952/?sphrase_id=2227

    Можно по выбору вида формы подставить однотипно процедуру, которая будет проверять открытие формы. Я уже реализовавыл такое.

    Один минус, жесткое вмешательство в конфигурацию… вынести отдельно пока никак.

    Reply
  28. iones

    Имеется решение открытия большей части форм элементов, это вмешательство в одну процедуру:

    Общий модуль: МеханизмНумерацииОбъектов

    Процедура: УстановитьДоступностьПоляВводаНомера

    При открытии почти всех типовых документов и справочников, ссылается на эту процедуру, с передачей параметра «ФормаОбъекта».

    Так что пока-что самое удачное решение выявления открытия элемента базы.

    Reply

Leave a Comment

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