Рисуем и распознаем нарисованное при помощи нейросети




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

27 Comments

  1. YanTsys

    1. Библиотека бесплатная?

    2. Внешние ресурсы использует или работает локально?

    Reply
  2. DO_WHILE_LOOP

    (1) 1.Бесплатная, поддерживается сообществом, можно внести свой вклад в ее развитие https://github.com/BrainJS/brain.js/blob/master/CONTRIBUTING.md

    2.Работает без подключения к интернет.

    Reply
  3. DO_WHILE_LOOP

    (2) пытаемся продвигать таким образом 1С на глобальный рынок, публикации отлично индексируются поисковиками :-).

    Reply
  4. YanTsys

    (2) Steelvan сам ты как не русский, вот из этого:

    «… Код обработки открыт, дополнительно устанавливать ничего не нужно, все присутствует в обработке. … »

    нет никаких гарантий что следует вот это


    бесплатная, работает локально

    так как

    1. «открытый» код бывает платным

    2. если «ничего не нужно устанавливать» это не значит что не используются веб-сервисы

    3. «все присутствует в обработке» — ну не может там присутствовать ВООБЩЕ ВСЕ 🙂 так что фраза многообещающая но не гарантирующая

    Reply
  5. YanTsys

    (3) Спасибо огромное 🙂

    Reply
  6. Steelvan

    (5) Продвигать на мировой рынок с какой целью ?

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

    Reply
  7. hotey

    Просто интересно, у этой разработки есть сценарии практического применения в области учета?

    Или просто упражнения с нейросетями?

    Reply
  8. kadild

    (9) Обычная оболочка для библиотеки BrainJS/brain.js

    1Совского тут можно сказать ничего и нету

    Reply
  9. milkers

    (9) Мне кажется можно применить в области визуальных редакторов. Например человек рисует мышкой элемент блок схемы криво и косо.

    А редактор подставляет нужный из библиотеки.

    Reply
  10. DoctorRoza

    (9) Очень даже область применения огромная, при должном дальнейшем развитии! Наработку можно использовать для распозновании первичных документов, их содержимого. Это ускорит ввод данных, если у вас большая текучка документов, либо документы с большим набором данных. Вот тут распознование облегчит работу бухгалтеру.

    Reply
  11. ArchLord42

    (12) именно эта «наработка» для такой задачи вообще НЕ годится.

    Reply
  12. user1062846

    Скиньте плиз файлик на почту кто уже скачал f1842408(собака)nwytg.net

    Reply
  13. Solikamsk

    (15) нет такого адреса

    Reply
  14. shard

    (13) почему же? какая тогда годится? finereader не предлагать

    Reply
  15. ArchLord42

    (17)

    finereader?))))))))))))))))) Вы, видимо, не видите разницы между распознанием ТЕКСТА и распознанием ДОКУМЕНТА с его структурой.

    Да даже распознание текста на голом 1С, то еще извращение, ключевое слово «медленно, очень медленно», начиная от разработки, заканчивая производительностью

    Проще взять tesseract и через команду системы прикрепить к 1С и то толку больше будет, да и на семью время останется)

    Раз уж вспомнили продукт Abby, то можно юзать Flexi Capture, правда стоит он мягко говоря дорого.

    Я более скажу 1С для ML вообще не как не годится (пока нету спец. API), может какие простые модели с неочень большими объемами данных, еще можно делать, но не более, опять же проще взять python + keras tensorflow, там порог вхождения, первые 2 курса по вышке, а то и меньше.

    Reply
  16. shard

    (18) в случае если известен вид загружаемого документа (например ТОРГ-12), то вопрос структуры не особо важен.

    Reply
  17. ArchLord42

    (19) Конечно не важен этож как 2 пальца об…, вон таблица в вашей Торг12 рапознается просто идеально, при условии, что использовалась более менее нормально обученная модель на доках и норм сканер и будет что-то типа:

    Номер по порядку наименование характеристика…..артикул товара код товар…и тд

    1 2 3 4 5 6 7 8

    1Колесо Мазда3 белое R15 шт 4 1 1 90O0 ….

    2Краска белая Î2 кг 0.5 1 I O.6 1000 ….

    Тут даже спорить неочем, просто попробуйте, много интересного для себя откроете)

    Reply
  18. shard

    (20) уже попробовал и открыл =) с февраля самых противных (по количеству ручного ввода) поставщиков запустили, жалоб не было. Использовал pdftotext, на выходе примерно такое и получается (часто кстати один товар на 2-4 строки растягивается). Разобрать — реально. Масштабировать на торг12 других поставщиков — тоже реально. Но не все контрагенты шлют нормальные пдф, бывают просто сканы — тогда ой.

    Reply
  19. 🅵🅾️🆇

    Как понимаю, в данной публикации вы просто используете api.

    Это не спортивно.

    Нативное решение было бы гораздо интереснее.

    Reply
  20. 🅵🅾️🆇

    (18)

    FineReader это если у вас денег много (или воровать можете)

    Я бы попробовал начать с Google Vision)

    Reply
  21. 🅵🅾️🆇

    (21) Такое решение годится только если pdf не представляет собой картинку. Ну и естественно со сканером не подружите.

    У меня в ближайших планах подружить 1с’ку с Google Vision (бесплатно для относительно небольшого числа документов в месяц), а также попробовать сделать это через камеру мобильного телефона для ввода первички.

    Идея довольно оригинальная:

    камера принимает массив данных кое как распознаных на лету с помощью библиотеки (в моем случае flutter vision), из полученного массива данных находим числа — проверяем ИНН ли они (по последним двум цифрам).

    Если ИНН, проверяем оно принадлежит нашей организации, если да — нашли организацию, если нет — контрагенту, нашли контрагента. И тп и тд)

    Reply
  22. shard

    (24) если только числа, то будет проблема как в торг12 определить что это за число: номер колонки или количество. Буквы тоже нужны…

    Reply
  23. 🅵🅾️🆇

    (25) с этим буду разбираться, алгоритм выше написал для определения организации и контрагента.

    Reply
  24. taishy

    Слабо такое же полностью на встроенном языке 1С реализовать?

    Reply
  25. informa1555

    (27) Не слабо https://infostart.ru/public/200922/ но работает медленно как выше уже писали. Проще утилизировать существующие api.

    Reply
  26. informa1555

    (9) Еще как есть — идентификация там, где штрих коды или rfid не применяются. Например в связи с обязательной маркировкой пиломатериалов — распознавание спилов дерева (они как отпечатки пальцев — уникальны). Есть интересная статья на хабре по этому поводу

    Reply

Leave a Comment

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