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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *