Сканер штрих-кода для работы по сети (терминальных сессиях)




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

30 Comments

  1. Идея очень хорошая, у меня это реализовано давно и работает около 2х лет, но вот теперь я написал другую програму, где отсутствует принимающий сервер!!!, т.е. на сервере терминалов не запускается серверная часть программы.

    Смысл такой:

    Железо (касса/сканер/дисплей покупателей)<->Драйвер для железа, он же и сервер TCP торгового оборудования<->внешня библиотека для 1С, она же клиент TCP <-> 1C

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

    +: при падении одного червера ТСР, все остальное работает.

    +: нет необходимости постоянно в памяти сервера терминалов держать запущенный сервер ТСР и следить за его работой.

    +: Пользователи сами запускают(вручную или автоматом) сервера ТСР

    +: Быстрая смена серверов ТСР у клиентов. т.е. если 5 1С работают с одним сканером, потом одной из 1С необходимо работать с другим сканером, то в этой 1С просто меняется номер ТСР порта для под нужный сканер(сервер)

    -: самый главный минус в том что, сколько в терминале работает клиентов, у которых есть торг. оборудование, столько и должно быть запущено серверов ТСР и столько же должно быть открыто портов ТСР на сервере.

    -: сложно собирать логи с серверов ТСР, т.к. должен быть клиент, который принимает сигналы со всех серверов.

    Reply
  2. slavapil

    Ответ: НовенькийЯ.

    Сервером у меня называется внешняя компонента, так как она создает именованный канал.

    «+: при падении одного сервера ТСР, все остальное работает.» — аналогично.

    «+: нет необходимости постоянно в памяти сервера терминалов держать запущенный сервер ТСР и следить за его работой.» — аналогично.

    «+: Пользователи сами запускают(вручную или автоматом) сервера ТСР» — аналогично («запускают клиентов»).

    «+: Быстрая смена серверов ТСР у клиентов. т.е. если 5 1С работают с одним сканером, потом одной из 1С необходимо работать с другим сканером, то в этой 1С просто меняется номер ТСР порта для под нужный сканер(сервер)» — аналогично (меняют ун. имя).

    «-: самый главный минус в том что, сколько в терминале работает клиентов, у которых есть торг. оборудование, столько и должно быть запущено серверов ТСР и столько же должно быть открыто портов ТСР на сервере.» — используя именованные каналы открывать ТСР порты на сервере не надо, зато надо задавать уникальное имя канала.

    Reply
  3. Что то я не совсем понял. У тебя висит один клиент на одном сканере ШК, он же отсылает, считанный с этого сканера код в 1С, с таким же ун.именем как и в клиенте.

    т.е. общение идет такого вида

    сканер ШК ->1C

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

    У моей программы принцип совсем другой:

    С одним торг. оборудованием(касса, дисплей, сканер шк) могут работать одновременно несколько 1С.

    т.е. стоит 5 терминальных машин, стоят на расстоянии в нескольких сантиметров друг от друга, зачем тратиться на 5 сканеров, когда можно пользоваться одним. Вот мои 5 1С и пользуются одним сканером, а какя именно 1С должна получить считанные со сканера данные, еэто регулируется персональными штрих кодами сотрудников…

    минусы к твоей программе(я надеюсь это не страшно то что я на ТЫ):

    1) не стоит показывать считанный штрих код пользователю в целях безопасности. Оставь эту функцию только администратору.

    2) Убери кнопку «Отправить», иначе будут отправлять все подряд. Оставь только администратору.

    3) настройку хоста и ун. имени должен производить администратор, а не пользователь.

    4) сделай административные функции, закрытые паролем.

    5) По поводу сохранения параметров в ini, помоемому лучше бы их сохранять в реестре

    Все минусы касаются только безопасности, на больших предприятиях это акутуальная тема.

    Reply
  4. slavapil

    «Все минусы касаются только безопасности» — спасибо за минусы.

    Смысл в том что примапить можно только в W2003 или Citrix, в W2000 перенаправления СOM нет.

    1) Оператор сканит ШК товара и видит его, может удостоверится что он считан правильно.

    Окошко ввода можно использовать для считывания со сканера в разрыв Клавы либо ручками или вообще для кодовых слов Админа. ОбработкаВнешнегоСобытия(Источник=«PVRscan»,Событие=«BarCodeValue»,Данные=«Данные»).

    2) Кнопка «Отправить» для того и сделана, чтобы отправлять все, что душе угодно.

    5) Можно, но не Все любят когда прога лезет в реестр и мусорит в нем. Uninstall НЕТ 🙂

    Продукт не коммерческий, но если будет много желающих использовать прогу с поддержкой безопасности то можно доработать.

    Reply
  5. jdo

    Огромное спасибо автору. Очень полезная прога

    Reply
  6. tatarinet

    А можешь реализовать подобное только для терминалов сбора данных? Нужно вледствие того что загрузка данных с 1С в ТСД в терминальной сессии происходит очень медленно ….

    На ТСД стоит Atol Mobile Logistic.

    Reply
  7. slavapil

    В программировании можно все, если знать как!

    С ТСД не работал (под WM и Win CE не писал).

    Возможно, по быстродействию «Atol Mobile Logistic» следует обратиться к разработчику?

    Reply
  8. idw

    Я так понял, что программа работает только тогда, если сначала на сервере загрузить компонентуPVRscan.dll, а только после этого запустить TermScan.exe. Или нет?

    Reply
  9. idw

    Всё разобрался, надо регить компоненту на сервере под правами админа сервера.

    Reply
  10. slavapil

    PVRscan.dll созает канал,TermScan.exe при посылке данных ищет канал, если его нет то просто не пошлет. Как только запустится PVRscan.dll, TermScan.exe сможет послать данные.

    TermScan.exe можно запускать когда угодно, но без сервера он не сможет отправить данные.

    Reply
  11. VitGun

    А нафига огород городить, когда можно просто смапить порт?

    Reply
  12. slavapil

    VitGun прочти 4 пост 🙂

    958 скачиваний говорит о том что надо комуто 🙂

    Скоро выложу c передачей по TCP/IP.

    Reply
  13. andreynsk

    Народ я в шоке! Маппинг портов не работает в Windows 2003 Server SP2.

    Я пробовал все что можно.Если интересно кому нить могу рассказать.

    Reply
  14. andreynsk

    а PVRScan не работает в 1Сv8

    Reply
  15. andreynsk

    Жутко извиняюсь за ниженаписанное. TermScan работает в 1Cv8. Проверено лично мной. Допетрил что и как )

    Reply
  16. Air777

    А какой порт использует компонента? Хочу сделать удаленное подключение через фаерволл.

    Спасибо

    Reply
  17. slavapil

    Сейчас используется «NamedPipe», вроде только для внутр. сети подойдет.

    Вам нужно для TCP/IP, скорее всего (планируется) в ближайшем будущем появится 😉

    Reply
  18. slavapil

    Поумайте, как вы видите работу сервера и клиента через TCP/IP?

    Что вам еще нужно в этой разработке?

    Reply
  19. PaRaDoX

    Молодец! Очень помогло!+

    Reply
  20. alf_krsk

    Все было прекрасно пока настраивал, очень обрадовался, но как только до работы дошло получается такая вещь : у одного клиента первый штрихкод считывает нормально,

    а перед остальными вставляет символ «|» , в клиентской части закрываешь порт потом открываешь первый сканирует нормально, а потом опять. Сканер Metrologic 9520.

    У другого клиента еще интереснее периодически перед штрихкодом появляется мусор уже их 3-х символов, отключаешся от сервера терминалов, подключаешся и все нормально, никаких

    настроек не меняешь, сканер cipher. Сервер Win2003SP2. ????? ПОМОГИТЕ плз, от чего это может быть!!!

    Reply
  21. slavapil

    (20)

    ??????????

    Может поможет новая версия через TCP/IP !!!!!

    Скоро появится, пока проходит тестирование 😉

    Могу выслать бету на mail,

    заявку на slavapil@yandex.ru

    Reply
  22. slavapil

    Можете тестировать 😉

    PVRTERMSCAN (TCP/IP) бета

    Reply
  23. Душелов

    Долго тестировалась 😉

    Reply
  24. slavapil

    (23) 😉

    Интересно было сколько писем будет 🙂

    Reply
  25. Душелов

    (24) И как? 😉

    Reply
  26. slavapil

    (25)

    Вего 10 🙂

    Большинство устроил старый вариант 😉

    Reply
  27. Water_Mihey

    При использовании старого варианта на платформе 1С 8.0, при закрытии 1С выдается ошибка «Инструкция по адресу «0х00000000» обратилась к памяти по адресу «0х00000000″. Память не может быть read». и не сохраняется ун. имя и флажок «Компонента включена», т.е. приходиться устанавливать флажок и ун.имя при каждом запуске 1С. Так же не сохраняются настройки другого торгового оборудования подключенного на этом компьютере (наверное потому что 1С некорректно завершает работу). Если PVRscan.dll не загружаешь то ошибки нет.

    Подскажите пожалуйста в чем причина?

    p.s. В остальном все работает нормально.

    Reply
  28. slavapil

    (27)

    В «PVRTERMSCAN (TCP/IP) бета» таже ошибка?

    Reply
  29. Water_Mihey

    Да, попробывал, 2-й вариант, ошибка такая же. Судя по всему она возникает при выгрузке dll, наверное… Пробывал на нескольких компах, ошибка аналогичная.

    Reply
  30. khr3b

    попробовал на 1С вер. 7.70.027, конф. ТиС 7.70.956

    PVRscan.dll версия 1.0.0.6, закинул в папку с БД, зарегал в системе.

    В настройках ТО настроил все, как и показано на картинках в архиве.

    После первого запуска 1С зависла наглухо. Со второй попытки выдало ошибку:

    «PVRscan : Уже запущена

    Сканер штрих-кода: ошибка при подключении»

    При этом галочка «Сканер ШК включен» пропадает.

    кто что посоветует?

    Reply

Leave a Comment

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