Автоматическая выгрузка заказов с Joomla (Virtuemart) в 1С УТ 10.3




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2025-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='\

51 Comments

  1. Bober777

    Честно вот только в одном могу поругать, нафига в картинки поставил заставку с пустой формой обработки — ведь смысловой нагрузки, то в этой картинке ноль! А так молодца. 🙂

    Reply
  2. User_E

    (1) Bober777, чтобы опубликовать модератор обязал хоть что-нибудь положить в виде скрина.

    Reply
  3. Bober777

    Ну пример XML-ника надо добавить, тогда тебе же плюсики нужны, а народ на что ведется? Правильно на рекламу. Она как еще говорят двигатель торговли.

    Reply
  4. User_E

    Добавил пример xml

    Reply
  5. WKBAPKA

    а я вот не понял… joomla бесплатный CMS. используется для разработки сайтов… структура сайта во многом зависит от шаблона который натянул, да и от самой структуры сайта… в чем прикол?

    Reply
  6. WKBAPKA

    минус поставил за то, что я не понимаю назначение разработки… какие заказы? в чем смысл php файла? как он подключается к MySQL, где задавать параметры подключения, как он определяет структуру таблиц и т.п. и т.п.

    че тут коментаторы коментируют, за шо плюсы ставят?

    Reply
  7. WKBAPKA

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

    Reply
  8. WKBAPKA

    а, виртуал март… тяжелый магазин… сходу в нем не разобрался

    Reply
  9. User_E

    (8) WKBAPKA, Спасибо за честность. Если какие-то проблемки или что-то не совсем понятно пишите постараюсь ответить.

    Reply
  10. WKBAPKA
    User_E пишет:

    (8) WKBAPKA, Спасибо за честность. Если какие-то проблемки или что-то не совсем понятно пишите постараюсь ответить.

    та напостил я фигни… в заголовке лучше было акцентировать внимание на то что это VirtualMart… я пасатрел, джумла… думаю, как…

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

    Reply
  11. pashamix

    На форуме джумлы была подобная разработка, но там идёт обмен в двух направления, из УТ выгружаются товары с ценами, а с сайта загружаются заказы. Правда сейчас не знаю в каком она состоянии, доделали ли, но разработка полезная, однозначно!

    Reply
  12. User_E

    (11) pashamix, у меня задачка была что номенклатура, цены и скидки задаются на сайте. Поэтому пришлось писать свое.

    Reply
  13. konfed

    хорошо бы было увидеть в описании и ссылочки на другие работы подобной направленности о чем автор и упомянул в начале своей статьи.

    интересным моментом стало использование конструкции:

    соединение = новый httpсоединение(«***********.ru»);

    соединение.Получить(«export.php»,каталогвременныхфайлов()+»temp.html»);

    для запуска на выполнение php скрипта на web-сервере .

    Reply
  14. opx

    Может так оно и правильно, но мне кажется, что подключиться к mySQL из 1С и послать несколько запросов было бы куда вернее. А так получается связка такая: 1С — HTTP — PHP — mySQL — XML, а потом еще 1С — FTP.

    В моем варианте это просто 1С — mySQL

    И самое главное забыл: Так конечно ты молодцом. Интеграция — наше фсе.

    Reply
  15. boygena

    Автор молодец… Хорошая штука

    Reply
  16. cool.vlad4

    (14) это если доступ к mysql есть. через mysql и быстрее будет. но правильные админы не дают доступ к mysql … иногда лишь через ssh.

    Reply
  17. cool.vlad4

    есть еще связки 1С-http-mysql и 1С-webservice-xml (как в prestashop, в последних версиях), но самое простое и быстрое(в смысле разработки) это так, как сделал автор.

    Reply
  18. pashamix
    konfed пишет:

    хорошо бы было увидеть в описании и ссылочки на другие работы подобной направленности о чем автор и упомянул в начале своей статьи.

    Вот посмотрите, может пригодится. Ссылка

    Я следил за проектом с самого начала. Сейчас вроде работает в двух направлениях и вроде стабильно, не проверял последнюю версию.

    Reply
  19. pashamix

    + (18) Кстати вот ссылка на этом сайте на пример с которого всё и стартовало http://infostart.ru/community/groups/622/

    Reply
  20. ZLENKO

    Раз уж речь зашла о Виртуе… По поводу того что Виртуймарт «тяжелый» — вот интернет магазин http://ibaby.com.ua/ с более чем 3500 страниц.

    Работает вполне приемлемо по скорости. Причем надо отметить, что кеширование отключено. Просто не стоит использовать в Виртуймарте некоторые его модули, которые неоптимально написаны и реально создают высокую нагрузку на сервер. Это, например, модуль случайных товаров, дерево категорий. Ну и хостинг надо выбирать нормальный не за 2$ в месяц, а за 7-10$ оптимизированный для CMS типа Joomla.

    Если говорить о движках ИМ — уже более полугода наблюдаю за проектом http://www.hikashop.com/, но все как то не хватает времени его полностью освоить и интеграцию с 1С сделать. Рекомендую обратить на него внимание. Очень качественно написанный код и обширный функционал, а главное весьма активная команда разработки — все (ну или почти все) пожелания реализуются разработчиками.

    По поводу обмена с ИМ — мое мнение, что более оптимального варианта чем прямой доступ через ODBC к базе на MySQL не придумаеш. Можно строить сколь угодно изощренную логику обмена и весь обмен в виде обработки на 1С. По скорости ODBC — наверное не самый быстрый вариант, но при правильном подходе много обменивать и не нужно (только изменения). Недостаток — надо открывать доступ для определенного IP к MySQL.

    Reply
  21. timbax

    А с какой версией Joomla и Virtuemart работает?

    Reply
  22. ZLENKO

    (21) Joomla 1.5, Virtuemart точно не помню релиз, кажется 1.6

    Направление Virtuemart 2.0 тупиковое — разработчики Виртуя не успевают за разработчиками Joomla 1.6/1.7

    Joomla 1.7 мне очень понравилась. Порадовался что при выборе CMS не остановился на Drupal, а выбрал Joomla.

    Поэтому «на будущее» выбрал HikaShop. Там есть и бесплатная версия с ограниченным функционалом и за 100 евро бизнес версия с полным функционалом.

    Однако «по факту» и Виртуй в целом получается не бесплатный — практически все качественные дополнения к нему от сторонних разработчиков платные.

    Сорри за в некотором роде офтопик.

    Reply
  23. User_E

    (14) opx, Конечно согласен что напрямую запросы гораздо проще…. но когда сайт на хостинге и закрыто все кроме http://ftp... пришлось извращаться…

    (21) timbax, joomla 1.5.15 virtuemart 1.1.9

    (13) konfed, обратную загрузку на том же принципе (складсой остаток) выложу на днях

    Reply
  24. ZLENKO

    (23) «когда сайт на хостинге и закрыто все кроме ftp»

    Ну понятное дело что на хостинге сайт, а как же иначе.

    Кто (или что) мешает в админ панели хостинга открыть доступ к MySQL ?

    Reply
  25. ZLENKO

    (14) «правильные админы не дают доступ к mysql»

    Доступ к MySQL открывается только для заданного списка IP адресов. Угроза безопасности при этом ничтожна. FTP взломать брутфорсом гораздо проще.

    Другое дело что может нет доступа к админпанели хостинга… Но что это за хостинг такой несерьезный без админпанели.

    Reply
  26. cool.vlad4

    (25) при чем здесь ip? существуют хостеры, которые просто и тупо закрывают доступ по портам — есть только http, причем здесь админпанелька?

    Доступ к MySQL открывается только для заданного списка IP адресов.

    это вы за всех хостеров отвечаете?

    Угроза безопасности при этом ничтожна. FTP взломать брутфорсом

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

    Reply
  27. cool.vlad4

    (24) Зуб даете, что у всех хостеров есть такая возможность? — «Кто (или что) мешает в админ панели хостинга открыть доступ к MySQL ?»

    Reply
  28. opx

    (23)А я позвонил хостинг-провайдеру и сказал, что на другой хостинг пойду — у которых есть такая возможность и они мне сразу ее дали. А так бы 100% ушел.

    Reply
  29. opx

    (25)Админ-панель? Не очень хорошо знаком с ними, но если порт закроют к mySQL — тут уж никакая админ-панель не поможет. Инфа 100% 🙂

    Reply
  30. cool.vlad4

    (28) Ну, вы молодец, но здесь решение технической задачи с заданными условиями — зачем как Z-z-z, расширять условия, таким способом, который гарантированно результата может не дать и не зависит от технических условий задачи?

    Reply
  31. ZLENKO

    (27) При чем тут все в мире хостеры ? 🙂 Просто я выбираю хостера по множеству критериев. Возможность доступа к MySQL — это один из критериев.

    В эпоху рыночной экономики потребитель голосует своим кошельком. Ограничение какого то определенного хостера — это не повод для построения архитектуры решения.

    Я не собираюсь Вам ничего «втирать». Просто высказал свое мнение касательно Вашего поста. И «зубы» мои попрошу оставить в покое 🙂

    Reply
  32. ZLENKO

    Я ни в коей мере не оспариваю примененное автором решение. Кому что больше нравится — выбирать архитектуру решения в зависимости от хостера или выбирать хостера в зависимости от архитектуры решения. Лично мне больше нравится более простая архитектура. Вот т все что я хотел сказать.

    Reply
  33. Kristi74

    Хорошо бы доделать и сделать возможность выбора способа соединения, напрямую к базе проще соединяться.

    Reply
  34. WKBAPKA

    а в смысле нету доступа к MySQL?

    если нету доступа к скулю, нету магазина… есть доступ, есть магазин… шо вы тут за шкандаль развернули?

    Reply
  35. WKBAPKA

    насколько я понимаю, если я дам ссылку по http на файл php то от туда смогу сделать запрос к MySQL

    Reply
  36. GoraChitich

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

    Обработка очень помогла.

    А каким образом можно загрузить номенклатуру с характеристиками?

    Reply
  37. User_E
    GoraChitich пишет:

    А каким образом можно загрузить номенклатуру с характеристиками?

    я писал выше что на днях постараюсь выложить обратный обмен.

    Reply
  38. cool.vlad4

    (34) порты закрыты и все, вот что это значит, открыт только 80 http у внешнего сервака, который является клиентов mysql, а внутри у хостера находится mysql .

    (35) да, можно и называется http туннелинг, я это выше указал. Для тех, кто хочет больше http://habrahabr.ru/blogs/sysadm/70381/

    Reply
  39. AlexO

    (14) а ваши обработки по php можно посмотреть для примера?

    Reply
  40. AlexO

    (17) cool.vlad4, ссылки бы не помешали ))

    Reply
  41. AlexO

    User_E, так как у вас доступ к MySQL — через php или напрямую через админа?

    Reply
  42. opx

    (39)В принципе можно, но мои обработки не по php, о по mySQL. На что именно вы хотите посмотреть?

    Reply
  43. User_E

    (41) AlexO, через php… я выложил 2 файла…

    Reply
  44. ruslanmusa

    ссылочки точно не помешали бы

    Reply
  45. AlexO

    (42) сам пример передачи данных 1с-mySQL

    Вот есть вариант 1С-php-mySQL

    интересно взглянуть, как реализовано напрямую, тем более — говорите, что одной обработкой — сразу в mySQL ))

    Reply
  46. Muhin555

    В общем-то стандартное решение выгрузки…. Но все же есть «НО».

    Никто не смотрел на сервере как вызов типа «Соединение = Новый FTPСоединение(«»,21,»»,»»,,ложь);» подвешивает его хоть при активном, хоть при пассивном соединении? Такая выгрузка приемлема когда не много заказов падает с сайта (100-200 в день) и период «опроса» 1раз >= 20мин. При загрузке 200-300 заказов/в час таким способом, сервера уходят в «максимальную загрузку» и вот тогда начинаются тормоза на самом сайте! Обработать и создать кучу заказов из «килотонных» XML от 1С тоже требует затрат ресурсов….

    При этом возникает еще одна задача: передать на сайт информацию «сформирован или нет» заказ в 1С по каждой позиции…. соответственно либо создаем новый файл XML, либо редактируем этот…. А потом пусть сервер переваривает ответный XML.

    Reply
  47. zbruy

    (20) Z-z-z, А поделитесь ссылкой на интеграцию hikashop с 1С, а то что-то не нашел (сорри за офтоп)

    Reply
  48. ZLENKO

    (48) Я пока что не делал интеграцию hikashop с 1С 🙁

    Не приоритетное направление сейчас для меня.

    Reply
  49. zbruy

    (49) розница.net, да, у hikashop пока с этим туго как я погляжу(даже в направлении 1С-HS, я уже молчу о HS-1C). Видимо придется и дальше юзать VM)

    Reply
  50. ZLENKO

    (50) Написал экспорт из 1С в базу HikaShop. Прямой экспорт в БД MySQL. Вот результат http://ibaby.com.ua/shop

    Поломал голову в плане оптимизации количества запросов, т.к. оно напрямую связано с временем экспорта.

    Отслеживаю изменения в 1С при помощи плана обмена и храню в 1С в регистре соответствие HikaShop ID и объектов 1С. Это позволяет понимать надо ли добавлять объект в БД или только обновить. Цены тоже сначала сравниваю, потом обновляю отличающиеся. Вобщем достаточно эффективно получилось. Еще осталось разобраться с экспортом дополнительных полей, которые будут использоваться в фильтре.

    Reply
  51. staspdb

    Обработка я так понял работает в одну сторону с сайта в 1С заказы , а чем грузите из 1С номенклатуру и картинки

    Reply

Leave a Comment

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