Шаблон внешней компоненты на Delphi




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

16 Comments

  1. O-Planet

    Понравилось. А можешь продемонстрировать, как с помощью твоего класса Object1C вызывать методы объектов по их названию?

    Reply
  2. Chieftain

    (1) Что-то не совсем понял, что ты имел ввиду…

    В асю постучись — подскажу

    Reply
  3. Chieftain

    Нууу… Народ, что молчим? Блина, но ведь отрицательные отзывы — это тоже неплохо)))

    Reply
  4. jackevsen

    У меня вопрос на засыпку.В Borland Builder C++ можно написать внешнюю компоненту?

    Reply
  5. Chieftain

    А почему нет?

    Reply
  6. jackevsen

    Просто на сайте 1С написано,что поддерживаются такие среды разработки как Visual Studio,Borland Delphi.Да и в сети ищу шаблон компоненты именно для Borland Builder C++,а найти никак не могу.Есть для всего,но для этой среды разработки нету.Лично я проблем не вижу в этой среде разработки,но мало ли….

    Reply
  7. Chieftain

    Ну вообще-то я с сями не дружу, но вроде там тоже проблем не было

    Reply
  8. artbear

    (4) Можно без проблем, полная аналогия с Дельфи.

    Reply
  9. codeLocker

    А есть ли у кого пример на Delphi для восьмерки?

    Reply
  10. deltaone

    (9) Закомментируй строчку помеченную (!) будет нормально работать вызов функций восьмерки, если не надо функции глобального контекста дергать, то ничего изменять не надо — оно и так работает на восьмой платформе.

    [AddInLib.pas]

    if GlobalContext then

    begin

    obj := OleVariant(p1cv7).AppDispatch;

    (!) // IDispatch(obj)._AddRef;

    end;

    (1) Вызов функций глобального контекста

    function TWaspVK.FN_RUN(var Params: OleVariant): OleVariant;

    var

    arg : TParams;

    begin

    arg := TParams.Create(1);

    arg[1] := Params[2];

    CallFunction(VarToStr(Params[1]), », True, arg, Result);

    end;

    в коде 1с зовется так:

    WASP.RUN(«Сообщить», «afadsfasdf»);

    P.S. Автору зачот !!!! Просто нет других слов …

    Reply
  11. deltaone

    (3) По поводу доработок — на ум приходит только одно — не плодить функции записи/чтения свойств, вместо 2х функций сделать 1-у и упрвлять операцией через case …

    function object.UserModeRW(mode: TMode, …)

    begin

    case mode of

    m_get_value:

    ….

    m_set_value: ;

    ….

    end;

    end;

    и обработку исключений убрать из пользовательских функций установки значений ( перенести в вызов метода объекта установки значения — короче повыше уровнем 😉

    Reply
  12. deltaone

    Хы, и вопрос, совсем забыл 😉

    Как вызвать функции неглобального контекста, которые описаны в общих модулях

    CallFunction(‘SHARED.CleanString’, », True, arg, Result);

    нифига не катит ;(

    Догадываюсь, что надо получить контекст SHARED только как его получить х.з. ;(

    Reply
  13. zll32

    SHARED – Это как раз второй параметр функции, который у тя пустой да еще и строкового типа =)

    Например чтобы вызвать функцию из модуля обработки нужно в 1С так писать

    CallFunction(‘CleanString’, ОбработкаОбъект, True, arg, Result);

    Только функция ‘CleanString’ должна быть Экспортная

    Reply
  14. zll32

    Футы, не истина а ложь конечно

    CallFunction(‘CleanString’, ОбработкаОбъект, FALSE, arg, Result);

    Reply
  15. mshi

    Отличный шаблон! Может он и медленнее в работе, чем стандартный от 1с или romix, но очень красивый и удобный в реализации.

    Спасибо!

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

    Reply
  16. Chieftain

    (15) Удивительно! 10 лет прошло, а еще кто-то пользуется)) Причем нетипично часто, для такого рода публикаций.

    Reply

Leave a Comment

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