<?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='\
Идея очень хорошая, у меня это реализовано давно и работает около 2х лет, но вот теперь я написал другую програму, где отсутствует принимающий сервер!!!, т.е. на сервере терминалов не запускается серверная часть программы.
Смысл такой:
Железо (касса/сканер/дисплей покупателей)<->Драйвер для железа, он же и сервер TCP торгового оборудования<->внешня библиотека для 1С, она же клиент TCP <-> 1C
т.е., может быть несколько серверов, точнее сколько машин с торговым оборудованием столько и серверов.
+: при падении одного червера ТСР, все остальное работает.
+: нет необходимости постоянно в памяти сервера терминалов держать запущенный сервер ТСР и следить за его работой.
+: Пользователи сами запускают(вручную или автоматом) сервера ТСР
+: Быстрая смена серверов ТСР у клиентов. т.е. если 5 1С работают с одним сканером, потом одной из 1С необходимо работать с другим сканером, то в этой 1С просто меняется номер ТСР порта для под нужный сканер(сервер)
-: самый главный минус в том что, сколько в терминале работает клиентов, у которых есть торг. оборудование, столько и должно быть запущено серверов ТСР и столько же должно быть открыто портов ТСР на сервере.
-: сложно собирать логи с серверов ТСР, т.к. должен быть клиент, который принимает сигналы со всех серверов.
Ответ: НовенькийЯ.
Сервером у меня называется внешняя компонента, так как она создает именованный канал.
«+: при падении одного сервера ТСР, все остальное работает.» — аналогично.
«+: нет необходимости постоянно в памяти сервера терминалов держать запущенный сервер ТСР и следить за его работой.» — аналогично.
«+: Пользователи сами запускают(вручную или автоматом) сервера ТСР» — аналогично («запускают клиентов»).
«+: Быстрая смена серверов ТСР у клиентов. т.е. если 5 1С работают с одним сканером, потом одной из 1С необходимо работать с другим сканером, то в этой 1С просто меняется номер ТСР порта для под нужный сканер(сервер)» — аналогично (меняют ун. имя).
«-: самый главный минус в том что, сколько в терминале работает клиентов, у которых есть торг. оборудование, столько и должно быть запущено серверов ТСР и столько же должно быть открыто портов ТСР на сервере.» — используя именованные каналы открывать ТСР порты на сервере не надо, зато надо задавать уникальное имя канала.
Что то я не совсем понял. У тебя висит один клиент на одном сканере ШК, он же отсылает, считанный с этого сканера код в 1С, с таким же ун.именем как и в клиенте.
т.е. общение идет такого вида
сканер ШК ->1C
В чем тогда смысл твоей программы? у меня клиенты работают на терминальных станциях, если к этой терм. станции прицеплен сканер, то к нему можно прицепиться любым доступным(стандартным) способом, предварительно примапив нужный порт. Зачем при этом нагружать еще и сокеты, посылать этот штрих код по сетке???
У моей программы принцип совсем другой:
С одним торг. оборудованием(касса, дисплей, сканер шк) могут работать одновременно несколько 1С.
т.е. стоит 5 терминальных машин, стоят на расстоянии в нескольких сантиметров друг от друга, зачем тратиться на 5 сканеров, когда можно пользоваться одним. Вот мои 5 1С и пользуются одним сканером, а какя именно 1С должна получить считанные со сканера данные, еэто регулируется персональными штрих кодами сотрудников…
минусы к твоей программе(я надеюсь это не страшно то что я на ТЫ):
1) не стоит показывать считанный штрих код пользователю в целях безопасности. Оставь эту функцию только администратору.
2) Убери кнопку «Отправить», иначе будут отправлять все подряд. Оставь только администратору.
3) настройку хоста и ун. имени должен производить администратор, а не пользователь.
4) сделай административные функции, закрытые паролем.
5) По поводу сохранения параметров в ini, помоемому лучше бы их сохранять в реестре
Все минусы касаются только безопасности, на больших предприятиях это акутуальная тема.
«Все минусы касаются только безопасности» — спасибо за минусы.
Смысл в том что примапить можно только в W2003 или Citrix, в W2000 перенаправления СOM нет.
1) Оператор сканит ШК товара и видит его, может удостоверится что он считан правильно.
Окошко ввода можно использовать для считывания со сканера в разрыв Клавы либо ручками или вообще для кодовых слов Админа. ОбработкаВнешнегоСобытия(Источник=«PVRscan»,Событие=«BarCodeValue»,Данные=«Данные»).
2) Кнопка «Отправить» для того и сделана, чтобы отправлять все, что душе угодно.
5) Можно, но не Все любят когда прога лезет в реестр и мусорит в нем. Uninstall НЕТ 🙂
Продукт не коммерческий, но если будет много желающих использовать прогу с поддержкой безопасности то можно доработать.
Огромное спасибо автору. Очень полезная прога
А можешь реализовать подобное только для терминалов сбора данных? Нужно вледствие того что загрузка данных с 1С в ТСД в терминальной сессии происходит очень медленно ….
На ТСД стоит Atol Mobile Logistic.
В программировании можно все, если знать как!
С ТСД не работал (под WM и Win CE не писал).
Возможно, по быстродействию «Atol Mobile Logistic» следует обратиться к разработчику?
Я так понял, что программа работает только тогда, если сначала на сервере загрузить компонентуPVRscan.dll, а только после этого запустить TermScan.exe. Или нет?
Всё разобрался, надо регить компоненту на сервере под правами админа сервера.
PVRscan.dll созает канал,TermScan.exe при посылке данных ищет канал, если его нет то просто не пошлет. Как только запустится PVRscan.dll, TermScan.exe сможет послать данные.
TermScan.exe можно запускать когда угодно, но без сервера он не сможет отправить данные.
А нафига огород городить, когда можно просто смапить порт?
VitGun прочти 4 пост 🙂
958 скачиваний говорит о том что надо комуто 🙂
Скоро выложу c передачей по TCP/IP.
Народ я в шоке! Маппинг портов не работает в Windows 2003 Server SP2.
Я пробовал все что можно.Если интересно кому нить могу рассказать.
а PVRScan не работает в 1Сv8
Жутко извиняюсь за ниженаписанное. TermScan работает в 1Cv8. Проверено лично мной. Допетрил что и как )
А какой порт использует компонента? Хочу сделать удаленное подключение через фаерволл.
Спасибо
Сейчас используется «NamedPipe», вроде только для внутр. сети подойдет.
Вам нужно для TCP/IP, скорее всего (планируется) в ближайшем будущем появится 😉
Поумайте, как вы видите работу сервера и клиента через TCP/IP?
Что вам еще нужно в этой разработке?
Молодец! Очень помогло!+
Все было прекрасно пока настраивал, очень обрадовался, но как только до работы дошло получается такая вещь : у одного клиента первый штрихкод считывает нормально,
а перед остальными вставляет символ «|» , в клиентской части закрываешь порт потом открываешь первый сканирует нормально, а потом опять. Сканер Metrologic 9520.
У другого клиента еще интереснее периодически перед штрихкодом появляется мусор уже их 3-х символов, отключаешся от сервера терминалов, подключаешся и все нормально, никаких
настроек не меняешь, сканер cipher. Сервер Win2003SP2. ????? ПОМОГИТЕ плз, от чего это может быть!!!
(20)
??????????
Может поможет новая версия через TCP/IP !!!!!
Скоро появится, пока проходит тестирование 😉
Могу выслать бету на mail,
заявку на slavapil@yandex.ru
Можете тестировать 😉
PVRTERMSCAN (TCP/IP) бета
Долго тестировалась 😉
(23) 😉
Интересно было сколько писем будет 🙂
(24) И как? 😉
(25)
Вего 10 🙂
Большинство устроил старый вариант 😉
При использовании старого варианта на платформе 1С 8.0, при закрытии 1С выдается ошибка «Инструкция по адресу «0х00000000» обратилась к памяти по адресу «0х00000000″. Память не может быть read». и не сохраняется ун. имя и флажок «Компонента включена», т.е. приходиться устанавливать флажок и ун.имя при каждом запуске 1С. Так же не сохраняются настройки другого торгового оборудования подключенного на этом компьютере (наверное потому что 1С некорректно завершает работу). Если PVRscan.dll не загружаешь то ошибки нет.
Подскажите пожалуйста в чем причина?
p.s. В остальном все работает нормально.
(27)
В «PVRTERMSCAN (TCP/IP) бета» таже ошибка?
Да, попробывал, 2-й вариант, ошибка такая же. Судя по всему она возникает при выгрузке dll, наверное… Пробывал на нескольких компах, ошибка аналогичная.
попробовал на 1С вер. 7.70.027, конф. ТиС 7.70.956
PVRscan.dll версия 1.0.0.6, закинул в папку с БД, зарегал в системе.
В настройках ТО настроил все, как и показано на картинках в архиве.
После первого запуска 1С зависла наглухо. Со второй попытки выдало ошибку:
«PVRscan : Уже запущена
Сканер штрих-кода: ошибка при подключении»
При этом галочка «Сканер ШК включен» пропадает.
кто что посоветует?