Внешняя компонента Addin.MySQLConnection




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

34 Comments

  1. lov-kot

    Очень пригодилась.

    Reply
  2. alex_bob

    А нельзя ли добавить что-то типа истории версий? До этого работал с версией 2.0.1 проблем не было. В чем отличия версии 2.1.2? А так — очень помогает, спасибо. +1

    Reply
  3. Спасибо!

    Reply
  4. shachneff

    для 8.1 версию дождаться реально?

    Reply
  5. mdzen

    Отлично!

    Reply
  6. CardinalDen

    поддерживаю уважаемого shachneff — можно ли ждать для 8.1?

    Reply
  7. trof

    Ждем для 8.1 … очень ждем!!!

    Reply
  8. serguey_again

    забирайте для 8.1

    Reply
  9. iohansson

    проблема с кодировкой при записи в базу mysql, кириллические символы превращаются в «?», в базе стоит кодировка cp1251, даже если в запросе при записи в базу писать CONVERT(‘наим’ USING cp1251), все равно записывается как «?», что делать??

    заранее спасибо…

    Reply
  10. iohansson

    разобрался, простите за флуд…

    Reply
  11. Medvedik

    Подскажите, какова максимальная длина запроса, который будет успешно обработан?

    Reply
  12. diocompany

    Не хочет коннектиться к базе мускула.

    1С уходит в себя и потом пишет ошибку.

    И так, и сяк плясал с бубном. Ни в какую.

    Что-то, с чем-то не совмещается.

    Сервер, логин и пароль все рабочие и т.д.

    Подключался из 1c 7.7

    Reply
  13. Medvedik

    (12) Хостинг позволяет подключение с любого ip? Может нужно прописать в правило доступа к серверу свой ip

    Reply
  14. diocompany

    (13) Medvedik,

    Спасибо за ответ.

    Давайте попробую ответить вот как.

    Через phpmyadmin базой я управляю без проблем.

    Так же через скрипт php подключаюсь к базе, могу сформировать запрос к таблицам, с выводом результатов на экран.

    Предполагаю, что подключение возможно с любого ip. Это моё предположение. Возможно я ошибаюсь.

    Reply
  15. cool.vlad4

    (14) с большой вероятностью — ошибаешься. Хостинг чужой верно? Узнавай у них, но как правило прямой доступ они запрещают.

    Reply
  16. Medvedik

    (14) Вероятнее всего, вы ошибаетесь. Свяжитесь с тех. поддержкой хостера, пусть подскажут, как прописать ваш ip для доступа с него к БД

    Reply
  17. diocompany

    (15) cool.vlad4, (16) Medvedik,

    Да, хостинг чужой!

    Использую бесплатный хостинг от http://radyx.ru/

    Это для отладки, экспериментов и т.д.

    Но скажу по секрету, что использую так же платный хостинг от http://masterhost.ru/

    И туда не могу попасть через ВК.

    В голове рождаются следующие мысли:

    1. Вряд ли захочется бесплатному хостеру каждому встречному-поперечному давать прямой доступ к базе скула.

    2. Пол беды, доступ с работы к БД, ip постоянный. А из дома получится совсем засада, потому как дома выделяется динамическая статика.

    Буду признателен за ваши мысли по этим пунктам!

    Reply
  18. cool.vlad4

    (17) ssh доступ есть?

    Reply
  19. Medvedik

    (17)

    1. Именно

    2. Это сейчас не дорого, можно и домой заказать. Мне не часто нужно обновлять прайс, я руками прописываю текущий ip раз в неделю.

    Reply
  20. diocompany

    (18) cool.vlad4,

    Для тех кто в каске, как я, поясните про ssh доступ.

    Как мне его проверить.

    Могу предложить следующее, если есть время и желание.

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

    (19) Medvedik,

    Всё равно как-то неудобно. 🙂

    Reply
  21. cool.vlad4

    (20)спросить у провайдера, можно поднять туннель ssh(пробросить порт mysql), — как? прочитать в инете

    http://yandex.ru/yandsearch?text=%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF+%D0%BA+mysql+%D1%8­7%D0%B5%D1%80%D0%B5%D0%B7+ssh&lr=213

    Я бы объяснил, подробнее, но время…если это сделать — то хоть по ADO можно цеплятся к базе, и относительно безопасно.

    Reply
  22. cool.vlad4

    (20) сам по себе masterhost поддерживает ssh. Вот их инструкции http://masterhost.ru/support/doc/mysql/

    Reply
  23. cool.vlad4

    Скачайте putty и введите данные, которые вам дал провайдер.

    Reply
  24. diocompany

    (23) cool.vlad4,

    Спасибо!

    Попробую копать дальше! 🙂

    Потом расскажу, чего выкопал. :-)))

    Reply
  25. a_mironov

    Спасибо автору аз проделанную работу! Особенно за исходники

    Reply
  26. igor_kav

    Здравствуйте, подскажите почему не работает запрос:

    INSERT INTO modx_site_content ( type , contentType, pagetitle , longtitle , alias , parent , published , isfolder , richtext , template , searchable , cacheable , hidemenu ) VALUE ( ‘document’ , ‘text/html’ , ‘Крышка на ведро 50 Консенсус’ , ‘Крышка на ведро 50 Консенсус’ , ‘Kryshka_na_vedro_50_Konsensus’ , ‘22528’ , ‘1’ , ‘0’ , ‘1’ , ‘6’ , ‘1’ , ‘1’, ‘1’ );

    SET @lastID := LAST_INSERT_ID();

    INSERT INTO modx_site_tmplvar_contentvalues ( tmplvarid , contentid , value ) VALUE ( ‘4’ , @lastID , ‘assets/images/Catalog/10742.jpg’ );

    INSERT INTO modx_site_tmplvar_contentvalues ( tmplvarid , contentid , value ) VALUE ( ‘5’ , @lastID , ‘assets/images/Catalog/Preview/10742.jpg’ );

    INSERT INTO modx_site_tmplvar_contentvalues ( tmplvarid , contentid , value ) VALUE ( ‘6’ , @lastID , ‘10742’ );

    INSERT INTO modx_site_tmplvar_contentvalues ( tmplvarid , contentid , value ) VALUE ( ‘7’ , @lastID , ‘6,38’ );

    Выдает ошибку:

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘SET @lastID := LAST_INSERT_ID();

    INSERT INTO modx_site_tmplvar_c

    И заметил, что пакетный запрос, вообще не отрабатывает! Как решить проблему?

    Reply
  27. zsw

    (26) igor_kav,

    попробуй

    Select @lastID:=Last_insert_id();

    с пакетным запросом решить не удалось

    только последовательный запуск по одному запросу

    Reply
  28. igor_kav

    (27)

    Спасибо за ответ, сейчас попробую.

    Reply
  29. raym0n

    Скажите, какая скорость работы данного метода?

    Если нужно, например, залить в базу 2000 строк.

    Спасибо!

    Reply
  30. MyTempMail@ua.fm

    Кто то пытался с ней работать в фоновом задании?

    Вылетает при попытке загрузить компоненту: «Ошибка при вызове метода контекста (ЗагрузитьВнешнююКомпоненту)». При интерактивной работе все работает замечательно.

    Reply
  31. serguey_again

    (30)

    Компонента требует полных клиентских прав (так как в ней есть обращение к самой 1с для создания объектов 1с) — а фоновые задания выполняются на стороне сервера — и не имеют клиентского контекста. Эту проблему можно решить запуском 1с по расписанию с передачей ей параметра на запуск внешней обработки — которая уже и использует компоненту

    Reply
  32. dummy

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

    нужно пользователю дать права на «Использовать 1С в качестве OLE Automation сервера». по умолчанию такие права не установлены. и сразу все падения прекратились.

    огромное спасибо serguey_again, автору, за оперативную помощь в решении этой проблемы.

    Reply
  33. semario

    Под управляемые формы работает?

    Reply
  34. user856513

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

    Reply

Leave a Comment

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