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

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 не будет опубликован. Обязательные поля помечены *