Мобильный сканер документов




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

16 Comments

  1. saa@kuzov.org

    Держите 3см.

    Первый традиционный вопрос: почему не выложили конфигурацию мобильного приложения? Оно, как я понимаю, достаточно «тупое»: сделанное фото кладет к вам на сервер http://92.255.188.118:8081/MSD_Server/ws/MSD_Server?wsdl

    2) Почему везде http? В веб-сервисе, в сервисе генерации qr-кода chart.apis.google.com

    3) Зачем самопальная функция EncodeURL? Есть же встроенная КодироватьСтроку()

    4) Любопытство.

    В это время будет происходить фоновая передача файла фотографии на сервер обмена

    Как сделали? Внутри xml? Base64? Binary? Фоновое задание? Работает ли на современных Андроидах и всех айфонах, когда переключаешься на другое приложение или сворачиваешь это приложение?

    Reply
  2. Agregadus

    Если на мобильном у вас оказался УИД объекта и тип данных, после сканирования штрихкода, почему бы не воспользоваться REST интерфейсом и писать напрямую в базу, а не через сомнительные сервера обмена?

    Reply
  3. KAV2

    Отличная идея, кстати такое нужно не только когда сканера нет под рукой, стационарный сканер вообще штука не удобная и медленная, я сталкивался с тем, что пользователи предпочитали «сканировать» документы с помощью собственных телефонов, нежели пользоваться имеющимся сканером.

    Reply
  4. KAV2

    Вопросы:

    1) Правильно ли я понял что для передачи снимка используется ваш сервер обмена, и нельзя использовать свой или передать снимок напрямую в базу?

    2) Будет ли доступен исходный код всего проекта или отдельных его частей? И если да, то под какой лицензией?

    3) Что находится в комплекте для скачивания? Расширение конфигурации и мобильное приложение?

    Reply
  5. saa@kuzov.org

    (4)

    3) Что находится в комплекте для скачивания? Расширение конфигурации и мобильное приложение?

    Скомпилированный apk и внешняя обработка.

    ИМХО, очень странный набор. Но я понимаю, какой код написан в мобильном приложении и серверной базе. Его повторить — работы на полчаса.

    1) Правильно ли я понял что для передачи снимка используется ваш сервер обмена, и нельзя использовать свой или передать снимок напрямую в базу?

    Да, я же выше ссылку написал, фото с мобильного кладется в базу http://92.255.188.118:8081/MSD_Server

    зайдите, посмотрите.

    Reply
  6. Timur.V

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

    Хотелось бы увидеть открытый код мобильного приложения (а не apk скомпилированный) и обработки 1с.

    Reply
  7. RSConsulting

    (1) Спасибо за проявленный интерес.

    почему не выложили конфигурацию мобильного приложения?

    Потому что данная публикация предназначена для конечного пользователя, а не для разработчиков.

    Почему везде http? В веб-сервисе, в сервисе генерации qr-кода chart.apis.google.com

    Не совсем понятный вопрос. Чем плох http в данном решении?

    Зачем самопальная функция EncodeURL? Есть же встроенная КодироватьСтроку()

    Спасибо за подсказку. Попробуем использовать КодироватьСтроку() в следующем релизе.

    Фоновое задание? Работает ли на современных Андроидах и всех айфонах, когда переключаешься на другое приложение или сворачиваешь это приложение?

    Да. Это фоновое задание. Тестирования на работу передачи данных при сворачивании приложения не производилось.

    Reply
  8. RSConsulting

    (2)

    Если на мобильном у вас оказался УИД объекта и тип данных, после сканирования штрихкода, почему бы не воспользоваться REST интерфейсом и писать напрямую в базу, а не через сомнительные сервера обмена?

    Для REST интерфейса (http://v8.1c.ru/overview/Term_000000824.htm) нужен web-сервис. С помощью внешней обработки, которая входит в поставку, веб-сервис опубликовать нельзя. Чтобы не нагружать пользователя проблемой публикации веб-сервиса используется наш сервер-посредник.

    Reply
  9. saa@kuzov.org

    по поводу фонового задания мне кажется, Вы лукавите.

    Я декомпилировал apk, смотрю, а там

    &НаСервере

    Процедура ОтправитьВОблакоНаСервере()

    П1= ПолучитьИзВременногоХранилища(П2);

    Если П2 = Неопределено Тогда

    Возврат;

    КонецЕсли;

    П3 = ОбщегоНазначенияВызовСервера.УстановитьСоединениеСWebСервисом();

    П3.ПередатьФайлИзМУвОблако(П4, Новый ХранилищеЗначения(П2, Новый СжатиеДанных()));

    Сообщить(«Успешно!»);

    КонецПроцедуры

    То есть по нажатию кнопки сразу идет вызов веб-сервиса. Фоновым заданием и не пахнет.

    Reply
  10. RSConsulting

    (9)

    То есть по нажатию кнопки сразу идет вызов веб-сервиса. Фоновым заданием и не пахнет.

    И в конце у вас появляется сообщение «Успешно!»?

    Хм… эта строка вообще-то закомментирована в конфигураторе 1С.

    Вы пробовали пользоваться приложением?

    Reply
  11. RSConsulting

    (2)

    почему бы не воспользоваться REST интерфейсом и писать напрямую в базу

    Для этого пришлось бы публиковать базу клиента. Наша обработка подключается и сразу работает без каких-либо дополнительных телодвижений. Сервер наш. И никакой не сомнительный 🙂

    Reply
  12. RSConsulting

    (4)

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

    Да правильно.

    Будет ли доступен исходный код всего проекта или отдельных его частей?

    Исходный код всего проекта не предоставляется.

    Что находится в комплекте для скачивания?

    Внешняя обработка и apk-приложение

    Reply
  13. Kutuzov

    Идея решения отличная.

    Reply
  14. DarkAn

    Идея очень напоминает способ авторизации WhatsApp Web

    Reply
  15. Senator_I

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

    Reply
  16. EvgeTrofi

    Просто заметка:

    Если в конфигурации имеется БСП 3.0.2 и выше, то картинку QR-кода можно получить через функцию

    УправлениеПечатью.ДанныеQRКода

    Подробнее: ИТС

    Reply

Leave a Comment

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