Мобильные списки покупок




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

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

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

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

21 Comments

  1. AlX0id

    Я собрал себе простую табличку в мементо — и достаточно )

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

    Reply
  2. kharts

    (1) AlX0id, ради интереса установил. действительно шустрее работает. но вот с точки зрения удобства… на вкус и цвет)

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

    Reply
  3. AlX0id

    (2)

    Не, ну спора нет — 1ску кастомизировать проще.. Но за это так круто приходится расплачиваться производительностью, что я уже яву начал осваивать )

    Может, на планшетах и более мощных телах и ничо будет, но с планшетом немного кто в магазы ходит )

    Reply
  4. pumbaE

    Каким образом может жена набрать список покупок и отправить телефон?

    Где название и марки товаров, ориентировочная цена. Такое впечатление, что вы не женаты и не разу не ходили за покупками по списку и на вопрос «есть такой же халатик, только без перламутровых пуговиц, будете брать?» отвечаете утвердительно, а не «нет у меня по списку халат с перламутровыми пуговицами!».

    Reply
  5. V_V_V

    Пользуюсь Google Keep. Там какие хочешь списки (и не только) можно хранить, да еще и с фотографиями.

    Reply
  6. DrAku1a

    (3) AlX0id, у меня MTC 972 брал за три тыщи в их салоне. У него андройд 4-й и оперативой не обижен. На нем производительность 1С вполне на уровне!

    ЗЫ. Если ява — сложно, то можешь попробовать Delphi XE5 — он умеет компилить под андро.

    Проблема в другом — на мобильном не очень удобно именно набивать тексты… Но в гугл можно попробовать функцию распознавания речи…

    Reply
  7. asved.ru

    Имеет смысл сделать серверную часть и SOAP-синхронизацию. Вот тогда будет красота и энтерпрайз, как у больших дяденек.

    Reply
  8. kharts

    (7) asved.ru, было в планах, хотя на энтерпрайз и не думал претендовать)

    Reply
  9. kharts

    (4) pumbaE, женат) про пуговицы — смеялись с женой от души)

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

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

    Reply
  10. AlX0id

    (6) DrAku1a,

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

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

    ЗЫ. А какие проблемы с набором текста? У меня стоит клавиатура TouchPal — за женой спокойно записываю, а за счет интеллектуального ввода иногда даже быстрее 10-пальцевого ввода получается %)

    Reply
  11. mzelensky

    Мучаюсь с мобильным приложением. Уперся в очень элементарный вопрос, который не могу решить. Мне нужно указать файл (точнее путь к нему). В обычном режиме делается через

    ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие)

    Но в мобильном приложении НЕТ такого. И никак не могу найти аналог. Как все-таки поступить???

    Reply
  12. WhiteShadow

    интересен процесс реализации, но ожидал увидеть связку 1с PC — 1c android. не увидел, посему приложение не очень актуально. Но все равно автору +.

    Reply
  13. Davidmad777

    можете помочь? пожалуйста.

    Сборщик = Новый ЗаписьТекста(РабочийКаталог+»make.bat», КодировкаТекста.OEM);

    выдает ошибку на ету строку можете помочь

    Reply
  14. kharts

    (13) Davidmad777, а какая хоть ошибка?

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

    Reply
  15. Davidmad777

    1c Вылетает

    1c has stopped working

    Reply
  16. Davidmad777

    (14)

    1c Вылетает

    1c has stopped working

    Reply
  17. Davidmad777

    Вот Скрини

    Reply
  18. Davidmad777

    а вот log

    Log Name: Application

    Source: Application Error

    Date: 03.09.2014 12:06:32

    Event ID: 1000

    Task Category: (100)

    Level: Error

    Keywords: Classic

    User: N/A

    Computer: Davit

    Description:

    Faulting application name: 1CV8C.exe, version: 8.3.4.482, time stamp: 0x535f2a9f

    Faulting module name: ext.dll, version: 8.3.4.482, time stamp: 0x535f3285

    Exception code: 0xc0000005

    Fault offset: 0x000036c0

    Faulting process id: 0xb80

    Faulting application start time: 0x01cfc7458fd32616

    Faulting application path: C:Program Files (x86)1cv88.3.4.482in1CV8C.exe

    Faulting module path: C:Program Files (x86)1cv88.3.4.482inext.dll

    Report Id: d541a513-3338-11e4-a0f6-005056c00008

    Event Xml:

    <Event xmlns=»http://schemas.microsoft.com/win/2004/08/events/event»>

    <System>

    <Provider Name=»Application Error» />

    <EventID Qualifiers=»0″>1000</EventID>

    <Level>2</Level>

    <Task>100</Task>

    <Keywords>0x80000000000000</Keywords>

    <TimeCreated SystemTime=»2014-09-03T07:06:32.000000000Z» />

    <EventRecordID>1738</EventRecordID>

    <Channel>Application</Channel>

    <Computer>Davit</Computer>

    <Security />

    </System>

    <EventData>

    <Data>1CV8C.exe</Data>

    <Data>8.3.4.482</Data>

    <Data>535f2a9f</Data>

    <Data>ext.dll</Data>

    <Data>8.3.4.482</Data>

    <Data>535f3285</Data>

    <Data>c0000005</Data>

    <Data>000036c0</Data>

    <Data>b80</Data>

    <Data>01cfc7458fd32616</Data>

    <Data>C:Program Files (x86)1cv88.3.4.482in1CV8C.exe</Data>

    <Data>C:Program Files (x86)1cv88.3.4.482inext.dll</Data>

    <Data>d541a513-3338-11e4-a0f6-005056c00008</Data>

    </EventData>

    </Event>

    Reply
  19. Davidmad777

    Problem signature:

    Problem Event Name: APPCRASH

    Application Name: 1CV8C.exe

    Application Version: 8.3.4.482

    Application Timestamp: 535f2a9f

    Fault Module Name: ext.dll

    Fault Module Version: 8.3.4.482

    Fault Module Timestamp: 535f3285

    Exception Code: c0000005

    Exception Offset: 000036c0

    OS Version: 6.1.7600.2.0.0.256.1

    Locale ID: 1067

    Additional Information 1: 0a9e

    Additional Information 2: 0a9e372d3b4ad19135b953a78882e789

    Additional Information 3: 0a9e

    Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

    Reply
  20. Customs

    Отличное прилжение, то чего так мне не хватало в магазине. Автору +

    Reply
  21. Davidmad777

    а вот log

    Log Name: Application

    Source: Application Error

    Date: 03.09.2014 12:06:32

    Event ID: 1000

    Task Category: (100)

    Level: Error

    Keywords: Classic

    User: N/A

    Computer: Davit

    Description:

    Faulting application name: 1CV8C.exe, version: 8.3.4.482, time stamp: 0x535f2a9f

    Faulting module name: ext.dll, version: 8.3.4.482, time stamp: 0x535f3285

    Exception code: 0xc0000005

    Fault offset: 0x000036c0

    Faulting process id: 0xb80

    Faulting application start time: 0x01cfc7458fd32616

    Faulting application path: C:Program Files (x86)1cv88.3.4.482in1CV8C.exe

    Faulting module path: C:Program Files (x86)1cv88.3.4.482inext.dll

    Report Id: d541a513-3338-11e4-a0f6-005056c00008

    Event Xml:

    <Event xmlns=»http://schemas.microsoft.com/win/2004/08/events/event»>

    <System>

    <Provider Name=»Application Error» />

    <EventID Qualifiers=»0″>1000</EventID>

    <Level>2</Level>

    <Task>100</Task>

    <Keywords>0x80000000000000</Keywords>

    <TimeCreated SystemTime=»2014-09-03T07:06:32.000000000Z» />

    <EventRecordID>1738</EventRecordID>

    <Channel>Application</Channel>

    <Computer>Davit</Computer>

    <Security />

    </System>

    <EventData>

    <Data>1CV8C.exe</Data>

    <Data>8.3.4.482</Data>

    <Data>535f2a9f</Data>

    <Data>ext.dll</Data>

    <Data>8.3.4.482</Data>

    <Data>535f3285</Data>

    <Data>c0000005</Data>

    <Data>000036c0</Data>

    <Data>b80</Data>

    <Data>01cfc7458fd32616</Data>

    <Data>C:Program Files (x86)1cv88.3.4.482in1CV8C.exe</Data>

    <Data>C:Program Files (x86)1cv88.3.4.482inext.dll</Data>

    <Data>d541a513-3338-11e4-a0f6-005056c00008</Data>

    </EventData>

    </Event>

    Reply

Leave a Comment

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