Давайте подружим 1С и Android. Часть 1 — постановка задачи и подход к решению




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

31 Comments

  1. Ibrogim

    Я так понял суть вашей статьи в том, что java умеет работать с веб сервисами. и коротко её можно переписать так

    import org.ksoap2.SoapEnvelope;

    import org.ksoap2.serialization.SoapObject;

    import org.ksoap2.serialization.SoapSerializationEnvelope;

    import org.ksoap2.transport.HttpTransportSE;

    ))

    Reply
  2. solarisman

    (1) Ibrogim, Вы поняли неверно. Я думаю, любому технически подкованному специалисту должно быть понятно, что Java умеет работать с веб-сервисами.

    В этой статье не все, что я хотел сказать, я написал в конце —

    Если интересно, продолжим знакомить 1С и Android

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

    А статья не Java-разработчику, а 1Снику.

    Reply
  3. Ibrogim

    (2)

    Ведь с тем как работать с веб-сервисом 1С не все так прозрачно

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

    ksoap2 ничего не известно про 1С )

    Reply
  4. Ibrogim
    Я думаю, любому технически подкованному специалисту должно быть понятно, что Java умеет работать с веб-сервисами.

    Я думаю, любому технически подкованному специалисту должно быть понятно, что 1С умеет работать с веб-сервисами.

    Итого о чём статья? о том, что есть ksoap2 и все умеют работать с вебсервисами (Java ,1С)

    Reply
  5. solarisman
    Итого о чём статья?
    Серия уроков по созданию простейшего приложения на платформе Android для взаимодействия с 1С.

    Просто и доступно хочу людям донести то, на чем сам набил кучу шишек и потратил много времени.

    Reply
  6. mihey

    Если делать такую интеграцию, как по мне, логичнее использовать REST-сервисы

    Reply
  7. solarisman

    (6) mihey, Вполне возможна и такая реализация, тем более 1С развивает поддержку OData. Много зависит от задачи. Конкретно моя была — создать решение под уже существующий веб-сервис и выдумывать работу с REST не пришлось

    Reply
  8. kondrp

    Пишите дальше!

    Не обращая внимание на критику.

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

    Reply
  9. mkostya

    ждем остальные статьи, так как тема актуальна каждый день.

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

    Reply
  10. sarun

    Имхо, лучше пилить post запросы из андроида к 1с, т.к. ksoap не всегда подходит

    Reply
  11. solarisman

    (10) sarun, Уже вроде постарался разъяснить — все зависит от конкретной задачи, я рассматриваю конкретно SOAP. Более того, я буду рад, если кто-то решит задачу посредством REST и мы сможем оценить плюсы и минусы конкретных решений. Передо мной же стояла конкретная задача — написать приложение, работающее с уже существующим веб-сервисом в 1С.

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

    Если хотите понимать, какой протокол вам нужен — вот отличнейшая статья

    А еще есть тут

    SOAP и REST сравнивают не как альтернативы друг другу, а только потому, что есть круг задач, которые решают оба инструмента

    Reply
  12. solarisman

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

    Reply
  13. bashinsky

    Очень актуально продолжайте в томже духе. тоже начал изучать java и работу с веб сервисами из андроида.

    А что в архиве лежит?

    Reply
  14. solarisman

    В архиве лежит «болванка» проекта для AndroidStudio с подключенной библиотекой ksoap2, если кому лень ковыряться.

    Reply
  15. flyer

    буду следить за вашими постами и публикациями. сам раньше начинал создавать аналогичное для андроид и ios но 1с вовремя выпустили моб.платформу.

    Reply
  16. Dementor

    Пост не очень информативный, но навеял приятные воспоминания. В районе 2013 занимался связкой учетной системы 1С с andoid-телефонами водителей. К сожалению, тогда не было еще мобильной платформы, ни http-сервисов, ни Android Studio, ни ksoap2. На самом деле все не так уже и страшно. Во первых, программирование под Android оказалось таким же как и под 1С; во вторых протокол SOAP простой до безобразия и легко реализуется. Сначала сделал передачу примитивных типов, а через годик для пересылки фоток и архивов реализовал передачу бинарных данных. Потом опыт пригодился для реализации обмена по веб-сервисам из 1С7.7, где ничего похожего на ksoap2 не было и не будет.

    Совет автору. У вас же микрозадача и, если у вас в планах нет написания отдельных статей с разбором проблем интеграции с различными версиями Android (о, как же я намучился с одной китайской партией дешевых планшетов на тройке), о реализации пушей из 1С, о борьбе против «злых юзеров» (которые на зло вам и начальству переводят время и отключают GPS и передачу данных), то стоит все описать в одной лаконичной статье. Первая часть просто ни о чем и зря отвлекла внимание.

    Reply
  17. solarisman

    (16) Dementor,

    Первая часть просто ни о чем и зря отвлекла внимание.

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

    Готовлю вторую часть, но местами получается наоборот чересчур тяжелая.

    Reply
  18. siddy

    интерес вызывает. когда ждать продолжение?

    Reply
  19. CyberCerber

    Тема интересна и актуальна, пишите и постите дальше!

    Reply
  20. Ким

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

    Reply
  21. bashinsky

    А можно какой-нибудь пример работы с веб сервисом через ваш класс?

    Reply
  22. pro1c@inbox.ru

    Автор все правильно делает. Сначала «прототип» статьи и если будет интерес, то продолжит, если нет, то забъет на это!

    Я понял так!

    Но парадокс в том, что всем это безумно интересно, но ажиотажа не видно!

    Reply
  23. Ким

    а как надо проявить ажиотаж?

    Reply
  24. pro1c@inbox.ru

    (23) Ким,

    а его не надо проявлять, он либо есть, либо его нет!

    потребность нужна!

    Reply
  25. solarisman

    Часть 2 готова

    Reply
  26. solarisman

    (23) Ким, На самом деле, мне не нужен ажиотаж. Для меня лично эта статья — как средство наверно и самому систематизировать знания, полученные за последний год — начиная от мобильной платформы, расширений ACODE Tools и других подобных вещей и заканчивая нативной разработкой.

    Не менее интересно мнение и сообщества, иначе статей не было бы. И что касается REST и всего остального, что в дальнейшем будет обсуждаться — все это мне интересно.

    На данный момент я могу сказать только одно — имея под рукой нужный набор инструментов, можно создать приложение, готовое к обмену с 1С за время, сопоставимое с разработкой на мобильной платформе 1С. И сотня-другая голов тут гораздо лучше, чем одна.

    То есть для меня самое важное — реакция сообщества в конструктивном плане, а не в плане «Уау! Статья по ондроеду!»

    Reply
  27. WKBAPKA

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

    Статья очень полезная (правда я уже и вторую часть статьи просмотрел).

    Reply
  28. kiros

    Спасибо Автору! Серия статей это именно то что нужно. Надеюсь в скором времени воспользоваться Вашим опытом.

    Reply
  29. gradi

    А почему бы не делать аналогичную задачу используя мобильную платформу 1С?

    Reply
  30. solarisman

    (29) gradi,

    Ну во-первых, цель — рассмотреть работу с веб-сервисами в нативном приложении Android.

    Кучу примеров могу привести, когда нативное приложение «интереснее».

    Reply
  31. WKBAPKA

    (29) gradi, ага, читал статью, как сделать простое приложение на мобильной версии 1С, типа Hello, world. apk файл в 30 МБ 🙂

    + еще с лицензированием есть свои заморочки

    + врядли 1С реализовало полноценный Java 🙂

    Reply

Leave a Comment

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