Универсальная подсистема «Дополнительные права для документов» v 1.1




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

29 Comments

  1. venger

    (0) Результат, так сказать, ознакомления с перехватчиком в 1С++ и Дерево+Таблица в FormEx:-))) Все простенько, по минимуму…

    Reply
  2. larisab

    При закрытии: Прекращена работа 1c:v7 starter program

    Имя события проблемы: APPCRASH

    Имя приложения: 1cv7s.exe

    Версия приложения: 7.70.0.25

    Штамп времени приложения: 41c01f3a

    Имя модуля с ошибкой: ntdll.dll

    Из-за версии 25 или у всех так?

    Reply
  3. larisab

    А так, классно!

    Reply
  4. venger

    (2) У меня 23-й релиз, проблем не было ни на 98-й винде, ни на XP, ни на Win Server 2003…. Файловый вариант базы… Версии dll’ек, что у меня были загружены 1С++ v: 2.5.0.5 Nightly build 2007-11-12, FormEx v: 2.0.5.82 beta…

    Reply
  5. larisab

    Виста, 1С++ v:3.0.1.23, FormEx v: 2.0.5.92 лежат в BINe, 77 файловый.

    Nightly build 2007-11-12 — это что?

    Reply
  6. larisab

    ntdll.dll? я его не нашла, где взять и куда положить?

    Reply
  7. larisab

    ntdll.dll в Висте нет 🙁

    Reply
  8. Арчибальд

    (4) А почему релиз 23?

    (7) Виста маст дай ;))

    Reply
  9. venger

    (5) > Nightly build 2007-11-12 — это что?

    Видимо дата ночной сборки… Но понял — дело в Висте;)

    Reply
  10. venger

    (8) > А почему релиз 23?

    Так уж получилось;) Я ожидал скорее, откуда 98-е форточки;) Да, есть и машина с 98-й под боком;)

    Reply
  11. Арчибальд

    (10) Ну, 98 все надежнее Линолеума. На старых машинешках только и держать…

    А вот 23 — это все же головняк. С таблицами.

    Reply
  12. 1Снег

    (1) Это так 1С++ некорректно выгружается на Висте/Windows 7

    Reply
  13. venger

    (1),(12) А что если в Висте 1С’ку 7.7 запустить в режиме совместимости с XP? Свойства ярлыка запуска проги 1С, вкладка совместимость…

    Reply
  14. larisab

    (13) Неа, все равно также.

    Reply
  15. Ёпрст

    Еще не смотрел.. Но как-то не стыкуется описание:

    >>>Использование класса «Перехватчик»

    >>>добавить парупару строк во всех модулях документов в процедуре «ПриОткрытии»

    Зафига делать второе, при наличии первого???

    Reply
  16. venger
    Reply
  17. Ёпрст

    (16) Конечно есть!

    Перехватчик был специально создан, чтоб вообще не нужно было править код во всех формах…!

    Перехватчик сам перехватывает ВСЕ предопределенные события формы, в том числе формекса.

    ЗЫ: Смотри реализацию у меня в профиле, в Undo или в Редактор формы..

    Там всё есть …

    Reply
  18. venger

    (17) Сенкс, гляну на днях. Надо бы еще и на прямые запросы (из 1С++) переписать, чтоб быстрее летало….

    Reply
  19. jorjy

    larisab

    Используйте vkloader — внешняя компонента для 1С-Предприятия 7.7, которая может загружаться без ее регистрации в реестре.

    Reply
  20. venger

    (0) Обновил, в версии 1.1, дописал класс 1С++ для перехвата событий так, чтобы внедрение подсистемы в другую конфу ограничивалось только объединением md’шки и добавлением нескольких строк в глобальный модуль, по совету Ёпрст’а.

    Reply
  21. Altair777

    интересно…. 🙂

    Reply
  22. artbear

    (20) Ага, я Перехватчик в 1С++ именно для этого и сделал, чтобы минимизировать изменение конфы и упростить добавление универсальных механизмов.

    Рад, что у тебя получилось целая система контроля прав.

    Как автор, Рекомендую юзать последнюю версию 1С++ 3.Х для исключения различных глюков в реализации Перехватчика и исключения неожиданных тонких эффектов

    ЗЫ Кстати, одна из задач, ради которой мной проектировался Перехватчик — задача контроля доступа.

    Но я так до ее решения и не дошел 🙂

    Reply
  23. artbear

    (22+) Ну и соответственно, ФормЕкс также желателен последний, т.к. в последних версиях ФормЕкс мы с Алексеем фиксили многие баги, в т.ч. и баги взаимодействия 1С++ и ФормЕкс.

    Говорю уже как разработчик и 1С++, и ФормЕкс 🙂

    Reply
  24. venger

    (21),(22),(23) Дальнейшее развитие этой подсистемы идет тут:

    Подсистема «Фабрика событий»

    http://infostart.ru/public/71084/

    Reply
  25. gucci76

    В обработке КлассПерехватСобытийРеализация есть

    Функция Событие_ПриЗаписи() Экспорт

    При записи документа она должна срабатывать.

    Она не срабатывает. Почему?

    Reply
  26. venger

    (0) Поправил вызов оригинальных событий…

    Reply
  27. SPonomareff

    Доброго времени суток. Давно скачивал эту разработку. Все отлично! Спасибо. Единственное что у меня не работает- это не показывается список пользователей кому разрешено. То есть с самого начала показывается, а потом при повторном просмотре прав на документ список пропадает. Но это мелочи жизни.

    Reply
  28. PochekutovOleg

    Можно решить и штатными способами

    Reply
  29. fixin

    как то не алле.

    Каждому пользователю прописывать права на каждый документ?

    Это долго и не модно. Где регистры правил?

    Воздержусь от плюса.

    Reply

Leave a Comment

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