Девопсы в 1С: микросервис распознавания штрихкодов

09.08.21

Разработка - Групповая разработка (Git, хранилище)

Распознавание штрихкода из сканированного документа в PDF.

"Мы словно живём в комнате, где на стене висит плакат. Уставимся на него и думаем, что это и есть весь мир. Комната... И плакат. На плакате что-то симпатичное: пейзаж, знаменитость. Как в том фильме про тюрьму... Как же он назывался? Комната — тюремная камера. А картинку каждый из нас видит по-своему. Она может быть прекрасной или ужасающей, но все мы к ней прикованы. Но это всё неправда: лишь ширма, скрывающая истину. Они нам врут. Мы врём самим себе. Комната — не весь мир. Мир намного больше, намного удивительнее. Плакат на стене скрывает лаз, ведущий в реальный мир. Мы ощущаем себя в безопасности в той комнате. Но иногда... Иногда нечто выползает из-за плаката. И каждый, кто становится тому свидетелем, в страхе пытается забыть о том, что видел."

- Джесси Фейден, Control


Итак, одеваем свой фурсьюит и ставим задачу:

Есть база 1С, в которой есть документы, к которым привязаны штрихкоды. Для простоты возьмём EAN13, но вообще более перспективными выглядят QR.

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

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

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

Прикрепление небольшого количества файлов не вызывает затруднений - мы можем сканировать и добавлять их вручную. Однако, не будем забывать о том, что уже изобрели пакетное сканирование.

Будем считать, что пользователь кладет в сканер сразу все листы, относящиеся к одному документу. Например, это может быть счет на трёх страницах, коммерческое предложение и прайс. Условимся, что весь этот пакет будет отсканирован в один PDF-документ (для удобства дальнейшего использования).

Теперь у нас получилась папка с pdf-файлами, в которых содержатся сканы документов со штрихкодами. Нужно распознать штрихкоды и привязать их к документам. Естественно, часть про привязать находится на стороне 1С, но что с распознаванием?

Варианты примерно следующие:

  • использовать какую-то внешнюю компоненту (вероятнее всего, просто ActiveX)
  • использовать CLI утилиту (такой вариант мне нравится всё больше)
  • использовать REST API, или, по-нашему, HTTP-сервис - красиво, модно, молодежно!

Собственно, третьим вариантом и попробуем воспользоваться. А так как сейчас довольно популярен Python, и я про него практически ничего не знаю, то я попробовал решить эту задачу с его помощью.

Архитектура будет такая:

в одной локальной сети стоит три машины:

  • 1C (сервер или клиент - в данном случае не важно)
  • Веб-сервер на питоне
  • Обычная сетевая папка, пусть будет Windows

В первой версии архитектуры у сервера 1С и у Flask есть доступ к этой папке. Почему так? Потому что так легче отлаживать - можно делать это через браузер, не загружая каждый раз файл. Потом можно легко переделать на передачу самих двоичных данных файла через HTTP, благо ни у 1С, ни у Питона с этим проблем нет.

Что понадобится для реализации?

  1. Python
  2. IDE
  3. Flask
  4. pdf2image
  5. pyzbar
  6. poppler

Питон вроде бы устанавливается вместе с IDE, но можно скачать c https://www.python.org/downloads/

Очевидные варианты IDE - Microsoft Visual Studio Code, она у меня как раз есть, и PyCharm. Мне нравится IDEA, решил попробовать PyCharm.

Следующие три компонента устанавливаются с помощью пакетного менеджера:

pip install flask
pip install pyzbar
pip install pdf2image

К сожалению, так как на самом Питоне написано ничего, то для работы нужно установить некоторые компоненты. В нашем случае пришлось установить http://blog.alivate.com.au/poppler-windows/, распаковать архив и прописать путь к папке bin в переменную окружения PATH (у меня Windows).

Собственно, все эти библиотеки я нашел за 20 минут гуглежа, думаю, есть варианты и получше, но важен сам принцип.

Во фласке методы REST API прописываются с помощью так называемых роутов, выглядит похоже на 1С:

@app.route("/decode_ean13/<string:strfilename>/<int:pagenum>", methods=["GET"])

Также, как в HTTP-сервисах 1С. можно в качестве части пути объявлять обязательные параметры, но тут их можно еще и типизировать. У меня эти параметры strfilename и pagenum - хочу передавать путь к файлу и номер страницы (на самом деле она по условиям всегда первая, но на будущее), метод будет, естественно, GET (мы хотим только получать данные от этого сервиса). Тут роут может поддерживать несколько методов, также, как и в 1С.

