Сказ о том, как мы мобильное приложение писали. Часть 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='\

50 Comments

  1. jobkostya1c8

    Интересно.

    Reply
  2. DitriX

    Только вот прикол в том, что этот заголово таки можно скрыть 🙂 И сделать запрет поворта экрана только для приожения 1С и много чего еще 🙂

    А так — очень интересно вышло. Жду продолжений.

    Reply
  3. genayo

    (2) Тогда расскажите как скрыть заголовок, эта проблема достаточно многих волнует…

    Reply
  4. flyer

    Добейтесь пожалуйста от 1с чтобы с этим заголовком что нибудь сделали. низкий поклон будет Вам!

    Reply
  5. DitriX

    (3) Та очень просто, надо всего лишь добавить один тег в андроид манифест в момент компиляции.

    Точно не подскажу, лень сейчас ковырять курсы, но тег отвечает за размеры приложения в области экрана, там же можно сделать, что бы приложение было вообще на весь экран, т.е. даже без верхней строки состояния андроида (как при запуске) или же просто убрать верхний дублирующий заголовок.

    Та и в свете выхода 8.3.6 — не имеет смысла даже поднимать эти вопросы.

    Но если прям очень очень надо, то могу конечно и поковырять это дело и вспомнить.

    Reply
  6. DitriX

    (3) о, вроде вспомнил по закладкам в браузере 🙂

    android:theme=»@android:style/Theme.NoTitleBar»

    Вот это вам и надо.

    Только вставить это надо в область:

    activity

    android:name=»com.e1c.mobile.FormImpl»

    Что бы применялось оно к формам 1С.

    Вообще странно, что 1С не хотят прописать одну строчку в манифест. Но с другой стороны — и самим добавить ее не сложно 🙂 А там еще куча плюшек всяких может быть 🙂

    Reply
  7. orehova123

    Интересная статья. Только начинаю заниматься мобильной платформой, пишите еще, буду ждать

    Reply
  8. script

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

    Reply
  9. CheBurator

    Попробуйте в заголовок не пробел впихнуть, а неразрывный пробел — символ с кодом 160 (0160)

    Reply
  10. DoctorRoza

    Следующее Ваше приложение будет называться — Привоз! 🙂

    Reply
  11. rayastar

    (8) script, полностью согласен. мобильная платформа это как битрикс для 1с, в том смысле, что продукт негибкий

    Reply
  12. AllexSoft

    интересно, а как убрать заголовок то в в десктопной версии ?) вот задумался.. там манифеста как на андроиде нет ))

    Reply
  13. efin

    (6) DitriX, Подскажите, пожалуйста, где найти файл манифеста, который нужно править. Я знаю что это и зачем, но не могу найти его, чтобы изменить в 1С Моб приложение. что может быть если манифест подправил, собрал apk (в отладчике проверил что сборка идет с нужным манифестом), однако в приложении ничего не изменилось?

    Reply
  14. DitriX

    (13) а вы манифест где правили?

    Reply
  15. DitriX

    (8) а вы попробуйте для начала 🙂

    По моему опыту — я три месяца потратил на обучание джаве, что бы написать хоть что-то, за эти 3 месяца мне не платили, скорость доработки хотелок — раз в 10 больше по времени, тем более что почти все хотят «как в 1С», так что — нет, не легче.

    Reply
  16. efin

    (14) DitriX, Я поправил манифест в архиве с мобильной платформой, запаковал обратно как было и загрузил в сборщик мобильных приложений. Проверил, что сборка идет именно с «моей» версией платформы.

    Reply
  17. Demonic_NEW

    А в какую сторону планируется расширение? Ведь оно же планируется?

    Планируется добавить возможность выгрузки в файл, который можно подцепить, скажем, на ПК — в основную версию базы?

    Или подгрузка в каком-либо виде файла с закупками от поставщика. Через те же облачные диски…

    Reply
  18. DitriX

    (16) ок, щас запилю вам свою версию конфы по сборке, и там увидите.

    Reply
  19. Snitkovski

    Скажите пожалуйста, а у вас на Контейнерах все только русскоговорящие работают?

    Когда я там бывал во времена оны (да-а-авно-о-о дело было…) там было очень много «не наших» среди торговцев…

    Собственно, вопрос про многоязычность приложения — на каких языках сегодня имеется интерфейс у «Контейнера» ?

    Reply
  20. DitriX

    (16) фиг его знает. Я собрал — у меня все вышло. Вот сюда приложу apk — проверите.

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

    Reply
  21. genayo

    (6) Спасибо, будем пробовать…

    Reply
  22. flyer

    а для ios как? мне ведь и там надо. за подсказку спасибо!

    Reply
  23. vadnevzorov

    (9) CheBurator, пробовали, и неразрывный пробел, и символ табуляции, и перенос каретки — эффект тот же самый. Так что решили уже сделать по-простому — обычными пробелами.

    Reply
  24. vadnevzorov

    (10) DoctorRoza, с фирменной единицей измерения — привозный килограмм.))

    Reply
  25. vadnevzorov

    (17) Demonic_NEW, Расширение планируется в разные стороны. Если вы спрашиваете конкретно про обмены — то он планируется через универсальный формат, с помощью которого можно будет обмениваться данными как с типовыми конфигурациями, так и с самописными.

    Reply
  26. vadnevzorov

    (19) Snitkovski, планируется перевод на английский + основные языки обитателей ареала 7км, в число которых входит молдавский, но не входит румынский. Однако мы можем пересмотреть наше решение при определенном уровне лоббирования 😉

    Reply
  27. vadnevzorov

    (22) flyer, ну вот для iOS пока не нашли способа. Она игнорирует метод, который меняет заголовок — но так как 1С признала это ошибкой, то будем надеяться, что в ближайших версиях поправят.

    Reply
  28. efin

    (20) DitriX, Спасибо, все заработало, в т.ч. запрет смены ориентации экрана в приложении.

    Reply
  29. DitriX

    (28) ну вот и отлично. Только вы хоть уточните что вы там сделали, для наследия, так сказать 🙂

    Reply
  30. Snitkovski

    (26)

    «в число которых входит молдавский, но не входит румынский»

    скажите пожалуйста, а как вы их различаете? 😎

    дело в том, что не все молдаване с румынами различают, а вы знаете какой-то секрет? 8-)))

    а если серьезно — готовы не только полоббировать, но и поспособствовать! — обращайтесь!

    и ждем с нетерпением следующих постов! 😉

    Reply
  31. pro1c@inbox.ru

    (2) DitriX,

    Огромная ошибка повторять десктопный интерфейс на мобильной платформе!

    Вся тонкость «взлета» мобильного приложения, как раз и состоит в том, чтобы сделать так, чтобы удобно было

    на смартфонах и планшетах работать. В этом успех! Кто этого не понимает, обречен на неудачу! При любом функционале!

    Для «чувствительных» пользователей, например, iOS — если приложение вываливается из привычного UI, даже смотреть не

    будут!

    Для Android пора уже посмотреть в сторону material design, еще чуть чуть и пользователи андрюши перестанут смотреть

    на такие вот самоделки.

    Набивая шишки и спотыкаясь делюсь лекарством от всего этого:

    — Android —> Java

    — iOS —> Objective-C, Swift

    И только так. Все стальное — потеря времени.

    Reply
  32. AllexSoft

    (31) pro1c@inbox.ru, мне лично как пользователю Android в принципе все равно на дизайн и рюшки, для бизнес-приложений.. главное чтобы оно выполняло свои функции, было продумано и быстро

    Reply
  33. DitriX

    (31) а почему это сообщение адресовано мне?

    А в целом — посмотрим что будет с 8.3.6, так как мы сейчас смотрим на продукт, который начал свое развите, когда еще MD и в проекте не было, а стандарты менялись каждый месяц 🙂

    (32) и то верно, есть ряд задач которые надо решить, а интерфейс, как бы это пахабно не звучало — не столь важен, во всяком случае — интерфейс служебных программ банков — еще то эпик фейл, но им пофиг как то на все это 🙂 Ибо бизнес-есть бизнес.

    Reply
  34. pro1c@inbox.ru

    (33) DitriX,

    речь то не об интерфейсе, а об юзабилити.

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

    Некоторые прекрасно совмещают эти вещи. (Inbox, Evernote)

    http://habrahabr.ru/post/213097/

    Reply
  35. pro1c@inbox.ru

    (32) AllexSoft,

    «…было продумано и быстро…» — это не только логика и функционал.

    Reply
  36. AllexSoft

    (35) pro1c@inbox.ru, ну так и причем тут инструмент которым ты напишешь данный функционал? я не говорю что мобильные приложения в 1С это прям идеал, нет,они еще довольно сырые, но отметать 1С как инструмент разработки мобильных приложений ДЛЯ БИЗНЕСА тоже нельзя

    Reply
  37. pro1c@inbox.ru

    (36) AllexSoft,

    «…отметать 1С как инструмент разработки мобильных приложений ДЛЯ БИЗНЕСА тоже нельзя…»

    так никто и не отметает! естественно, 1С отдает дань моде и предлагает мобильную платформу для ВОЗМОЖНОСТИ реализации!

    я только лишь выразил возражение о том, что методы применяемые в разработке для десктопа НЕ ПРИЕМЛЕМЫ в мобильной разработке!

    в данном приложении я это увидел!

    Reply
  38. pro1c@inbox.ru

    (33) DitriX,

    «А в целом — посмотрим что будет с 8.3.6, так как мы сейчас смотрим на продукт, который начал свое развите, когда еще MD и в проекте не было, а стандарты менялись каждый месяц 🙂 «…

    так вот в том то и дело, что мобильная разработка никогда не «устаканется» и будет всегда в стадии развития и совершенствования (сегодня один смартфон, завтра очки, послезавтра часы и т.д.), поэтому первоисточники (Java, Objective-C) выглядят более выгодным инструментом для разработки, т.к. являясь детищем своих же прородителей несут в себе все необходимые новшества. Чтобы за этим успеть, 1С надо клепать мобильную платформу чаще! Что затратно! Поэтому я и считаю реализацию на 1С под мобилы потерей времени.

    Ну это так, лирическое отступление!

    Reply
  39. DitriX

    (38) ну а думаю, иначе, так как 1с таким макаром подкупает весь рынок потенциальный. Вот я разработал приложение 2 года назад и все круто, а теперь выйдет 8.3.6 — и я обновлюсь, у меня повится новый стильный дизайн, и может еще плюшки, но костяк то есть.

    А обо все остальном — пусть 1с думает.

    А если писать свое, то это значит и самому всегда надо следить за этим и ковырять, обновлять и т.д. А тут то главное — бизнесс логика, а обновление дизайна — не влияет на бизнесс процессы (ну это конечно в идеале, если пересадить с 7.7 на 8.3, то разница будет конечно ощутима).

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

    Видь для перехода с 8.2 на 8.3 — почти ничего не надо было делать, а столько полюшек получил, и все «на шару», никаких доработок.

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

    Reply
  40. pro1c@inbox.ru

    (39) DitriX,

    Не, ну с таким подходом, можно вообще сайт замутить на PHP один на всех или

    доступ по RDP на сервак выдать… пускай пальчиками там лазят, парятся… функционал ведь! логика!

    и работает везде (десктоп, планшеты, смартфоны), где выход в инет имеется! вообще ничего делать не надо!

    бизнес же! ничего личного!

    Reply
  41. DitriX

    (40) Ага, давайте посчитаем лицензии на рдп и 1с, а так же увеличим мощьность серверов на колиество этих пользователей 🙂

    Но ничего страшного, работают и так, на 7.7, не маленькие фирмы, а крупные. И те, которые не могут позволить себе простой, поэтому им таки да, не рюшечки главное 🙂

    Мало того, только так и работали вообще все, так как были доступны только терминалы на винце. И что? Многие вмс просто так и были заточены.

    Reply
  42. AllexSoft

    (40) pro1c@inbox.ru, а если инета нет? у нас например склады здоровые, закрытые как бункер, там с проводным инетом туго, не говоря о мобильном ) вот спасают планшеты с 1С-ками и wifi-сканеры штрихкодов )

    Reply
  43. Danil.Potapov

    ждем исследований версии 8.3.6

    https://users.v8.1c.ru/distribution/version_files?nick=mobile&ver=8.3.6.110

    Reply
  44. poyson

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

    Reply
  45. plastilin

    (31) pro1c@inbox.ru, XAMARIN!!!!

    Reply
  46. plastilin

    до realtime как до небес…..1с в своем репертуаре..втюхать кому нить свои поделки… есть много технологий которые позволяют делать все это быстрее, стабильнее и главное половина из этих технологий open sourse

    Reply
  47. plastilin

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

    Reply
  48. shurubchik

    (20) DitriX, Добрый день. не подскажете — как править манифест мобильного приложения. — я его распаковал с помощью APK tools. но там какая то ерунда. мне бы понять направление хотя бы — можно ли править манифест для платформы мобильной без сборки приложения. Спасибо.

    Reply
  49. DitriX

    (48) так нельзя 🙂 Можно распаковать, но нельзя просто так запаковать, потому что при компиляции — вы должны подписать приложение своим ключем 🙂

    А как распаковать — ищите в инете, даже онлайн сервисы есть, и вот статьи хорошие всякие http://androidp1.ru/iz-chego-sostoit-prilozhenie-android/

    Reply
  50. plastilin

    пора xamarin юзать

    Reply

Leave a Comment

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