Распознавание рукописного ввода с использованием нейронных сетей (написано на языке 1С).Light version.




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

53 Comments

  1. Serj1C

    Где взять Новый COMОбъект(«GFLAx.GFLAx«) ?

    Reply ↓
  2. burlakov

    очень интересная разработка. есть аналогичная, но немного недоделанная по решению задач анализа и обобщения информации.

    Reply ↓
  3. andrewks

    нужно учесть, что используемый обработкой компонент имеет лицензию

    GFL SDK is provided as FREEWARE (NO Adware, NO Spyware) for private or educational use (including non-profit organizations).

    If you enjoy using GFL SDK, Don’t hesitate to help the developer with a small donation.

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

    Reply ↓
  4. AltF1

    Механизмы рейронных сетей необходимо включать в конфигурации 1С, где есть регл учет, чтобы понимать пользователей и их действия!

    Reply ↓
  5. informa1555

    (3) andrewks, Да Вы правы.Но это решаемая проблема, есть другие компоненты, просто с этой было проще работать — там всего несколько строчек — пиксели в массив записываются и все.

    Reply ↓
  6. informa1555

    (4) kiv82, Интересная мысль))

    Reply ↓
  7. MarSeN

    Какая сеть используется? я так понял, что многослойный персептрон?

    Сколько на выходе нейронов?

    Если возможно, напишите краткие тех. характеристики сети. Меня давно интересует данный вопрос. Уже вторая статья подряд на инфостарте попадает в в зону моего интереса (после штудирования инфо в инете выходит статья на ИС :-))

    Reply ↓
  8. MarSeN

    и еще вопрос в догонку…

    я так понимаю что GFLAx как раз-таки используется для «выделения» букв перед отправкой на входной слой нейронной сети.

    Reply ↓
  9. informa1555

    (7) MarSeN, Используется однослойный перцептрон типа самоорганизующихся карт Кохонена но по своему алгоритму. Многослойные медленнее на этапе распознавания. Упор сделан на обучение и организацию карт чтобы при распознавании бысрее находился нужный вариант.

    Reply ↓
  10. informa1555

    (8) MarSeN, GLAfx используется только для того чтобы пиксели в массив записать и все. Вся работа с изображением полностью на 1С ну и далее распознавание и обучение тоже.

    Reply ↓
  11. MarSeN

    (10) informa1555,

    Спасибо.

    На выходе сколько нейронов?

    Reply ↓
  12. informa1555

    Сколько обучите столько и будет. Идея заключается в том что на один значащий выход на одном слое может быть много нейронов. Например я цифру 7 могу писать с палочкой посередине и без, поэтому у меня накапливается опыт по обоим вариантам,но все они ведут в итоге к 7ке

    Reply ↓
  13. rasswet

    здОрово и любопытно! респект!

    Reply ↓
  14. DAnry

    Великая и могучая 1С… Ну и, конечно, универсальная. Что еще не делали на 1С?

    Reply ↓
  15. gruk

    Круть! +

    Reply ↓
  16. AnryMc

    Особенно понравилось

    написано на языке 1С
    Reply ↓
  17. CheBurator

    внушает!

    Reply ↓
  18. SunShinne

    Простите за французский, но… реально ах-ре-неть- задумка крутая! Плюс однозначнейший! А для чего-нибудь еще нейросеть можно «натаскать»? Где можно почитать про «вот это все»?

    Reply ↓
  19. informa1555

    (17) CheBurator, Спасибо!

    Reply ↓
  20. informa1555

    (18) SunShinne, Спасибо за внимание. С помощью нейронных сетей можно распознавать вообще все — любое изображение, звук(распознавание речи), реализовать любую нечеткую логику — принятие решений например при изменяющих факторах окружающего мира и т.д. Это по сути ассоциативное мышление. У меня не совсем типичные сети(частный случай) — это самоорганизующаяся карта — вот она подходит больше для изображений — т.е. объектов с непрерывной структурой (грубо говоря каких то реальных точек которые в физическом объекте если он физический стоят вместе друг с другом).Что почитать сложный вопрос — я читал либо книжки советского периода либо англоязычные, у нас почему то про это забыли сейчас — хороших книг сейчас не выходит только лекции (например в электронном виде Интуит).

    Reply ↓
  21. RailMen

    Плюсую. Напоминает мою ККР по дисциплине нейросетевые технологии, когда учился в магистратуре. Только писалась она на старом добром Delphi и без сторонних библиотек. Project не тяжело переписать под 1С, только пока не требовалось.

    Reply ↓
  22. CheBurator

    (20) а можно пристегнуть к примерно такой задаче — нахождение похожих картинок?

    например: пришел товар (чехлы для телефонов). вопрос: есть ли у меня такой товар в базе? идентификации никакой нет, кроме внешнего вида.. делаем типа: фотографируем (весь товар фотографируется в примерно одинаковом ракурсе/размере), жмакаем кнопку — выдает список(картинки) похожих товаров..?

    Reply ↓
  23. RailMen

    (22) CheBurator, можно сделать без какой-либо сторонней библиотеке с небольшими оговорками:

    1) все фото будут одного не большого разрешения, например, 400х600 (очень большое разрешение потребует некоторые усложнения мат модели персептрона);

    2) черные чехлы фоткать на белом фоне для большей контрастности, чтобы снизить полную ошибку нейросети.

    Ну и главное, надо понимать, что любая нейросеть не может являться инструментом для 100% принятия решения в какой-либо области, особенно в рег учете или точных расчетных задачах. Ее надо рассматривать как некий «советчик»/»помощник»/»консультант». Многое зависит от методов обучения сети, ее базы знаний и т.д.

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

    1) чехол №1 — картинка чехла №1 — ошибка сети при вычислении схожести чехла №1

    2) чехол №2 — картинка чехла №2 — ошибка сети при вычислении схожести чехла №2

    …

    «

    Reply ↓
  24. CheBurator

    1. да, так и есть, картинки небольшого формата, для визуального контроля в основном, но вполне разборчивые…

    2. это нормальное требование

    .

    остальное тоже нормально.

    .

    думаю такая программулинка будет представлять интерес. и не только для чехлов 😉

    .

    Reply ↓
  25. MarSeN

    (12) informa1555,

    спасибо за ответ. увидел случайно, так как он не был «адресован» мне

    Reply ↓
  26. HameleonA

    Интересное решение. Напомнило мне дипломный проект. На досуге посмотрю.

    Reply ↓
  27. Makushimo

    (19) informa1555,

    поделитесь ссылкой, если не трудно. Очень интересна эта тема.

    Reply ↓
  28. MarSeN

    Плохо, что «инновационные» статьи всегда проигрывают в плюсах.

    Reply ↓
  29. informa1555

    (27) Makushimo, В качестве базы(тем более там разные подходы) что то из этого неплохо, Барский например: http://www.intuit.ru/studies/courses?service=0&option_id=17&service_path=1

    Reply ↓
  30. Evil Beaver

    Круто, но не до конца уловил, а что, собственно, делает компонента GFLAx?

    Reply ↓
  31. informa1555

    (30) Evil Beaver, Компонента просто считывает цвета пикселей картинки в двумерный массив- там буквально 5 строчек. Т.е. переводит картинку в матрицу. Средствами 1С вроде картинку не прочитать попиксельно. По крайней мере я не знаю как… А само распознавание и прочая сопутствующая работа с изображением на 1С сделана — уже с массивом точек.

    Reply ↓
  32. Йожкин Кот

    А можно при помощи нейросетей сделать прогнозирование курса евро/доллара на несколько дней вперед? Потом привязать это все к какой-либо торговой платформе…

    Reply ↓
  33. informa1555

    (32) Йожкин Кот, Думаю нет, там вроде традиционно теханализ используется, матстатистика там.

    Reply ↓
  34. Zas1402

    (32) Нейросеть она больше угадывает чем прогнозирует.

    Reply ↓
  35. Evil Beaver

    (28) MarSeN, я заплюсил. А проигрывают потому, что практической ценности меньше. Если поизгаляться, так и 3D графику можно сделать, обсчет матриц, там, и прочее. Но зачем?

    Reply ↓
  36. EugenLiquor

    Хммм, не думал, что найду подобное решение. Довольно интересное решение, поподробнее ознакомлюсь!

    Reply ↓
  37. artbear

    ОФФ. подписался.

    Reply ↓
  38. 3762515

    Отличная вещь! Я так понимаю, можно взять стопку документов, например счет-фактура входящие, положить в сканер и 1с от сканирует, распознает и создаст такой же!

    Reply ↓
  39. informa1555

    (39) 3762515, Да можно приспособить под печатный текст тем более что распознавание печатных букв гораздо проще чем рукописных и в данном примере реализовано распознавание ячеек, а в накладных, с/фактурах и т.д. как раз надо читать инфу из таблиц документа например колонка «Товар» — строка 1,2,3 и т.д. Как раз то, что мешает привинтить файнридер это то что связь таблиц и полей с реальными реквизитами должна обрабатываться на стороне 1С.Без такой связи толку от распознавания нет,а если делать на 1С как раз все доступно. Но «привинчивать» придется долго — это не тиражный продукт, а просто демка алгоритма.

    Reply ↓
  40. 3762515

    Чего то не могу понять, что именно надо скачать отсюда: http://www.xnview.com/en/GFL/#downloads

    Ничего похожего на GFLAx там нет, поиска нет. Обработка ругается:

    {Форма.Форма.Форма(1969)}: Ошибка при вызове конструктора (COMОбъект)
    GFLAx = Новый COMОбъект(«GFLAx.GFLAx»);
    по причине:
    Недопустимая строка с указанием класса
    
    Reply ↓
  41. informa1555

    (41) 3762515, Вот ссылка на прямую скачку с их сайта http://download.xnview.com/GflSDK-win.zip

    Reply ↓
  42. 3762515

    (42) informa1555, спасибо

    Reply ↓
  43. protexprotex

    (33) informa1555, Ну неправда. Нейросети как раз для прогнозирования — самое то. Используют для этого специальную структуру сети — с обратными связями. И обучают до стабилизации ответа.

    Reply ↓
  44. pvlunegov

    (14) DAnry,

    В 1с нет объектно-ориентированного подхода.

    Это огромный минус, который ведет к сложному коду.

    На любом объектно-ориентированном языке подобные задачи выглядят в коде изящнее и проще в понимании.

    Reply ↓
  45. 3762515

    Не пойму, что нужно что бы оно заработало. Такая ошибка у меня:

    {Форма.Форма.Форма(1969)}: Ошибка при вызове конструктора (COMОбъект)

    GFLAx = Новый COMОбъект(«GFLAx.GFLAx»);

    по причине:

    -2147221005(0x800401F3): Недопустимая строка с указанием класса
    Reply ↓
  46. informa1555

    (46) 3762515, Не установлен GFLAx или не зарегистрирован. Зарегистрировать : Regsvr32 c:WINDOWSsystem32GflAx.dll

    Reply ↓
  47. VLMedvedev

    А развитие есть ?

    Reply ↓
  48. informa1555

    (48) VLMedvedev, Есть но в виде совсем другого собственного мат аппарата (еще меньше похожего на сети — больше на био) и не на 1С)) 1С хороша чтобы чето быстро наваять — увидеть воплощение идеи, не задумываясь над типизацией и т..д. но это несерьезно для развития.

    Reply ↓
  49. VLMedvedev

    Как посмотреть ?

    Reply ↓
  50. informa1555

    (50) VLMedvedev, Это не так просто к сожалению. Коммерческого решения пока нет. Мат аппарат я постоянно перерарбатываю и модули кластреризации, разпознавания и т.д. непрезентабельные хоть и рабочие))

    Reply ↓
  51. Rico17

    Приглашаю в проект:

    https://infostart.ru/project/795704/

    Необходимо разработать движок для работы со смыслами.

    Вот простая задача для понимания направления работы:

    Система должна уметь составлять осмысленные предложения из набора слов, например:

    — пустыня, озеро, река.

    Можно добавлять любые слова, чтобы получилось предложение имеющее смысл.

    Например: В пустыне нет озера и реки.

    Reply ↓
  52. izidakg

    Обновление данной разработки будет?

    Reply ↓
  53. informa1555

    (53) На 1С нет — слишком тормозная. Я ее использовал чтобы поэкспериментировать с алгоритмами, нащупать решение, так как на 1С это делать проще всего — нет типизации и т.д. Сам я ML пишу на питоне (бек) + на java или c# фронты и прочую инфраструктуру.

    Reply ↓

Leave a Comment

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