Прокладка маршрута в 1С 8.2 (Управляемое приложение) средствами Google Maps API V3




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

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

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

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

40 Comments

  1. sytkosa

    Однако скачиваний много, а комментарий нуль. Высказывайте пожелания/замечания не стесняйтесь 😀

    Reply
  2. opx

    Здорово. Всегда приятно видеть развитие проекта. И вдвойне приятно видеть развитие своего проекта. Автор молодец 5+

    Reply
  3. miandrew

    А есть ли возможность waypoints задавать в виде координат?

    Знаю что можно, ток пример не могу ниде найти…

    интересно как координаты соотносятся с координатами яндекса…

    Но самое плохое в этом всем что количество waypoints ограничено 8-ю 🙁

    Reply
  4. gorakh

    А можно ли задавать приоретет точек?

    Reply
  5. sytkosa
    miandrew пишет:

    А есть ли возможность waypoints задавать в виде координат?

    Знаю что можно, ток пример не могу ниде найти…

    интересно как координаты соотносятся с координатами яндекса…

    Но самое плохое в этом всем что количество waypoints ограничено 8-ю

    взамен адреса в waypoints можно спокойно подставлять координаты

    Количество waypoints ограниченно намеренно на уровне API. Если хочеш больше покупай у гугла премиум и используй waypoints сколько необходимо

    gorakh пишет:

    А можно ли задавать приоретет точек?

    Что в твоем понимании приоритет. передвигать строки адреса можно стрелками вверх вниз

    Reply
  6. gorakh

    Приоретет в таком смысле.

    Ситуации

    1) Адреса находятся в разных частях города, А и В в одной части Б в другой части. Чтобы доставить товар на В надо посетить точку А потом точку Б. А Гугль построит маршрут кратчайшим способом А,В,Б.

    Reply
  7. sytkosa
    gorakh пишет:

    Приоретет в таком смысле.

    Ситуации

    1) Адреса находятся в разных частях города, А и В в одной части Б в другой части. Чтобы доставить товар на В надо посетить точку А потом точку Б. А Гугль построит маршрут кратчайшим способом А,В,Б.

    Покажи где это делает сам гугл или yandex и я добавлю это в обработку

    Reply
  8. CagoBHuK

    Не работает под веб-клиентом. Хоть она и работает под УФ, но реального применения в УФ ей ноль.

    Reply
  9. sytkosa

    (8) под веб-клиент оптимизации нет. По просьбам «трудящихся» могу добавить

    Reply
  10. dj_serega
    8SiriuS8 пишет:

    Количество waypoints ограниченно намеренно на уровне API. Если хочеш больше покупай у гугла премиум и используй waypoints сколько необходимо

    в обход никак нельзя? 😉 Тоесть расчеты проводятся напрямую у гугла?

    Reply
  11. Eternalsun

    Автор, быть может я чего-то не понимаю, но НЕ РАБОТАЕТ!!! СОВСЕМ НИКАК.

    Задал в верхнем поле КРАСНОДАР — МАЙКОП, и нифига — МОСКВУ выводит и рисует чего-то.

    Еще, было бы неплохо сделать не под гугл, а под яндекс-карты, они с улицами, да и работать приятнее

    Reply
  12. 6728418@mail.ru

    Здорово. Всегда приятно видеть развитие проекта

    Задал в верхнем поле КРАСНОДАР — МАЙКОП, и нифига — МОСКВУ выводит и рисует чего-то.

    Еще, было бы неплохо сделать не под гугл, а под яндекс-карты, они с улицами, да и работать приятнее

    Reply
  13. sytkosa

    (11) (13) Внимательно смотрите код насильно установлена Москва. А так как гугл «типа умный» то другое и не рисует. Поправьте в коде и будет поиск по миру и или Росиии

    Reply
  14. OrsoBear

    Спасибо, хорошая разработка.

    Вопрос, а есть ли возможность работы с оффлайн картами?

    Или выбор маршрута целиком работает средствами гугл?

    У меня запустилась и сформировала маршруты сразу же.

    Reply
  15. sytkosa

    (15) Единственное что можно сделать чтоб использовать прокладчик маршрута от Google это использовать кэшированные картинки.

    А так чтоб использовать всё свое и держать у себя то тебе прямая дорога к http://www.routino.org/ или на что то похожее

    Reply
  16. Throrka

    Откуда такая информация, что количество точек на маршруте ограничено 8?

    Для меня это важный момент. И если можно скажите, где можно посмотреть стоимость Премиум АПИ.

    Reply
  17. sarge_s

    Обычно Москву выводи когда не может рассчитать маршрут.

    (17) Throrka,

    точек на самом деле не 8, а 10.

    в премиум — 23.

    источник инфы http://www.google.com/enterprise/earthmaps/maps-compare.html

    Reply
  18. sarge_s

    А через что реализован вывод карты на управляемую форму? что-то через форматированный документ не получается 🙁

    скачать посмотреть тоже не дает, так как я здесь не частый гость. Хотя может, где доберу скачаю посмотрю. 🙂

    Reply
  19. sarge_s

    (19) sarge_s, спасибо нашел,

    если кому надо будет (затупят как и я :))

    то тип карты строка в реквизитах формы, а у поля формы необходимо выбрать вид «Поле HTML документа».

    Reply
  20. vadimlp77

    Количество точек может быть и больше — строка запроса не может превышать 2000 символов.

    Reply
  21. tvixeg

    Пишу сейчас службу доставки для одной сети быстрого питания. Сделал там печать маршрута от базы до нужного адреса через Google Maps API V3. Имеются документы заказов от клиентов, в них есть время доставки, адрес. Сейчас хотелось бы сделать доставку по возможности сразу нескольких заказов, чтобы находился оптимальный маршрут по имеющимся заявкам, в зависимости от времени доставки в документах заказов чтобы захватывало максимальное количество заявок. Начальная точка отправки у меня всегда одна. А вот конечную нужно выбрать оптимальную и промежуточные точки тоже оптимальные. Есть ли идеи как эти можно реализовать через Google Maps API V3? Нет ли подобных наработок?

    Reply
  22. rotting

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

    Reply
  23. zekrus

    Вопрос:

    -Пакетное использование геокодирования строго запрещено в коммерческих целях, как у вас этим вопросом (договоренность есть)?

    Reply
  24. Гость

    Обработка не открывается когда её пытаюсь запустить!

    Reply
  25. Stamper

    (25) проверь возможность запуска управляемых форм

    Reply
  26. plevakin

    (22) Появилась такая же задачка. Существует-ли какое-то решение?

    Reply
  27. sytkosa

    (23) В принципе на инфостарте есть обработки которые уже оптимизированы под вэб. Если очень сильно надо то могу их наработки внедрить в данную версию

    Reply
  28. GIZmo

    Есть нюанс, на стороне гугла, ПЕРВЫЙ адрес не может совпадать с каким-либо адресом из списка — в результате маршрут не стоится, видимо придется указывать соседний дом или корпус.

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

    Reply
  29. Anzhey

    Спасибо

    Reply
  30. ilya005

    не работает:

    Ошибка: Не удалось получить свойство display. Недопустимый аргумент.

    Reply
  31. Vovalnu

    (31)(31)(31) ilya005, И у меня такая ошибка, хотя до этого уже несколько лет работало нормально.

    Reply
  32. Vovalnu

    (31) Разобрался, нужно в макете (не знаю как тут, но у меня работает через макет) заменит «http://maps.google.com/maps/api/js?sensor=false» на»http://maps.google.com/maps/api/js?v=3.19&sensor=false», тоесть указать конкретную версию api.

    Reply
  33. Andriyanov

    Спасибо. Та же проблема. Макет подправил. Теперь карта открывается, но сразу же вываливается сообщение о невозможности отображать страницу в связи с нарушением условий использования карты.

    Reply
  34. albov

    (34) Andriyanov, проблема лечиться Вставкой корректного Ключа API

    Reply
  35. ilya005

    (33) Vovalnu, (35) albov,

    что то у меня не получилось,

    ни вставка ключа ни вставка версии не помогло…

    теперь такая ошибка :

    Строка: 3

    Ошибка: «google» не определено

    Reply
  36. ui69

    Во-первых, автору огромное спасибо за такую обработку!

    Во-вторых,

    (18) sarge_s, у меня почему то строит маршрут только если в таблице максимум 6 адресов, если больше, то отказывается строить.

    Reply
  37. ui69

    Подсчет общего количества км по маршруту добавьте пожалуйста.

    Reply
  38. wmonref1

    Обработка работает нормально, (Платформа 8.3.8.1502), но периодически выскакивает данная ошибка:

    (Ошибка скрипта! Адрес URL «http://maps.google.com/maps-api-v3/api/js/23/8/intl/ru_ALL/onion.js»)

    Я изменил в ХТМЛ коде map_canvas на map-canvas, а также «http://maps.google.com/maps/api/js?sensor=false» на «http://maps.google.com/maps/api/js?v=3&sensor=false»

    Подскажите пожалуйста, как исправить? Может это связанно с Ключом API?

    Подскажите как и куда вставить этот ключ? ( у меня есть ключ от google)

    Спасибо!

    Reply
  39. p.ugrumov

    Ошибка: Ваш браузер не поддерживается Google Maps JavaScript API. Выберите другой

    Reply
  40. demogorgonit

    Не работает больше с АПИ нужно зарегистрироваться получить ключ APi и вставить

    Reply

Leave a Comment

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