RegsvrEx




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

26 Comments

  1. alexqc

    Да, еще: то что написано «Платформа: MS Windows XP, MS Windows 2000» не значит что под другими платформами не работает. Работает, но только уже полностью аналогично regsvr32 (ключ /с игнорируется). Для win9x это не имеет значения (там пользователи все равно все могут), а NT4 не предоставляет такой возможности (но у кого счас NT у пользователей стоит?)

    Reply
  2. steban

    +1

    Reply
  3. JohnyDeath

    +1

    Reply
  4. alexqc

    Обновил:

    1. Не всегда корректно отрабатывались пути в кавычках;

    2. Убрал стандартный загрузочный код -> размер уменьшился почти в 2 раза :).

    Reply
  5. alexqc

    И еще одно обновление: позволяет регистрировать файлы .wsc (компоненты на WindowsScript)

    Reply
  6. romix

    +1

    Reply
  7. romix

    Я вот думаю, а почему бы 1С по умолчанию не прописывать свои ВК и чужие COM-DLL в пользовательской ветке реестра… Может патч замутить?

    Reply
  8. alexqc

    Потому что за регистрацию вообще-то должна сама компонента отвечать. Так что патчить скорее компоненту надо.

    А авторы компонент обычно довольствуются тем что для них вижуал-студия нагенерит. А генерит они примерно следующее:

    По-умолчанию регистрация заключается в единичном вызове ResourceRegister() к ресурсу «REGISTRY» компоненты (можете просмотреть например ту же v7plus любым редактором ресурсов — увидите). В ресурсе — скрипт регистрации/разрегистрации, при чем VC его строит только от HKEY_CLASSES_ROOT. И если ResourceRegister() завершилось неудачно (например, прав нет) — соответственно неудачно завершается вся процедура регистрации.

    Если позаботиться об этом заранее, не доверяясь VC — то можно избежать таких проблем.

    Подробнее о регистрации можно посмотреть в MSDN. Если что — задавайте вопросы, подскажу.

    Reply
  9. vasilykushnir

    Хотя такие вещи я не позволяю делать юзерам, но все-равно

    +1

    Reply
  10. artbear

    Полезная вещь.

    Для справки:

    недавно ВК 1С++ научилась регистрироваться при запуске 1С пользователем с урезанными правами.

    А ВК VKLoader, FormEx вообще не требуют регистрации в реестре

    Reply
  11. fez

    А нельзя ли получить исходники этой замечательной утилиты?

    Нужно для ускорения решения вот этой проблемы: http://bugs.etersoft.ru/show_bug.cgi?id=1861 (полноценный запуск опенконфа под вайном).

    Если можно, то fezeev собака gmail точка com

    Спасибо.

    Reply
  12. Abadonna

    (0)>v7plus например прокатит, а 1С++ — нет.

    А вот эта может всё, и не только DLL

    http://infostart.ru/profile/1329/projects/2011/

    Reply
  13. alexqc

    (12) Ну дык эта… Там совсем другая задача

    Reply
  14. Abadonna

    (13) Началось все как раз из-за невозможности сделать regsvr32 😉

    А твою не видал тогда, так что в незнании есть некоторые плюсы :)))

    Reply
  15. tormozit

    Через RegSvr32 библиотека DynamicWrapepper у меня регистрируется, а через RegSvrEx нет. Я что то делаю не так или как сделать, чтобы зарегистрировалось?

    Reply
  16. alexqc

    (15) Я не представляю, что Вы делаете не так. Я даже не представляю, что Вы вообще делаете, где, и что видите. Представляете?

    Reply
  17. tormozit

    (16) ОС Windows 2008 Server standart R2. Выполняю команду командного интерпретатора (x86) «regsvrEx.exe dynamicWrapper.dll». Получаю окно сообщения «Команда DllRegisterServer завершилась неудачно». При этом команда «regsvr32.exe dynamicWrapper.dll» выдает сообщение «Команда DllRegisterServer завершилась успешно»

    Reply
  18. cabat

    Под Win2003 SP2 попытался зарегистрировать DynWrapX.dll — не получилось..

    Запускал так:

    regsvrex /c dynwrapx.dll

    Кому-нибудь удалось с этим разобраться?

    Reply
  19. cabat

    (18) Возможно кому то пригодится: у меня получилось зарегистрировать для текущего пользователя такой командой:

    regsvr32.exe /i dynwrapx.dll

    первоисточник: Серый форум (разработка скриптов) — DynamicWrapperX

    Reply
  20. cool.vlad4

    чего-то это все мне напоминает…

    Reply
  21. cool.vlad4

    😀 щас найду

    Reply
  22. cool.vlad4

    (0) не это ли первоисточник http://www.codeproject.com/KB/winsdk/regsvrex.aspx? Кстати там в комментах, описывается проблема и ее решение в win08… сайт кстати зачотный…для разработчиков одна из ссылок в избранное…

    Reply
  23. cabat

    как я понял, это две разные тулзы, делающие примерно одно и то же:

    http://www.1cpp.ru/forum/YaBB.pl?num=1192533507/9#9

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

    зато мне подсказали, как решить проблему конкретно с dynwrapx.dll, вот и решил суда кинуть, вдруг кому пригодится..

    Reply
  24. cool.vlad4

    (23) Может быть и так, но там хотя бы исходники выложены, которые позволяют что-то подправить, исправить и т.д. А вообще совпадения не так уж редко и бывают, пожалуй…

    Reply
  25. Патриот

    А для седьмой винды эта утилита не работает или у меня просто руки кривые? один и тот же код, аналогичный коду в статье под XP работает, а в семёрке нет.. Буду благодарен, если направите на путь истинный.

    Reply
  26. CaSH_2004

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

    А вот что было дальше: запуск от имени админитратора все решил

    Reply

Leave a Comment

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