Учим 1С разговаривать с клиентами или работаем с API Бродкастер




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

30 Comments

  1. jhfrek

    Прикольно!

    Reply
  2. DoctorRoza

    А что интересная разработка! 🙂 А если на автоответчик попадешь? 🙂

    Reply
  3. Zircool

    (2) автоответчик прослушает сообщение 🙂

    Reply
  4. mmoozzgg

    а обратная связь присутствует?

    Reply
  5. CatMix

    (0) а каким голосовым движком синтезируется речь?

    Примеры проигрывания уже начитанной фразы не очень интересны, а на сайте других не нашёл.

    Reply
  6. Zircool

    (5) О механизмах синтеза не знаю, писал на основе описанного сервисом API, но мне кажется речь синтезируется через сервис Google.

    а обратная связь присутствует?

    (4) Да существует, но через API не управляется.

    Reply
  7. CatMix

    (6) если гугл то дешевле тогда к Astrerixу прикрутить.

    Reply
  8. Zircool

    (7) Ну здесь можно поспорить, что дешевле, если часто выполнять обзвоны, тогда возможно лучше доработка Asterisk. Но , для маленького предприятия, у которого нет внутренней телефонии, мне кажется проще воспользоваться сервисом. Здесь уже готовый механизм — бери и пользуйся, в случае в Aterisk нужно дописывать скрипты, тестировать сервис и потом увязывать с 1С.

    Каждый выбирает что ему удобнее.

    Reply
  9. gull22

    Плюс за познавательность и интересные комментарии

    Reply
  10. webester

    Какой то мутноватый сайт, при регистрации нужно стелепатировать в каком формате он ожидает номер телефона. Найти цены тоже целая история. Сайт выглядит как привет из 90x, при том что вроде бы достаточно предложений на рынке такого рода. Почему ваш выбор пал именно на него?

    Reply
  11. Adoney

    Идея хороша, моя можно сказать ))) Есть бесплатная программа ring. Она работает правда через обычный модем. Да и по поводу регистрации на сайте, вернее ожидания звонка, указал несколько номеров с периодичностью 15 минут, ни звонка, ни чего в общем. Кто то выше написал что сервис аля 90-е, полностью согласен, ни файла справки, ни тарифов… А так решение отличное.

    Reply
  12. sa6ne6k6

    Зачетная штука!!

    Reply
  13. imbaZeratul

    все отлично работает, только что проверяли, все звонит и отсылает смс

    Reply
  14. egorovntn

    А цен сообщения какая? 1 — 3 рублей одно сообщение?

    Reply
  15. Adoney

    Выдает ошибку, ключ скопировал на сайте — Wrong api key

    Reply
  16. Zircool

    (15) Возможно ключ скопировали с ошибкой, проверьте еще раз. Сегодня тестировал — все работает =)

    (14) По ценовой политике подсказать не могу, я лишь перевел API сервиса на язык 1С.

    (10) Как говорят: «Встречают по одежке, а провожают по уму». Разработчики сервиса, по всей видимости использовал готовый фреймвок и особо не заморачивались, главное что все работает.

    Reply
  17. Adoney

    Уважаемый автор, поясните, что за код приложения. Может в нем причина, я указал который на скрине. А что касается API ключа (я там выше писал) — копировал не один раз, всё равно ошибка ((( Я Вам отправил сообщение в ЛС, ответьте плз.

    Reply
  18. Adoney

    Да и еще, как быть с городскими номерами? К примеру 8 (42138) 43331, если его внести на самом сервисе, всё работает, а судя по коду Вашей обработки, там предусмотрены только мобильные номера. Может новый релизик накатать? )))

    Reply
  19. Zircool

    (18) Да, на уровне обработки выполняется проверка кол-ва символов номера телефона, вы можете сами поправить в конфигураторе.

    Reply
  20. Adoney

    А можно такое же реализовать на платформе 7.7? Не прошу написать обработку, «пните» в нужную сторону.

    Reply
  21. Zircool

    (20) Да конечно, API построено на POST запроса к сервису в нужном формате. Прочитав документацию, Вы сможете понять в каком виде отправлять информацию на сервис Бродкастер, затем парсим ответ и выводим в нужном нам формате. Мне кажется, что трудности могут возникнуть при парсинге ответа, т.к. он выводится в формате JSON

    Reply
  22. maksa2005

    Интересная разработка…стоит внедрить

    Reply
  23. Adoney

    Вы не против если я тут оставлю ссылку на доработанную версию? В доработанной версии: импорт из файла, расчет стоимости, отчет о состоянии звонка, прямые ссылки на сайт (соответственно — регистрация, сведения о тарифах), и т.д. Ваш пример хорош, но нет группового обзвона абонентов. Просто таким образом не будет не связанных публикаций.

    Reply
  24. Zircool

    (23) Конечно не против)

    Reply
  25. Adoney

    Не в упрек автору, он здесь не причем. Обработка отличная. Как пример. НО ВОТ СЕРВИС Бродкастер — глючный ваще (((. Потратил две недели на написание обработок (средствами OLE собираются данные с других ИБ). А когда коснулось отправки — то облом, звонки через раз проходят, так же и смс. Пишет ошибка и все, ни каких пояснений. Служба поддержки не отвечает неделями. Да и вообще не отвечает (((. В общем ребята, если хотите замутить обзвон, пишите обработку для других сервисов с такими же возможностями. А автору еще раз спасибо за пример!!!

    Reply
  26. ra9000

    Внимание изменилось описание API, Тех поддержка отвечает оперативно и от них можно получить скидку на свой проект.

    Если делать все по инструкции, все работает. Мануал берите с оф сайта. Для меня добавили несколько функций.

    Reply
  27. гыук320

    (26) ra9000,

    Для меня добавили несколько функций.

    Если можно по подробнее что за функции!

    Reply
  28. PanKir

    (0) а вот мануал можно было и бесплатно раздавать…

    (23) хм… обещали ссылку на доработанную версию, а что-то даже не видно её…

    (26) что за офф сайт? если тот из 90-х, то там ничего нет… 🙂

    Reply
  29. Zircool

    (28) Мануал нет возможности выложить бесплатно, т.к. согласно правилам ИС, такая возможность предоставляется если публикация коммерческая. API с момента публикации обновилось у сервиса (добавились новые возможности), актуальную версию можете скачать с сайта.

    Документация к последней версии API в приложении.

    Reply
  30. PanKir

    (29) Благодарю за ответ и документацию.

    Нашел я основной их сайт (вполне даже современный, а не из 90-х :)))

    Там и мануалы нашел на Апи.

    Тарифы у них конечно не ахти, но главное это идея, а поставщика найдем 🙂

    Reply

Leave a Comment

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