RegsvrEx




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *