Мобильная платформа. Что можно еще?




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

29 Comments

  1. sergei198821

    Доброе время суток! Случайно не знаете команды для работы со встроенной камерой на андроиде, и можно подключится к ней и выводить результат например в элемент «Картинка» ?

    Reply
  2. DitriX

    (1)

    &НаКлиенте

    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    Фото = Новый СредстваМультимедиа;

    Если Фото.ПоддерживаетсяФотоснимок() Тогда

    Данные = Фото.СделатьФотоснимок();

    Если Данные = Неопределено Тогда Возврат КонецЕсли; //Фото не сделали

    Сообщить(Данные.РасширениеФайла + » » + Данные.ТипСодержимого);

    Фото = ПоместитьВоВременноеХранилище(Данные.ПолучитьДвоичныеДанные()); //Реквизит формы строковый, вынесен на форму и поставленно тип поля — картинка

    Иначе

    Сообщить(«Данное устройство не поддерживает создание фото!»)

    КонецЕсли;

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

    Reply
  3. flyer

    для IOS как все это отработает? надо будет проверить.

    Reply
  4. DitriX

    (3) без понятия 🙂 проверите и расскажите 🙂

    Reply
  5. ksvd

    (2) Попробовал — ошибка: Тип не определен (СредстваМультимедиа)

    1С:Предприятие 8.3 (8.3.4.437)

    Управление небольшой фирмой для мобильной работы (1.1.1.1)

    Назначение использования = Мобильное устройство

    Куда посмотреть?

    Reply
  6. DitriX

    (5)полный код ошибки дайте

    Reply
  7. ksvd

    (6) Вот

    {Документ.Заказ.Форма.ФормаДокумента.Форма(223,15)}: Тип не определен (СредстваМультимедиа)

    Фото = Новый <<?>>СредстваМультимедиа; (Проверка: Тонкий клиент)

    Reply
  8. DitriX

    (7) ksvd, Фото = Новый <>СредстваМультимедиа; (Проверка: Тонкий клиент)

    Вот ошибка 🙂

    Напишите этот кусок в контексте мобильного клиента:

    #Если МобильныйКлиент Тогда

    //А между ними вставьте тот код. Или отключите проверку тонкого клиента.

    #КонецЕсли

    Reply
  9. ksvd

    (8) Спасибо! Ошибка при компиляции пропала, но и не заходит туда.

    В этом коде говорит — Не мобильный клиент.

    Назначение использования = Мобильное устройство — это недостаточно?

    &НаКлиенте

    Процедура Сфотографировать(ПараметрКоманды, ПараметрыВыполненияКоманды)

    #Если МобильныйКлиент Тогда

    Фото = Новый СредстваМультимедиа;

    Если Фото.ПоддерживаетсяФотоснимок() Тогда

    Данные = Фото.СделатьФотоснимок();

    Если Данные = Неопределено Тогда Возврат КонецЕсли; //Фото не сделали

    Сообщить(Данные.РасширениеФайла + » » + Данные.ТипСодержимого);

    Фото = ПоместитьВоВременноеХранилище(Данные.ПолучитьДвоичныеДанные()); //Реквизит формы строковый, вынесен на форму и поставленно тип поля — картинка

    Иначе

    Сообщить(«Данное устройство не поддерживает создание фото!»)

    КонецЕсли;

    #Иначе

    Сообщить(«Не мобильный клиент!»)

    #КонецЕсли

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

    Reply
  10. DitriX

    (9) ну так код надо запускать на телефоне 🙂

    Reply
  11. ksvd

    (10) Пятница — хороший день. Но все-таки

    Вот например в этом случае у меня на смартфоне заголовок кнопки = 2

    &НаКлиенте

    Процедура ПриОткрытии(Отказ)

    #Если МобильныйКлиент Тогда

    Элементы.Сфотографировать.Заголовок = «1»;

    #Иначе

    Элементы.Сфотографировать.Заголовок = «2»;

    #КонецЕсли

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

    Reply
  12. ksvd

    Что-то я в справке не нашел

    #Если МобильныйКлиент Тогда

    есть

    #Если МобильноеПриложениеКлиент Тогда

    с ним код выполняется, но до

    Данные = Фото.СделатьФотоснимок();

    на это говорит «В 1С:Enterprise произошла ошибка» и программа закрывается

    Reply
  13. DitriX

    (12) действительно, по памяти писал, ошибся.

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

    Reply
  14. Dimon93dimon

    (12) ksvd, попробуй сначал проверять, поддерживает ели устрйоство фотоснимок

    # Если МобильноеПриложениеКлиент  Тогда
    Если СредстваМультимедиа.ПоддерживаетсяФотоснимок() Тогда
    Хранилище = СредстваМультимедиа.СделатьФотоснимок();
    Иначе
    Сообщить(«На данном устройстве не поддерживается фотосъемка!»);
    КонецЕсли;
    
    # КонецЕсли
    

    Показать

    Reply
  15. ksvd

    (14) Dimon93dimon, Так в примере такая проверка есть.

    На двух HTC проверял разных. Версию приложения еще попробую поменять

    Reply
  16. DitriX

    (15) проверка указывает на возможность, а не на то, что фото 100% сделается.

    У нас на ТСД — проверку тоже проходит, но фото не делает, т.е. как будто ничего не происходит

    Reply
  17. TitanLuchs

    А 1С уже штатно позволяет отсылать СМСки со смартфонов? Что-то я отстал от жизни…

    Reply
  18. DitriX

    (17) не может 🙂

    Reply
  19. ksvd

    Только руки дошли проверить на другой платформе. Дело было в ней. На 8.3.4.17 все работает

    Reply
  20. Seeker

    добрый день,

    А вы не знаете как проиграть выбранную мелодию?

    Reply
  21. Seeker

    получился вот такой код:

    НовВз = Новый ЗапускПриложенияМобильногоУстройства();
    НовВз.Действие = «android.intent.action.VIEW»;
    НовВз.Данные = «file:///storage/sdcard0/music/beep.mp3»;
    НовВз.Тип = «audio/*»;
    НовВз.Категория = «android.intent.category.DEFAULT»;
    НовВз.Запустить(Истина);

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

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

    Reply
  22. DitriX

    (21) Seeker, ну тогда только через утилиты. По другому не вижу вариантов.

    Reply
  23. Seeker

    (22) через какие утилиты можно по подробней?

    Reply
  24. DitriX
  25. erutan

    Здравствуйте!

    Не могли бы Вы дать небольшой совет.

    пишу следующее

    &наклиенте
    процедура сообщитьконтакты(команда)
    мк=новый менеджерконтактов;
    выборка=мк.найтиконтакты();//без параметров — чтобы веонуть всех
    для каждого стр из выборка цикл
    сообщить (стр.имя);
    конец цикла;
    конецпроцедуры

    Возвращает ничего (количество 0)

    чтяднт?

    Спасибо.

    Reply
  26. DitriX

    (25) erutan, платформа для разработчиков стоит?

    Reply
  27. erutan

    (26) конкретно это тестировал на тестовой сборке на «живом» телефоне.

    Платформа для разработчиков — это где подгружается xml-файл с веб-сервера? Разворачивал на виртуалке, но что-то с отладкой мобильного приложения не разобрался. Вечером попробую еще подумать.

    Reply
  28. erutan

    (26) получилось как-то вот так

    &НаКлиенте
    Процедура СообщитьКонтакты(Команда)
    #Если МобильноеПриложениеКлиент Тогда
    МК = Новый МенеджерКонтактов;
    //ЛокальныеКонтакты = МК.ПолучитьЛокальнуюУчетнуюЗаписьКонтактов();
    выборка=МК.НайтиКонтакты();
    для Каждого стр из выборка цикл
    попытка
    текст=строка(текст)+» «+строка(мк.ПолучитьКонтакт(стр).ДанныеКонтакта.Имя);
    исключение
    конецпопытки;
    конеццикла;
    сообщить(текст);
    //сообщить(выборка.Количество());
    #КонецЕсли
    КонецПроцедуры
    

    Показать

    Что меня печалит: если не делать попытка .. исключение .. конецпопытки, падает на строке «без имени», крича, что не объектный тип. То есть если у контакта имя не введено (не заполнено) — к этому полю вообще обратиться не выходит. Страннота.

    Reply
  29. DitriX

    (28) зарегистрируйте баг 🙂

    Reply

Leave a Comment

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