Использование графического планшета для подписи в 1С




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

39 Comments

  1. kolabaister

    Реализация интересная и изобретательная, но имеет ли такая подпись какую то юридическую силу?

    Reply
  2. Makushimo

    (1) kolabaister,

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

    он имеет юридическую силу?

    Reply
  3. Red_Devil

    (0) В нашем случае ответ в (1) тут чисто формальность, «для галочки» что бы решать споры с сотрудниками) Но электронный ключ можно оформить через юр отдел, он будет иметь юридическую силу. Правда сертификат будет оформлен на компанию а не на сотрудника, но в подписи зашито ФИО сотрудника, на последнем скрине видно.

    Reply
  4. Ober2010

    Интересное решение..

    Я пошел другим путем, когда делал нечто подобное, использовал Wacom-Signature-SDK (2 com объекта из SDK: Florentis.SigCtl и Florentis.DynamicCapture) , формировал обычный табличный документ, его подписывал и сохранял в pdf, pdf прикреплял к документу РКО. SDK позволяет вернуть картинку подписи в формате Base 64, а дальше дело техники.

    Сокращенно как то так :

    
    DC.Capture(SigCtl,Фио,»Распишитесь: «, null, null); // окно захвата подписи
    
    SigObj = SigCtl.Signature;
    СтрокаBAse64 = SigObj.RenderBitmap(«», dimensionX,dimensionY,»image/png», ТолщинаПераММ , 16711680, 16777215, -1, -1, 524288+8192+65536+1048576) ;
    
    ДвоичныеДанные = Base64Значение(СтрокаBAse64);
    
    Новый Картинка(ДвоичныеДанные,Истина);
    
    
    

    Показать

    с батником не додумался ( видать документацию плохо курил)

    P.S. Оборудование Wacom STU 430 .

    Reply
  5. Red_Devil

    (4) у нас Wacom STU 530 думаю разница не велика

    Reply
  6. Ober2010

    (5) у них даже инструкция одна на 430 и 530

    Reply
  7. Diego_Iv

    Прикольная и нужная штука.

    Только в типовой конфигурации любой пользователь может как наприкреплять «своих подписей», так и поудалять или исправить «чужие».

    В результате не получится так : «Я ничего не знаю, я этого не подписывал…» ?

    Reply
  8. Red_Devil

    (7) как настроишь планшет. Он может блокировать PDF от изменения. И как настроишь 1С, по умолчанию это всего лишь прикрепленный файл, дальше как хочешь блокируй.

    Reply
  9. kolabaister

    (2) Makushimo, ни малейшей. И скан тоже, без хранящегося где то оригинала, ничего не стоит. Да, как ответил (3) видимо, только для усиления чувства ответственности сотрудников сделано)

    Reply
  10. perevalsky

    Очень интересное применение. У нас есть готовый продукт для аутентификации по подписи на планшете и мобильных устройствах http://www.signtologin.com/. Предлагаю интегрироваться с вашим решением. Можем предоставить API — функции.

    Reply
  11. Dragonim

    Такая идея с подписями хороша для тёмных сотрудников, которые ни чего про юридическую значимость и возможность электронной подделки не слышали и слышать не хотят. Немного поинтересовавшись можно узнать, юридическая силы такая подпись не имеет, подделывается проще чем реальная подпись.

    Вся эта идея с подписями на электронных устройствах обычная профанация и попытка показаться защищёнными и значимыми в доме из трёх стен.

    Reply
  12. monkbest

    (11) Dragonim, почему не имеет? Смотря как хранить и обрабатывать подписанный документ, можно навернуть криптографию и все будет очень даже

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

    Reply
  13. ne_en

    (12) monkbest, Так в том то и дело, что что бы там не навернули, юридической силы это иметь не будет все равно. В суде всегда можно заявить, что у вас есть техническая возможность обойти эти механизмы, т.к. программист может включать и выключать что угодно, и пере создавать сколько угодно документов с прикреплёнными подписями не зависимо от того, что человек документов этих в глаза никогда не видел. Принятие таких подписей в суде будет возможно только в том случае, если программа будет «сертифицирована» в отношении того, что не возможна подделка в программе подписи никем, а так же установлена надёжная блокировка от внесения изменений в программу и применения внешних программ. А до тех пор, только хранящаяся бумажная копия или свидетели (причём не все свидетели одинаково полезны) постановки этой подписи могут сделать такую подпись легитимной.

    Reply
  14. sviat02

    Я так понимаю что это только для графических планшетов у которых есть какое то апи (SDK) типа Wacom STU 430-530, или я ошибаюсь?

    Reply
  15. Red_Devil

    (14) да я делал на вакоме, как остальные работают не знаю.

    Reply
  16. sviat02

    Автору респект. Реализовал у себя такое решение на УФ, встретился с такой проблемой что сам планшет пробросить в терминал сервер невозможно только через «USB over network» из-за этого есть некие тормоза при захвате именно планшетом для подписи.

    Так же при открытии pdf файла в sihg pro pdf пользователю требуется нажать кнопки «добавить подписи» рис. 1 , потом подтвердить подпись рис. 2, ну а потом сам захват подписи. Подскажите есть ли возможность обойти эти промежуточные действие?

    Reply
  17. sanymust

    Ребят, встала похожая задача, имеется планшет Wacom stu-430, хочу интегрировать в 1С, но я так понял что ПО нужно просить у wacom, либо зарегистрировать продукт, чего сделать для России я не смог плюс я не покупал через сайт, а они просят номер счета указать. Запросил SDK у них, прислали письмо с доп. вопросами что принять решение о предоставлении ПО. Все как-то слишком заморочено я считаю, почему просто нельзя взять и скачать SDK пакет… Кто как заполучил ПО, может я не в ту степь ушел уже?

    Reply
  18. Red_Devil

    (17) Я не скачивал SDK. На сайте Ваком, в открытом доступе есть утилита для работы с планшетом, без всяких регистраций http://gsdt.wacom.eu/download/SignPro-PDF-download-V2.xml

    Reply
  19. sanymust

    (18)Спасибо! Я просто хотел использовать подпись без стороннего софта, напрямую через компоненту получать изображение и внедрять в 1С, поэтому интересно поковырять SDK. ) А на счет Sign Pro, у меня нет кода активации, который идет при покупке. Писал в тех. поддержку сказали нет кода — нет программы, запрашивайте SDK. Чем я и занялся…

    Reply
  20. 1cvoverdzhils

    (4) Расскажите пожалуйста по подробнее, как вы делали.

    Спасибо.

    Reply
  21. RastaL

    Привет, мучаюсь с той же проблемой, не могу скачать stu sdk, Вы добились каких нибудь результатов от wacom?

    Reply
  22. vlad1976

    Так что там с SDK? Где скачать? а то я дурак планшет купил. Некого кода в коробке нет. а Начальство просит что то похожее сделать.

    Reply
  23. Ober2010

    Пришлю поздней. Занят поиском работы.

    Reply
  24. vlad1976

    хорошо бы.

    Reply
  25. swimdog

    (24) Нашли SDK? Я позвонил в wacom еще до покупки, мне прислали ссылки на скачивание SDK и драйверов. Без всяких вопросах.

    Reply
  26. swimdog
    Reply
  27. swimdog

    (24) Еще уточню свой же ответ. После регистрации в разделе developer сайта wacom.com можно скачивать любые SDK и программы к планшетам. Там же можно сформировать временные лицензии для SDK.

    Reply
  28. user1194632

    Я расписывается на XP-Pen Star G430S Digital Drawing Tablet . Графический планшет берет PDF, добавляет в нее подпись и сохраняет PDF

    Reply
  29. Риф

    (23) Могли бы вы оформить свое решение на этом сайте? Я купил бы, потому что самому программировать внешнюю компоненту на С# и сопрягать с 1С займет слишком много времени. Для одного частного образовательного учреждения нужно оформлять всякие ведомости, расписки и т.п. с подписями слушателей. Этих бумаг слишком много, а слушателей еще больше , так что требовать подпись у каждого слушателя просто нереально. И их не требуют. Но руководство этот момент постоянно вызывает зуд беспокойства. Все стороны, как ЧОУ, так и налоговая понимают бессмысленность этого требования, но это мало утешает. В общем, юристы ЧОУ уверяют, что даже картинок с подписью в 1с документах будет достаточно. Очень прошу вас опубликовать ваше решение.

    Reply
  30. user931158

    (28) а где вы апи нашли или сдк для XP-Pen Star ?

    не подскажите

    Reply
  31. user931158

    (26)привет, не подскажешь пожалуйста по этой реализации с графическим планшетом, столкнулся с проблемой что не могу его на сервере использовать, не подскажешь как решал эту проблему через api

    Reply
  32. swimdog

    (31) У нас планшеты стоят на компьютерах пользователей. Мы для этого сервер не используем.

    Поэтому и процедура &НаКлиенте

    Reply
  33. user931158

    (32) так а 1с не серверная?

    Reply
  34. user931158

    (16) привет столкнулся с такой же проблемой что не могу пробросить планшет графический, можешь чуть подробнее рассказать как ты решил проблему с подписью

    Reply
  35. swimdog

    (33) Работает и в серверной, и в файловой. А в чем разница, если форма работает на клиенте?

    И компонента ставится на клиенте.

    Reply
  36. user931158

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

    Reply
  37. swimdog

    (36) Не знаю

    Reply
  38. user931158

    (16) Подскажи пожалуйста, а не сталкивался ты с проблемой, когда прокидываем порт USB через «USB over network», не получаем обратно саму подпись с устройства. Ты же сталкивался с настройкой, помоги пожалуйста. Готов даже заплатить за консультацию. Просто проект уже нужно сдать, а столкнулся с такой проблемой, что не возвращается сама подпись в sign pro

    Reply
  39. user931158

    (16)Парни, есть планшет, Wacom-STU500B на локальном компьютере с Windows 7 на борту и терминальный сервер на Win2008R2. Нужно его (планшет) каким-то чудом мапить в терминалку. Как я понял, мапить нужно не только USB, но и HID. С USB проблем нет. Устройство видно и на него даже передаются данные с терминального сервера, но то, что рисуется на планшете подключенному к локальному компу, на терминальном не отображается. Как я понимаю как раз HID и не хватает? как можно решить эту проблему?

    Reply

Leave a Comment

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