Как сделать простое мобильное веб-приложение в 1С




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

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

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

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

23 Comments

  1. anig99

    Я правильно понял, что достаточно набрать адрес в браузере?

    Reply
  2. rtnm

    (1) anig99, да, вы поняли все правильно, после публикации HTTP-сервиса «Контакты» базы КонтактыМВП.dt, достаточно просто перейти по ссылке http://localhost/demobase/hs/contacts/index.html. Для тестирования на мобильном устройстве я переходил по ссылке http://192.168.0.104/demobase/hs/contacts/index.html — это видно на скриншотах.

    Reply
  3. BigB

    Подскажите, как получать параметры (HTTPЗапрос.ПараметрыЗапроса[«name»] перестает получать параметры) если переделать с HTTPМетод=»GET» на HTTPМетод=»POST»?

    Reply
  4. John_d

    интересно. Зачет)

    Reply
  5. rtnm

    (3) BigB, а как именно вы поменяли HTTP метод? Конкретно в демонстрационном примере выбран наиболее подходящий метод — GET. Ну а так, могу предположить, что в вашем случае параметры ушли в тело запроса, и тогда их можно получить с помощью HTTPСервисЗапрос.ПолучитьТелоКакСтроку()

    Reply
  6. rtnm

    (4) John_d, спасибо за позитивный отзыв

    Reply
  7. nucha

    база должна быть опубликована на сервере?

    С андроидным браузером работает?

    Reply
  8. rtnm

    (7) nucha, HTTP-сервис публикуется стандартными средствами предоставляемыми платформой 1С с использованием веб-сервера IIS или apache. Фреймоврки jQuery и jQuery mobile являются кроссбраузерными, поэтому мобильное веб-приложение должно работать без проблем в большинстве современных мобильных браузеров.

    Reply
  9. AlexSunS

    (7) nucha, Андроидный браузер это простите кто ?*

    Reply
  10. Программулькин

    чета я нифига не понял.

    Скачал КонтактыМВП.dt, на компе создал чистую файловую конфу, залил КонтактыМВП.dt, установил апач 2.2 , на диске C создал каталог WWW, в нем папку MVP. Далее открыл базу в режиме конфигуратор, тыкаю администрирование-публиковать на веб-сервере, далее

    Имя : MVP

    Веб-сервер: Апач 2.2.

    Каталог:C:wwwMVP

    «Истина» Публиковать тонкий клиент и веб-клиент

    «Истина» Публиковать стандартный интерфейс O Data

    «Истина» Публиковать Web сервисы по умолчанию

    «Истина» Публиковать HTTP сервисы по умолчанию

    Имя Контакты

    Корневой url contacts

    Куда мне нажать и что, где запустить, что бы позвонить, и что я не так сделал? (мобилка галактика 4 s с браузером от яндекса).

    Reply
  11. rtnm

    (11) Программулькин, если публикация прошла успешно и вы указывали имя MVP, то для запуска мобильного веб-приложения «Контакты» необходимо в браузере телефона перейти по ссылке http://ИмяИлиIPСервера/MVP/hs/contacts/index.html

    Reply
  12. Программулькин

    спасибо, заработало, кстати если на компе стоит звонилка IP телефонии , то тоже работает.

    Reply
  13. rus128

    Респект автору за разведку новых технологий и за лаконичную статью!

    Reply
  14. gudun_ku

    Если мобильная платформа не будет работать на Windows Embedded, она останется игрушкой для торговых представителей.

    С помощью ТСД на Андроид сканировать нормально большие партии товаров невозможно, поэтому ни Моторола, ни Даталоджик,

    например, не делают ТСД на Андроид.

    Reply
  15. chmv

    Очень интересно

    Reply
  16. Redokov

    (15) gudun_ku, сфера мобильных приложений не замкнута на ТСД. Гораздо интереснее делать приложения для бизнеса, интегрирующие функционал ERP-систем. Очень мало директоров и топов предприятия используют платформы, отличные от iOS и Android.

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

    Reply
  17. DitriX

    (15) winCE — устарела давно. И моторола уже давно выпускает тсд на андроид.

    http://www.motorolasolutions.com/US-EN/Business+Product+and+Services/Mobile+Computers/Handheld+C­omputers

    (17) уже все давно работает и все с этим работают.:)

    Reply
  18. John_d

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

    Reply
  19. Программулькин

    на платформе 8,3,6 выдаёд ошибку

    {Обработка.КонтактыМВП.МодульМенеджера(16,16)}: Тип не определен (HTTPСервисОтвет)

    Ответ = Новый <<?>>HTTPСервисОтвет(200); (Проверка: Толстый клиент (обычное приложение))

    {Обработка.КонтактыМВП.МодульМенеджера(26,16)}: Тип не определен (HTTPСервисОтвет)

    Ответ = Новый <<?>>HTTPСервисОтвет(200); (Проверка: Толстый клиент (обычное приложение))

    {Обработка.КонтактыМВП.МодульМенеджера(36,16)}: Тип не определен (HTTPСервисОтвет)

    Ответ = Новый <<?>>HTTPСервисОтвет(200); (Проверка: Толстый клиент (обычное приложение))

    Как победить?

    Reply
  20. rtnm

    (20) Программулькин, проверить, что действительно используется платформа 8.3.6 и не используется режим совместимости, других идей нет

    Reply
  21. seva1405

    Спасбо за статью! Давно ждал подобного от 1с.

    Сразу пришла идея сделать что-то похожее на сайт, но с этой идеей меня не поняли бы даже на инфостарте

    С удовольствием бы почитал такую статью, надеюсь вы все таки решитесь на нее.

    Reply
  22. Mortal

    Приветствую!

    Решил таки поковырять http-сервисы. Попалась Ваша разработка. Базу установил, опубликовал, подключаюсь с мобильника (Сяоми mi4s), но поиск не работает. Такая же картина при подключение с компьютера.

    Не подскажете, в чем может быть проблема?

    https://cloud.mail.ru/public/ETS1/DkUSBfp25

    Reply
  23. rtnm

    (24) Привет, сложно сказать, надо отлаживать.

    Reply

Leave a Comment

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