Девопсы в 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 распознавание

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Разработка Инструментарий разработчика Групповая разработка (Git, хранилище) Программист Платные (руб)

Практический курс по работе с AI-агентами для разработчиков 1С уровня middle и senior, а также тимлидов команд: от постановки задач и передачи контекста до создания расширений, интеграций, MCP-инструментов, тестов и проверки готового решения.

50000 руб.

10.09.2026    215    0    0    

0

DevOps и автоматизация разработки Администрирование СУБД Групповая разработка (Git, хранилище) Системный администратор Программист Руководитель проекта Стажер 1С 8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Управление холдингом 1С:Зарплата и Управление Персоналом 3.x 1С:Предприятие 8. Транспортная логистика, экспедирование и управление автотранспортом КОРП 1C:ERP Беларусь Россия Казахстан Абонемент ($m)

В корпоративных инсталляциях «1С:Предприятие 8.3» под управлением PostgreSQL всё чаще проявляются архитектурные пределы масштабирования: рост числа пользователей, обязательная маркировка, плотный поток API-интеграций и высокая стоимость простоя. Вводная часть цикла разбирает ключевые факторы современной эксплуатационной нагрузки и формирует инженерную методологию эволюционной модернизации без остановки продуктивного контура. Материал основан на практическом кейсе «Торговый контур» и показывает, как определить целевые метрики (p95, MTTR, APDEX), выстроить наблюдаемость, стабилизировать работу кластера и подготовить инфраструктуру к дальнейшему масштабированию. Публикация задаёт фундамент для последующих частей, посвящённых телеметрии, оптимизации PostgreSQL, CI/CD и архитектурному росту.

1 стартмани

10.09.2026    261    Ninel_S    0    

4

DevOps и автоматизация разработки Linux HighLoad оптимизация Групповая разработка (Git, хранилище) Системный администратор Программист Руководитель проекта 1С:Предприятие 8 1С 8.3 1С:Документооборот 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 2.х Беларусь Россия Казахстан Абонемент ($m)

Системный анализ архитектурных границ масштабирования учетных систем «1С:Предприятие 8.3» под управлением PostgreSQL в ОС Linux. Формулирование инженерной методологии сквозного проекта «Торговый контур», определение измеримых целевых показателей (p95, MTTR, APDEX) и стратегии поэтапной модернизации эксплуатационного контура без остановки промышленных учетных процессов.

1 стартмани

07.09.2026    607    Ninel_S    9    

1

Linux Групповая разработка (Git, хранилище) Администрирование СУБД Системный администратор Программист 1С 8.3 Абонемент ($m)

Декларативный pipeline в GitHub Actions, тонкости лицензирования в Docker (--net=host), изоляция RUN_ID и интеграция со сборочным конвейером 1C:SRE-Suite. Вторая часть практического руководства (https://infostart.ru/public/2779597): от первого коммита до детерминированного синтаксического гейта на headless-раннере Linux

1 стартмани

03.09.2026    905    Ninel_S    0    

3

DevOps и автоматизация разработки Тестирование QA Групповая разработка (Git, хранилище) Программист 1С:Предприятие 8 Бесплатно (free)

Четыре года в интеграторе я работал с git и EDT. Git после хранилища полюбил сразу: видно, кто и что менял. С EDT сложнее: тормозит, ошибки при обновлении ERP, автономный сервер внутри него работает только с файловой базой. На новой работе команда захотела перейти на git, я развернул EDT, и оно на второй день разрушило проект при загрузке расширения. Тогда я решил дать команде git с привычным Конфигуратором и инструмент, который за минуту доносит коммит до базы через ibcmd, вместо получасовой загрузки из файлов. На новой работе разрешили ИИ, и я написал это приложение с его помощью: от чтения документации и первого ТЗ до идей в электричке. Впервые за годы снова почувствовал себя творцом, а не закрывателем задач. По дороге приросли выгрузка, объединение и проверка конфигурации по коммитам, YAxUnit и режим MCP-сервера. В статье: схемы, скриншоты, грабли и честный список ограничений. Ссылки пока нет: хочу понять, нужно ли это кому-то, кроме меня.

03.09.2026    9948    KatanaDragon511    28    

37

Linux Групповая разработка (Git, хранилище) Администрирование СУБД Системный администратор Программист 1С 8.3 Бесплатно (free)

Пакетный запуск Конфигуратора 1С на Linux таит опасную ловушку: при критических ошибках утилита DESIGNER завершается с кодом возврата 0 - «всё хорошо». Дефект уходит на продуктив. Мы открываем проект 1C:SRE-Suite - набор проверенных инструментов для надёжной эксплуатации 1С на Linux: • пятислойный сборочный скрипт с защитой от False Success (BOM, кодировки, lock-файлы, diff с Git) • Мягкая ротация процессов "rphost" через RAS API без обрыва сеансов • EDT ; Конфигуратор: CLI-мост для CI/CD на Node.js • Готовые конфиги logcfg.xml и nethasp.ini для боевого сервера • systemd-шаблоны для фонового мониторинга кластера Проект в активной разработке, лицензия MIT. Ждём ваших тест-репортов и PR.

03.09.2026    876    Ninel_S    0    

1

Групповая разработка (Git, хранилище) EDT Программист 1С:Предприятие 8 Россия Бесплатно (free)

Синхронизируйте свой проект EDT с хранилищем конфигурации так же легко, как в git клиенте. По кнопке Pull в проект EDT подтягиваются изменения из хранилища, по кнопке Push ваш коммит из git репозитория проекта EDT улетает в хранилище конфигурации.

09.07.2026    6584    DmitryShehovtsev    14    

26
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. elcoan 1162 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 211 10.08.21 02:44 Сейчас в теме
(1)
, strict_slashes=False

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

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