Подключение к 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='\

45 Comments

  1. AngelVIII

    Прикольно, конечно!

    только бы придумать, как это применить…

    Reply
  2. Жолтокнижниг

    Ардуин добрался до 1с, точнее 1с до него)))

    Reply
  3. flyer

    надо взять на заметку. хорошая идея

    Reply
  4. Atori-kun

    В голове родилась мысль навесить ардуинку на ДО для оповещения о поступившей задаче. Чую кто то мне ближайшие выходные испортил…

    Reply
  5. TODD22

    (4) Atori-kun,

    ДО

    Это что?

    Reply
  6. Atori-kun

    (5) TODD22, Сори, по привычке написал. ДО — Документооборот

    Reply
  7. TODD22

    (6) Atori-kun, Для этих целей люди прикручивают всякие WhatsApp и итд.

    Reply
  8. q_i

    Занятно ))

    Есть только одно замечание:

    s[i]=Serial.read(); // Записываем их в S, в нашем случае команда занимает 1 символ, 2-й перенос строки, 3 — на всякий случай))

    Символы.ПС занимает 2 байта (0xOD 0x0A), поэтому не на «всякий случай», а как раз чтобы вся строка поместилась в буфер (если бы буфер был объявлен как s[2], то вместо следующей команды Вам приходило бы «0x0A <код-следующей-команды>»). Да и вообще — а нужен ли этот перевод строки? Его наличие в Вашем коде нигде не проверятся и не обрабатывается. Может его вообще убрать? Пусть будет просто «char cmd = 0»; Прочитал однобайтовую команду («cmd = Serial.read()») и сразу выполнил («if (cmd == ‘1’) …»; кстати, имхо тут был бы уместен switch/case, но это уже дело вкуса).

    Reply
  9. Simon14

    Только недавно с ардуинкой баловался не думал что можно с 1 с связать. но на практике что полезного в этом пока не приодит на ум

    Reply
  10. TODD22

    (9) Simon14, Можно например с каким нибудь производственным оборудованием связать. Но профита маловато. Так если только побаловаться.

    Reply
  11. GusevNA

    Спасибо за пост, давно хотел поковыряться с Ардуино, а тут уже код для 1С готов.

    Reply
  12. uriy

    Статейка понравилась, И даже есть с десяток идей где можно это применить.

    Reply
  13. sasha777666

    (8) q_i, В начале у меня и было без него, однако происходили зависания на стороне 1с, после добавления ПС проблема исчезла, в чём причина разбираться не стал.

    Reply
  14. eugeniezheludkov

    все портит внешняя компонента.

    кстати, а что если учесть (статистику) настройки большинства портов в винде по умолчанию, в коде ардуинки сразу это учесть «Serial.begin(115200);»

    и попытаться работать без внешней компоненты? ардуинка дома, 1с на работе , думаю завтра это дело и проверю если не забуду 🙂

    Reply
  15. sasha777666

    (14) eugeniezheludkov, Соединение через юсб интерфейс само по себе является недостатком из-за необходимости наличия компьютера в радиусе 5 метров, на ардуине можно поднять веб сервер и подключаться по хттп через сеть. При этом не используя внешние компоненты, думаю на выходных начну статью про такой способ связи.

    Reply
  16. Atori-kun

    (7) TODD22, Ну такие месенжеры внешним оборудованием управлять не смогут, а вот какую нибудь игрушку на данном примере замутить можно. Но это действительно пока только поиграться — реальных (нужных) для себя вещей пока не придумал.

    Reply
  17. Atori-kun

    (15) Ждем с нетерпением)

    Reply
  18. eugeniezheludkov

    (16) Atori-kun, у мня как то была задача сделать на каждое рабочее место две хардовые кнопки («нравится обслуживание»/»не нравится») там правда заказчик заранее купил usb-gpio девайс с 30 gpio поэтому пришлось один из компьютеров запустить в роли сервиса с него тянется паутина проводов к кнопкам, на компе работает программа на C++ которая в 1С отсылает данные через WebService, дурняк короче , дешевле было отдельными девайсами теми же ардуинками или esp8266 (по 1$ за штуку при покупке оптом и провода не нужны их в сеть wifi загоняешь и на батарейках)

    Reply
  19. revned

    Интересно! Честно говоря, даже и не думал, что можно к 1С ардуино подключать. А оказывается ничего сложного и нет.

    Reply
  20. Rokstedi

    Хорошая идея! Когда то игрался с attiny и 1с. Для мигания лампочкой такого наворотил, писал внешнюю компоненту, которая читает из порта… мда. Оказывается все намного проще. Спасибо, добавлю в закладки.

    Reply
  21. BlinOFF

    (1) AngelVIII,

    Бить током бухов, если что-то неправильно делают )))

    Reply
  22. Serg3141

    А если для работы с сом-портом использовать, к примеру, http://x-romix.narod.ru/vk_rs232_hex.zip, не будет ли проще? С помощью этой компоненты вполне нормально можно с последовательным портом работать.

    Reply
  23. Starky

    Интересно! Я как-то подключал к 1с GPS приемник-логгер с USB интерфейсом. Читал в 1с поток текущих данных, парсил и показывал на карте текущее местоположение. Бухи сидящие со мной в одном кабинете смотрели на меня очень удивленно ))).

    Но идея с веб обработчиком и хттп на ардуино, более удобна в плане ухода от лишних проводов.

    Reply
  24. SGordon1

    драйвер CH341SER.EXE — от дешевого китайского клона ардуины. Если у вас настоящий аппарат то драйвера там соответсвенно другие … А в новых версиях платформы 1с нет функций , способных читать из COM как из файла?

    Reply
  25. 13jaguar

    Спасибо, это интересно. А еще интереснее работа с Arduino (или в моем случае с Cubieboard2) через порт Ethernet.

    Reply
  26. karapuzzzz

    Последовательный порт вообще очень универсальная вещь. Все, что использует его можно прикрутить к 1С. И будь-то ардуинка или станок ЧПУ уже не важно. Все дело в прослойке между COM и 1С. Я для таких проектов использую шаблон на C# для внешних компонет и логику работы прописываю там.

    Вот пример:

    Библиотека классов для создания внешней компоненты 1С на C#

    Reply
  27. claymen

    Управляйте лифтами, атомными станциями и самолетами!!! =))))))

    Ардуино это с ребенком собирать робота… с напряжением не больее 12 вольт.

    Господа!!! Не морочьте людям голову…

    Разработка на ардуино устройства которое не залипнет не зависнет выйдет в разы дороже готовых промышленных решений.

    Хотите Из 1С свет включать во всем задании, или еше чего Вот модуль с Реле на выход , где ничего не залипнет и не устроит пожар на объекте

    http://insat.ru/prices/info.php?pid=5619

    Уже с Ethernet и работает как через WEB так и по стандартизированному протоколу Modbus. Разбираться в нем 1-2 часа от силы…

    И таких решений уже очень много все придумано!

    Ценник сопоставимый…

    А цена самоделки может стоить пожара или жизней …

    Reply
  28. claymen

    ошибся ссылкой тот Без Ethernet

    Вот он http://insat.ru/prices/info.php?pid=5902

    Reply
  29. sasha777666

    (27) claymen, и сколько тебе известно случаев пожара из-за ардуины? По поводу надёжности у неё конечно не всё хорошо, но не настолько, чтобы устроить пожар… и да сторожевой таймер перезагрузит контроллер через 8 секунд в случае зависания.

    пс. там 5 вольт, а не 12.

    Reply
  30. sasha777666

    (24) SGordon1, Я всё делал в 8.3. Да ты прав у меня дешёвая китайская подделка… стоп ардуина свободная платформа у неё не может быть подделок 🙂 Контроллеры я заказываю с таобао самые дешёвые, сетевые шилды попадались бракованные, сами ардуины пока, что все работают

    Reply
  31. pavel_pss

    Спасибо классная идея. Надо будет сделать вход начальника в его кабинет только после перечисления ЗП 🙂

    Reply
  32. claymen

    (29) Пожары не считал, выгоревшей техники класса LowCost видел много от бытовых автоматов до Сложного сетевого оборудования. И попадания молнии и чего тока не видел…

    Ардуино это игрушка! и Все компоненты для нее игрушечные, и все соединения….

    Вот вы думаете релюшка чего там сложно, тока поговорите с теми кто их эксплуатирует сколько нюансов, и то что они греются и пригорают и залипают, в ардуино модулях стоят не самые лучшие образцы… Потому как задача одна цена!

    Всё просто пока не попробуете.

    Reply
  33. sasha777666

    (32) claymen, пробовал и много, вы видимо по цене судите качестве? подучите немного китайский и вперёд на таобао (сайт внутреннего катайскийого рынка), где быстро убедитесь, что высокая цена это лишь наценка жадных перекупщиков… Вопрос на засыпку, почему по популярности дуина на несколько порядков в переди? … я верю в естественный отбор, ведь более худшая продукция не может вытеснить с рынка более лучшую, даже если стои дешевле

    Reply
  34. Atori-kun

    (21) BlinOFF, либо тока не хватит, либо через 2 -3 цикла у них иммунитет выработается… Хотя в заметки поставил)

    Reply
  35. SGordon1

    (30) Т.е. если вместо вот такой ардуины http://arduino.cc/en/uploads/Main/ArduinoNano30Schematic.pdf тебе выдадут какой нить интел , скажут поставь наш соффт и оно на blink.ino замигает светодиодами то это не будет подделкой? А в чем тогда смысл копирайта на схему? Делай свое что хочешь, только не подписывайся нашим названием…

    Reply
  36. SGordon1

    (25) 13jaguar, А какие проблемы с интернетом, вроде полно как стандартных возможностей так и com компонент …

    Reply
  37. sasha777666

    (35) SGordon1, Ардуина открытая платформа, слово подделка к ней неуместна, мой китайский аналог работает точно так же, только загрузчик другой, поэтому драйвер и выложил, для контроллера со стандартным загрузчиком драйвера установятся вместе со студией.

    Reply
  38. sasha777666
  39. shard

    В свое время была шутка что к коробочной версии девятой 1С будут прилагаться два usb-манипулятора для чесания пяток бухгалтеру. В каждой шутке есть доля шутки…

    Reply
  40. nikulin76

    Немного знаком с ардуинкой. И все бы хорошо, НО.

    Вот никогда не соглашусь, что 1с должна общаться с ардунькой.

    Логично было бы наладить онлайн обмен и накопление информации какой либо резидентной программы в любое хранилище.

    а уже 1с периодически общалось бы уже с хранилищем.

    Может my-SQL или что либо еще.

    Вот это было бы уже взрослое решение.

    Reply
  41. starik-2005

    В принципе, в Linux нет проблем с инициализацией порта, что крайне радует. Почему-то идея что-то толкать в ардуинку посредством сервера 1С не приходила мне в голову, т.к. есть PHP, Python, bash, sh, + CRONTAB… — мульон всего, но, с другой стороны, в принципе идея имеет право на существование.

    Сегодня поэкспериментирую.

    Reply
  42. BIK_IT

    При запуске обработки появляется сообщение Не определен тип: AddIn.ATOL_KKM_1C82. Почему-то процедура ПодключитьВнешнююКомпоненту возвращает ЛОЖЬ… Кто знает?

    Reply
  43. sasha777666

    (42) BIK_IT, Проверь, что внешняя компонента есть в макете в виде двоичных данных

    Reply
  44. AngelVIII

    прошло уже полгода. Есть какие-то действующие реализованные идеи?

    Reply
  45. sasha777666

    (44) AngelVIII, У меня только возможность открывать замок на входной двери…. не было пока задач где можно было бы использовать это

    Reply

Leave a Comment

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