TurboMD




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

    А вроде же как 1.0.1.2 — последняя версия.

    Reply
  2. JohnyDeath

    Ну и конечно же это словами не передать какая приятная штука.

    Вот, например, сейчас сижу, ваяю форму нового документа и всякие дейтва по нажатию в нём кнопок. Повесил на хоткей «ctrl+alt+s» выгрузку модуля в текстовик и проблем не знаю!(кстати неплохо было бы всем и скрипт такой поиметь. Выложи пжлст, на itland лежал вместе с dll) Поправил пару строк, нажал магические клавиши и не перезапуская, не ожидая сохранения md,… ну, в общем, сразу в предприятии открываю заново этот док и вижу свои изменения!!! Ну разьве это не КРУТО?!!!

    А сколько раз были звонки типа «Пусть там-то считается автоматом» или «выставлялось сразу…» и никого не выкидываешь из базы! Исправил, выгрузил и УСЁ!

    Reply
  3. orefkov

    В 1.0.1.2 были непонятные глюки. С турбобл доразбираюсь, подрихтую турбомд

    Reply
  4. jbond

    А что исходные тексты безвозвратно утеряны?

    Reply
  5. orefkov

    Нет

    Reply
  6. avega

    а печатную форму документа можно ли каким ни будь способом так же выгружать и править? да и еще а где бы подробный help на openconf скачать? а вобще конешно ПРОСТО ОТЛИЧНАЯ ШТУКА этот turbomd +1 автору!

    Reply
  7. _Vitalik_

    Большое СПАСИБО!!! Очень мне помогло…

    Reply
  8. Шёпот теней

    Ну круто!!!

    Reply
  9. infossa

    Да, вещица очень нужная и удобная, особенно для больших баз.

    Работает стабильно.

    (5)

    А по рулению правами на лету есть подвижки какие-нибудь?

    Reply
  10. неадекват

    +

    Reply
  11. leontiy

    извиняюсь за флуд, но всё же может уважаемый orefkov в курсе где можно взять OpenConf, т.к. сайт этой мегаполезной тулзы не работает …

    На счет TurboMD полностью согласен с (9), +

    Reply
  12. leontiy

    виноват, вопрос о openconf снят, как всегда поиск рулит )

    Reply
  13. alexsandrius

    Есть вопрос, с 1С работаем через терминал (цитрикс) и на одних серверах загружается, на других выдает «отсутствует CLSID». Кто знает в чем причина?

    Reply
  14. aleksey_korol

    Плюс!

    Вопрос: Александр, а сложно ли сделать, чтобы форма загружалась не из одного-единственного файла, а из нескольких, в зависимости от определенного условия? Я имею в виду форму документа: для разных значений одного реквизита показывать разные формы.

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

    Reply
  15. azar323

    (6) В модуле можно добавить поиск внешней печатной формы (файла с заданным именем), если найден-используем, нет-берём встроенную в форму таблицу. А печатные формы (mxl) складывать в отдельную папочку, как в типовых: ExtFormsPrnForms

    Reply
  16. coolo

    Для того чтобы динамически обновлять во время нахождения коиентов на клиентах должна быть подгружена дллка турбомд? А опенконф должен стоять на клиентах платформы или диначмическое обновление реализуется подгрузкой только этой дллки?

    Reply
  17. orefkov

    (16)

    Для работы достаточно только turbomd.dll, загруженной на клиенте.

    Опенконф используется только для упрощения работы программиста с выгрузкой модулей и правки turbomd.prm, так-то все можно и ручками сделать.

    Reply
  18. coolo

    Спасибо, Александр! буду пробывать сейчас =)

    Reply
  19. Necytij

    (13) Alexsandrius, На тех серверах, где не грузиться, скорей всего не зарегистрирована библиотека — надо было запустить 1С на них с правами локального администратора системы. Поиск рулит )

    Reply
  20. yuyu1

    Господи, наконец-то отпала необходимость просить МарьИванну выйти из программы и проверять, что она действительно вышла!

    Reply
  21. tdr1225

    2 orefkov

    Не совсем понятно про совместимость с 1С++.

    Храню класс как обработку внутри МД. Меняю обработку и выгружаю с помощью TurboMD_romix.vbs Однако в «предприятии» изменений не видно.

    (В ГМ последовательность загрузки такая: 1C++, FormEx, TurboMD, …)

    Reply
  22. orefkov

    Насчет классов 1С++ не уверен, не проверял. Так-то ВК для работы с формами.

    Reply
  23. tdr1225

    (22) спасибо

    Reply
  24. serega3914

    Автор молодец

    Reply
  25. an_2

    Автор не молодец.

    Автору памятник надо поставить и денег собрать на кругосветное путешествие.

    А позвездеть мы все молодцы и я среди молодцов.

    Я недавно заглянул в раздел пожертвований на 1Cpp — охренел. Там не просто НЕТ пожертвований. Там есть только одни насмешки.

    Понял я что щедрых людей НЕТ (ну может почти). Все готовы чего-нибудь взять. И никто не готов хоть чем-то за взятое поделиться. Печально.

    Reply
  26. Поручик

    (25) Это всегда так. Стоит заговорить за деньги, тут же в ужасе шарахаются.

    Reply
  27. eshtrey

    полезная вещь, постоянно использую

    Reply
  28. orefkov

    По поступившей недавно просьбе выложил исходники на https://snegopat.ru/downloads/turbomd.zip

    Reply

Leave a Comment

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