Теперь осталось сохранить указанную страницу файла, путь к которому получили, и распознать с неё штрихкод EAN13.

За сохранение страницы как раз отвечает pdf2image, и делает это с помощью единственного вызова:

pages = convert_from_path(filename, dpi=300, first_page=pagenum, last_page=pagenum)

Здесь pages - список полученных страниц. Так как мы получаем только одну страницу, то она у нас будет pages[0].

За распознавание штрихкода отвечает pyzbar:

decode(image, symbols=[ZBarSymbol.EAN13])

Здесь я сразу ограничиваю виды штрихкодов, которые нужно распознавать - думаю, так будет работать быстрее. Кроме того, я так снижаю вероятность распознавания чужих штрихкодов - ведь, например, на документе поставщика может быть штрихкод поставщика и наш. Конечно, они оба могут быть EAN13, но какую-то часть ошибок я отсеку.

Как выяснилось, decode в качестве параметра принимает объект типа Image, и convert_from_path возвращает объект типа Image, но это разные Image :(

В общем, пока для простоты я полученную страницу сохраняю в PNG-файл, и тут же загружаю его обратно и распознаю штрихкод. В результате распознавания возвращается список со всеми штрихкодами, которые удалось распознать, и это очень полезно - помним про штрихкоды поставщика? Эти штрикоды в виде JSON я и возвращаю в ответ.

В процессе выяснилась странная особенность то ли Flask, то ли не знаю чего: нельзя передать слэш (разделитель пути) даже в виде url-кода %2F. Поэтому я его заменил на |:

Вот пример изображения:

В принципе, для случая с сетевой папкой, которая доступна для обеих машин, всё уже работает - осталось научиться сохранять картинку во временный файл, а не в папку с исходным PDF (она по идее не должна быть доступна на запись).

Для случая, когда папка недоступна, нужны доработки: 1С будет отправлять двоичные данные, а сервер на Питоне будет распознавать штрихкод из них. Для этого в pdf2image уже есть convert_from_bytes,  и еще нужно выяснить, как объект-изображение из pdf2image преобразовать в изображение pyzbar. Заглушки в коде я уже поставил ;)

Код из статьи доступен в репозитории https://github.com/AlexNecro/NBarcoder. На стороне 1С ничего не делалось - и так всё понятно.

PS. Спросите, причем тут девопс? Ну так нужно этот скрипт на питоне положить в Docker, вот и всё!

PPS. Прошу пинать, так как всё натыкано мышкой как попало, хотелось бы привести всё в нормальный вид, а опыта работы с Питоном, Гитом и Докером особо нет.

штрихкод python flask rest api http pdf ean13 распознавание

См. также

Системы контроля версий для 1С-разработчиков.

1С-программирование DevOps и автоматизация разработки Групповая разработка (Git, хранилище) DevOps для 1С Платформа 1С v8.3 Платные (руб)

Основы командной разработки на 1С. Использование систем контроля версий при разработке на платформе 1С:Предприятие 8

4900 руб.

29.06.2022    6997    64    4    

87

Jenkins на службе 1С

Групповая разработка (Git, хранилище) Бесплатно (free)

Основная специализация Jenkins – это, прежде всего, CI/CD. Но его можно использовать и для других важных задач: разбора хранилищ, настройки копий баз данных, раздачи прав пользователям, рестарта кластера и проверки кода проектов. Об опыте использования Jenkins для автоматизации рутинных задач 1С-ника на конференции Infostart Event 2021 Moscow Premiere рассказал Юрий Гончарук.

19.07.2023    1138    yukon    4    

11

Приемы быстрой работы в EDT/Git

Групповая разработка (Git, хранилище) Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Статья даёт ответы на некоторые вопросы, возникающие у разработчиков, которые погружаются в океан технологий EDT и Git, омывающий царство DevOps... Сколько и какие ветки нужны? Какой репозиторий выбрать? Кто должен сливать доработки в мастер ветку или ветку версии? Как не тратить время в EDT на ресурсоёмких операциях? Зачем нам сборочный конвейер и как его построить? Зачем нам нужно тестирование и как его реализовать? Как вести разработку, если есть разработчики, не умеющие вести разработку в EDT или не имеющие технической возможности, но нам нужны их skills в 1С? Что такое фантомы и нужно ли с ними бороться? Как слить 20 доработок с конфликтами и уложиться в 4 часа? Опыт использования модных технологий в реальных проектах.

