Горизонты мобильной платформы 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='\

39 Comments

  1. artem666

    Вся суть мобильной разработки в кастомном дизайне, чего на 1С по определению нельзя сделать

    Reply
  2. DitriX

    (1) что вы под этим понимаете?

    Reply
  3. DoctorRoza
    Поэтому — хочу еще раз напомнить про андроид программиста — он вам однозначно нужен, и тут — без вариантов. Либо пусть ваши 1С программисты проходят курсы по андроиду,

    (2) Дмитрий! Вот у Вас есть коллеги, друзья 1С-программисты. Сколько из них, в процентах, могут вести разработку и в 1С, и в Android? 🙂 Да и когда будет обзор 8.3.6.182?

    Reply
  4. DitriX

    (3) В смысле? Так совпало, что в последнее время, у меня круг знакомых таков — каждый пишет решения под мобильную 1С и мы вместе помогаем друг другу с тонкостями андроида 🙂 Но я думаю — так не везде.

    Ну и конечно есть знакомые программисты андроид — которые помогают.

    Reply
  5. TODD22

    (4) а курс по мобильной разработке будет дополнятся? Например работой с http сервисами, json и тд или там это есть и я просто не дошёл ещё до этого? Я на 3 модуле пока 🙂

    Reply
  6. DitriX

    (5) сейчас новый модуль выйдет, там будет немного про сервисы, json пока не доступен на мобильной.

    Та и в целом — ws перевести на http — дело 5 минут, тоже самое и xml на json 🙂

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

    Reply
  7. TODD22

    (6) Да защита то же очень интересует. Что бы из вне никто не смог подключаться…

    Или DDoSить мой веб сервис. А то будут к нему запросы строить базу нагружать.

    Reply
  8. gradi

    Почему выбран именно такой способ для получения фотографии? Ведь есть же специальный вызов в 1С для этих целей.

    Reply
  9. flyer

    еще один мелкий нюанс 🙂 . при открытии видим всплывающую заставку 1с. некоторые клиенты просили ее убрать. хотят видеть свой логотип. а так все супер! 1с на рынке моб.приложений сделали бомбу!!!

    Reply
  10. TODD22

    (9) flyer,

    1с на рынке моб.приложений сделали бомбу!!!

    Что то пока не заметил как бомбануло… что бомбануло то у 1с с мобильной платформой?

    Reply
  11. flyer

    (10) TODD22, скорость разработки и тем самым стоимость решения для бизнес приложений уменьшена.

    Reply
  12. Широкий

    Кто бы сделал инструмент для программного показа/скрытия виртуальной клавиатуры.

    У меня этот момент важен, приходится до сих пор на версии 4.17 сидеть.

    Reply
  13. DitriX

    (7) ну это делает немного по другому. А тут все таки интересует вопрос — что бы не уперли пароли подключения. И касается это не только мобильной платформы.

    (8) потому что каждая программа обрабатывает фотографии по своему — попробуйте в 1с выбрать гамму. разрешение, формат, HDR, уровень освещенности и т.д.

    (9) ну так заставку можно свою сделать, по бокам конечно внизу будет 1с написано, но 90% заставки — в вашем распоряжении.

    (12) а зачем это вам? Какая цель? Вдруг подскажу.

    (10) прям слова 5 летней давности про УФ, еще ранее про 8, и т.д. 🙂

    Reply
  14. flyer

    (13) я вот про эти маленькие заставки и говорю а то например заказчик пиццерия попросили сделать программу Заказа их продукции. заставку им при открытии наваял а вот любимые слова 1с Предприятие нельзя убрать. вот и получается двоякая ситуация как бы программа от Пиццерии а тут еще каким то боком 1с.

    Reply
  15. DitriX

    (14) если я не ошибаюсь, то 1С позволяет менять заставки, во всяком случае на стационарной, но для этого надо писать им. Напишите им и узнайте, вдруг они вам подскажут?

    Reply
  16. Широкий

    (13) Для удобной работы пользователей.

    Упрощенно: Открываешь форму — у тебя курсор стоит уже в нужном поле и услужливо клавиатура открыта, лишний тап по полю делать не надо.

    Reply
  17. DitriX

    (16) ну тут да, разве только в настройках манифаста полазить

    Reply
  18. JetBrain

    Тестировал пару раз мобильную платформу под Android, ни чего в ней не меняется в своей основе, apk файл как весил минимум 30 Мбайт, так и продолжает набирать свой «вес», а это всего лишь «hello world»!!! Больше похоже на ковыряние в песочнице, нежели на промышленно-эксплуатируемое приложение.

    Reply
  19. DitriX

    (18) это тоже самое, что винить Excel, что он весит 500Мб, а вам всего то и надо — открывать файлы.

    Если вы не знаете, какие там механизмы заложены, то лучше и не говорить про это, ибо знаю на своем опыте — делал когда то приложение под андроид, и библиотека ksoap, которая позволяет работать с веб сервисами — весит 200кБ. и это только одна функция, по сути.

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

    Так что вы попробуйте реализовать хоть 10% возможности 1С и сразу увидите, что приложение будет весить овер 10Мб, минимум.

    Так что вес не такой уж и большой.

    И кстати, есть поучительная история, про борьбу Microsoft Office и Lotus 1-2-3, почитайте, как лотус оптимизировал свои решения до идеального блеска, которые работали отлично на машинах того времени, а Microsoft тупо выпускали глючный софт, с оглядкой на то, что технологии развиваются очень быстро, и в оптимизации такого уровня — нет никакого смысла, ибо через год=два, появятся компы в несколько раз сильнее. В итоге — lotus затормозил на год, и выпустил идеальный софт, который идеально работал, но на этом рынке была уже MS, а за это время — компы стали мощнее, и в итоге — все приимущества лотуса — ушло в никуда.

    Тоже самое и тут. У меня сейчас есть планшет Nokia N1, там стоит Intel x64 проц, и 1С по скорости проигрывает компу с SSD дисками — в два раза.

    К примеру, на моем смартфоне — Moto G, 1С медленнее работает в 20 раз, чем на компе. Не хилый прирост всего за два года?

    К чему я — хватить гундеть про размер и про скорость 🙂 У меня есть мобильные базы, которые весят 500Мб, из них — само приложение занимает 50. При таком раскладе — мне пофиг, будет оно занимать 50Мб, или 5Мб.

    Reply
  20. pro1c@inbox.ru
    Либо пусть ваши 1С программисты проходят курсы по андроиду

    если они пройдут, то писать на 1С под Android не будут!! :))))

    с iOS с такими подходами загнется все еще на этапе публикации….

    Reply
  21. pro1c@inbox.ru
    Например, если нужно сделать отчет для руководителя, то необязательно его делать на 1С, есть куча уже готовых решений, которые нацелены именно на визуальзацию данных, а не на их обработку.

    как правило, по статистике, руководители чаще пользуются Apple и архаичные интерфейсы, которые предлагает мобильная платформа 1C — не прокатит!

    Reply
  22. DitriX

    (20) почему это? Я могу кодить под андроид, но все равно остаюсь в 1С, почему это?

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

    И у моей команды есть ряд готовых решений, которые мы забросили, после 2 лет разработки, о некоторых — мы писали тут. О некоторых — нет.

    А забросили по очень простой причине — вышла мобильная платформа.

    Вы пробовали разработать до конца хоть одно тиражное решение а потом его поддерживать?

    Мне вот просто интересно, очень похоже — что нет, отсюда вы и делаете ваши выводы.

    (21) Как правило — используется экосистема, например, в бизнес приложениях ее нет. Т.е. тупо нет.

    Вот если мы возьмем все приложения от гугла, рукалицо, контакта и т.д., то вы увидите — они используют интерфейсы своих экосистем, и слать они хотели куда дальше все остальное. Посмотрите на PowerBi, от MS, и что?Каким оно паттернам подчиняется? Эпла? Винфона? Андроида? Нет, оно идентично везде, и вписывается в экосистемы остальных приложений от MS.

    Все эти паттерны, стили и т.д. — это все для автономных приложений, и просто общие мысли и соображения, например, решили что меню будет слева, все. Дальше че хочешь то и делай. Решили отказаться вообще от кнопки меню — та не проблема. Но опять таки — есть просто общие соображения и рекомендации.

    Вот и 1С — точно также, работает в своей экосистеме. И вашему директору — привычней будет работать именно с идеологией интерфейса 1С.

    Почему? Та все просто — вы спросите этих своих директоров, кто из них глубоко сидит в экосистеме приложений эпла? 90% используют только будильник и почту, ну и позвонить. Вот вам и вся экосистема.

    Интерефейс, в конце концов, пишет программист, а не 1С. А если у этого программиста нет опыта дизайна интерфейсов, ну так кто ему доктор? Вы посмотрите какие люди формы рисуют в стационарной 1С, это же пипец просто.

    Теперь давайте возьмем приложение Viber, очень популярное, расскажите — оно подчиняется патернам интерфейса на iOS? И чем оно отличается от нового интерфейса мобильной 1С?

    Поэтому давайте в очередной раз не поднимать пыль на ровном месте.

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

    Но это мое мнение.

    Reply
  23. maxx

    Воспользовался кодом для фотографии родным приложением. Но есть одно НО…. Помимо файла, который я указываю создаётся ещё копия файла самим приложением. Это раз. Во-вторых, если просто удалить этот «дублированный файл» из мобильного приложения 1С, то остаются «следы» пустая пиктограмма при просмотре фотографии в Галерее. Как это можно обойти?

    Reply
  24. DitriX

    (23)А код вы можете привести?

    Reply
  25. maxx

    (24) в результате в папке камеры оказыывается 2 файла: с моим именем и именем камеры типа 20115101_6587.jpg

    вот код,

    #Если МобильноеПриложениеКлиент Тогда
    ТекВремяНач = ТекущаяДата();
    ФайлКартинки= «file:///sdcard/DCIM/Camera/tmp.jpg»;
    НовВз=Новый ЗапускПриложенияМобильногоУстройства(«android.media.action.IMAGE_CAPTURE»);
    НовВз.ДополнительныеДанные.Добавить(«output»,ФайлКартинки,»Uri»);
    Если НовВз.Запустить(Истина) <> 0 тогда
    СмещениеВремени = ПолучитьСмещениеВремени();//ошибка в платформе в метод мФайл.ПолучитьВремяИзменения() неверно возвращает дату смещает, поэтому вычисляем смещение
    ТекВремяКон = ТекущаяДата();
    МассивФайлов = НайтиФайлы(«file:///sdcard/DCIM/Camera/», «*.jpg»);
    Для каждого мФайл из МассивФайлов Цикл
    //файлы камеры, которая она сделала самостоятельно удаляем
    ВремяИзменения = мФайл.ПолучитьВремяИзменения() + СмещениеВремени;
    Если  ВремяИзменения  >= ТекВремяНачи  ВремяИзменения <= ТекВремяКон Тогда
    УдалитьФайлы(мФайл.ПолноеИмя);
    КонецЕсли;
    КонецЦикла;
    Иначе
    Сообщить(«Фото не сделано!»);
    КонецЕсли;
    #КонецЕсли

    Показать

    Reply
  26. DitriX

    (25) maxx, а чем вы делаете фото? Как называется программа? Так как воспроизвести не смог .

    Reply
  27. maxx

    (26) приложение , стандартное Камера (других нет). Планшет Dexp

    Поэкпериментировали, на телефонах к примеру не создаётся дубликаты. Но все равно если из 1С удалить файл, то ссылку на фотографию в виду пуcтой пиктограммы в Галерее остаётся. Если перезагрузить устройство, то ссылки пустые убираются.

    Reply
  28. DitriX

    (27) это да, там кэшируются пиктограммы, т.е. привьюшки. Их надо удалять отдельно, а вы попробуйте делать фото не в папку с фотографиями, а в другую какую то папку.

    Reply
  29. Zasranec0

    Когда делаем фотографию мы знаем путь к файлу. Как получить превью файл небольшого размера одновременно с нормальным файлом?

    В НовВз.Данные пустая строка. Можете помочь?

    «Кроме этого, приложение вам возвращает сразу же маленькую превью этой фотографии (320х320) и путь к полноценной фотографии (той, которую вы сделали, с теми настройками, которые вам нужны). И это сделать реально.» — как?

    Reply
  30. DitriX

    (29) как оказалось — не на всех устройствах. На большенстве устройств — вы делаете либо это либо другое. Т.е. или получаете полноценную картинку или ее привью. Увы.

    Reply
  31. AganinEvgeniy

    Доброго времени суток.

    Возникла такая проблема.

    Пытаюсь запустить данный код на устройствах:

    «ФайлКартинки = «file:///storage/emulated/0/Download/MobileMKFoto.jpg»;
    НовВз = Новый ЗапускПриложенияМобильногоУстройства(«android.media.action.IMAGE_CAPTURE»);
    НовВз.ДополнительныеДанные.Добавить(«output»,ФайлКартинки,»Uri»);
    Рез = НовВз.Запустить(Истина);
    Если Рез = 0 Тогда
    Сообщить(«Фото не сделано!»);
    Иначе
    ЗапуститьПриложение(ФайлКартинки);
    КонецЕсли;»

    Показать

    На Huawey MediaPad всё отрабатывает хорошо с 5.1.1 андроидом, а на Samsung Galaxy S7 с андроидом 7.0 вылетает с ошибкой на моменте НовВз.Запустить(Истина).

    С чем может быть связана данная проблема?

    На обоих устройствах стоит мобильная платформа 8.3.10.51.

    Если я вместо «file:///storage/emulated/0/Download/MobileMKFoto.jpg» указываю:

    «ФайлКартинки = КаталогДокументов()+»MobileMKFoto.jpg»;
    ФайлКартинки = СтрЗаменить(ФайлКартинки,»»,»/»);
    ФайлКартинки = «file://» + ФайлКартинки;»

    всё-равно вылетает с ошибкой.

    Reply
  32. DitriX

    (31)

    КаталогДокументов() — это песочница только для 1с, другие туда доступ по полному пути не имеют.

    А вот сюда имеют:

    ФайлКартинки = «file:///storage/emulated/0/Download/MobileMKFoto.jpg»;

    Но тут в зависимости от прошивки — путь может отличаться, например, быть:

    ФайлКартинки = «file:///sdcard1/Download/MobileMKFoto.jpg»;

    Откройте ES Explorer и посмотрите полный путь к папке Download.

    Reply
  33. AganinEvgeniy

    (32)Спасибо, Дмитрий!!! Разобрался. У меня на телефоне путь к папке с закачками это «file:///sdcard/Download/MobileMKFoto.jpg» (я искал изначально путь к корневой папке по принципу Сообщить(КаталогДокументов()) и оттуда потом выдернул путь к корню … но проверял я это дело только на Huawey, априори считая что и на Самсунге будет аналогично … нахождение ещё одних граблей засчитан ))) ); Спасибо за подсказку о программе! Хотя она конечно же изобилует рекламой, но работает хорошо 🙂

    Reply
  34. ejikbeznojek

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

    Хотел уточнить кое-что.

    Т.к. нет возможности заставить всех пользователей не пользоваться устройствами под IOS.

    Приходиться делать фото(и не только) именно средствами 1С т.е.

    не

    НовФото= Новый ЗапускПриложенияМобильногоУстройства(«android.media.action.IMAGE_CAPTURE»);

    а

    ДанныеФото=СредстваМультимедиа.СделатьФотоснимок(ТипКамерыУстройства.Авто,Разрешение,70);

    Нет ли у вас какой-нибудь секретной статьи как учитывать особенности IOS при разработке мобильных приложений?

    Reply
  35. DitriX

    (34)

    они мне принесли премию

    А где мое пиво? 🙂

    так на курсах же говорю про это, и не только.

    А вообще — просто получайте системную информацию, и там написано — это андроид или ios.

    Reply
  36. ejikbeznojek

    (35)

    Я на самом деле подумываю над записью на курсы.

    Но я нашёл только видео курс на этом сайте + возможность задавать вопросы на сайте.

    А видео курс обновляется с такой же скоростью как платформа?

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

    Для андроида я могу apk файл скачать вместе со сборщиком с официального сайта 1С.

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

    Теоретически правильно было бы собрать своё пустое приложение под IOS (я правда собирал пока только под андроид и не пустое, но наверное можно как-то разобраться), но что потом?

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

    Reply
  37. DitriX

    (36) на iOS — вы просто регистрируете бесплатный аккаунт и вперед 🙂

    Публиковать ничего не надо. Публиковать можно только на платном аккаунте.

    Но нужен Мак, тем более вроде как 1с уже запилили образ для эмулятора.

    Ну или можно хакинтош, но там возня и эмулятор будет глючить дико, т.е. нужно устройство реальное.

    Смотрите курсы тут http:// /courses/, там раздел по мобильной платформе.

    Reply
  38. ejikbeznojek

    А как тогда приложение попадёт на кучу других айфонов, если ничего не публиковать?

    Reply
  39. DitriX

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

    Reply

Leave a Comment

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