30.03.2023    6085    check2    10    

81

Получаем статистику по git-репозиторию в разрезе разработчиков

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Бесплатно (free)

Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота! Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика.

13.03.2023    1847    ardn    3    

27

Формула успешного внедрения DevOps и Agile в 1С: от неудачи к неудаче без потери энтузиазма

Групповая разработка (Git, хранилище) Управление проектом Бесплатно (free)

На конференции Infostart Event 2021 Post-Apocalypse выступил директор практики БИТ:ERP компании Первый БИТ Глеб Стальной. В ходе доклада он рассмотрел трансформацию проектного подхода в продуктовый, рассказал про имплементацию «современных» практик DevOps и продемонстрировал инструменты для разработки, взаимодействия с бизнесом и клиентами, применяемые в его команде.

27.02.2023    1639    glebushka    2    

12

Кровь, пот и GIT

Групповая разработка (Git, хранилище) Бесплатно (free)

Ведущий разработчик 1С Андрей Карпов на конференции Infostart Event 2021 Post-Apocalypse поделился ошибками, которые совершают новички в работе с GIT. В докладе четыре кейса с пошаговыми инструкциями, которые позволят не допускать конфликтов в разработке.

17.01.2023    7566    karpik666    45    

65

Прокси хранилища 1С (IIS, OneScript)

Групповая разработка (Git, хранилище) OneScript DevOps и автоматизация разработки Платформа 1С v8.3 Россия Бесплатно (free)

Избавляемся от версионной зависимости, проверяем комментарии, вызываем веб-хуки, делаем красивые пути. И все это на привычном IIS и понятном OneScript.

08.12.2022    6310    kamisov    46    

89

Что, если Continuous Integration – это прежде всего практика, а не набор инструментов?

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Бесплатно (free)

Рано или поздно многие компании приходят к практикам DevOps. И начало этому – Continuous Integration. О том, что происходит в команде специалистов 1С, когда они переходят на Git, и почему простое внедрение CI-инструментов не решает проблему подходов к разработке, в докладе на Infostart Event 2021 Post-Apocalypse рассказал руководитель компании ПрогТехБизнес Александр Анисков.

07.12.2022    1909    vandalsvq    0    

23
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. elcoan 642 09.08.21 21:57 Сейчас в теме
В процессе выяснилась странная особенность то ли Flask, то ли не знаю чего: нельзя передать слэш (разделитель пути) даже в виде url-кода %2F. Поэтому я его заменил на |:

Думаю, Вам поможет strict_slashes=False:
@app.route('/test', strict_slashes=False)
@app.route('/test/<path:path>')
def test(path=None):
    return str(path)
2. alexey_kurdyukov 141 10.08.21 02:44 Сейчас в теме
(1)
, strict_slashes=False

Почему-то не помогло
Прикрепленные файлы:
3. alexey_kurdyukov 141 10.08.21 05:11 Сейчас в теме
(2) Похоже потому, что не добавил path:
4. alexey_kurdyukov 141 12.08.21 02:43 Сейчас в теме
(1) C path помогло, спасибо
5. user1085902 13.08.21 10:24 Сейчас в теме
Извиняюсь, но использование докера не равно DevOps. Плюс сервис распознавания не особо удачен с точки зрения использования общей папки.
Мое видение этого процесса:
- Настроить http сервис на 1с, чтобы он умел отдавать документы по какому-то адресу.
- Через брокер и/или периодический обмен сообщать сервису распознавания что нужно распознать такой-то документ, вот тебе ссылка, ответ верни по этому адресу.
- Сервис распознавания качает себе файл, распознает, вызывает коллбэк куда отдаёт результат.

Готово, теперь это можно называть микросервисом.
6. alexey_kurdyukov 141 13.08.21 10:27 Сейчас в теме
(5) Чем плох вариант вызова этого же сервиса, только не с указанием имени файла, а с передачей сразу двоичных данных? Запросы можно выполнять в фоновых заданиях
7. user1085902 13.08.21 10:48 Сейчас в теме
(6) Соглашусь, если нужно синхронно обрабатывать данные.
Плюс обоих подходов - доступно горизонтальное масштабирование.
8. user626743_2mugik 03.09.21 09:54 Сейчас в теме
Я Zbar сишный использовал. Думаю быстрее работает. подключался через Внешнюю компоненту 1С.
Оставьте свое сообщение