Развертывание Docker с Flask + Tesseract и взаимодействие с 1С: Документооборот на примере версии 1.4

20.08.24

Разработка - DevOps и автоматизация разработки

В данной инструкции рассмотрим процесс развертывания приложения на Python с использованием фреймворка Flask и Tesseract OCR в контейнере Docker. Узнаем, как использовать Tesseract в связке с Flask и осуществлять обращения к Tesseract для обработки изображений. Рассмотрим пример обращения к приложению Docker из 1С, в том числе для замещения CuneiForm в старых конфигурациях 1С:Документооборот версии 1.4 и ниже.

Развертывание Docker с Flask + Tesseract и взаимодействие с 1С: Документооборот на примере версии 1.4

В данной инструкции рассмотрим процесс развертывания приложения на Python с использованием фреймворка Flask и Tesseract OCR в контейнере Docker. Узнаем, как использовать Tesseract в связке с Flask и осуществлять обращения к Tesseract для обработки изображений. Рассмотрим пример обращения к приложению Docker из 1С.

 

Разворачивание приложения

 

Установка Docker

Прежде всего, убедитесь, что у вас установлен Docker. Вы можете скачать и установить его с официального сайта Docker). После установки проверьте, что Docker работает, выполнив команду:

docker --version

 

Создание проекта Flask

Клонируйте репозиторий:

git clone https://gitverse.ru/dgmcomru/imagemagick.git

Перейдите в каталог:

cd imagemagick

Убедитесь, что структура каталогов выглядит так:

ls

Результат:

<DIR>   doc
<DIR>   src
        docker-compose.yaml
        Dockerfile
        README.md
        РаспознаваниеPDF.epf

В каталоге src располагаются модули Python: main.py, skew.py

 

Построение Docker-образа

Теперь мы можем построить наш Docker-образ. Выполните следующую команду:

docker-compose build prod

 

Запуск Docker-контейнера

После успешной сборки образа выполните команду для создания и запуска контейнера:

docker-compose up prod

 

Проверка доступности приложения, запущенного в Docker-контейнере

Теперь вы можете открыть браузер и перейти по адресу http://localhost:5000, где вы увидите сообщение "OCR system enable". Приложение доступно, можем двигаться дальше.

 

Проверка извлечения текста

Теперь вы можете отправлять изображения на обработку в Tesseract через ваше Flask-приложение, используя POST-запрос на /upload с файлом изображения. Например, вы можете использовать curl:

curl -X POST http://localhost:5000/upload -F "image=@path_to_image_file.png"

Если всё настроено правильно, вы получите текст, распознанный Tesseract, в ответе.

 

Использование Docker-приложения в прикладном решении 1С: Документооборот

Протестировано в версии 1С:Документооборота 1.4.11.2.

Обращение к приложению Docker из 1С, передача файла в метод http://localhost:5000/upload для распознавания

Рассмотрим основные - важные процедуры реализующие обращения к приложению Docker для детального понимания реализации

&НаСервереБезКонтекста
Функция РаспознатьНаВнешнемРесурсе(ВерсияСсылка)
    СодержимоеФайла = ПолучитьСодержимоеФайла(ВерсияСсылка, Ложь);
    РезультатСервера = "";
    Если ТипЗнч(СодержимоеФайла) = Тип("ДвоичныеДанные") Тогда
        HTTPСерверРаспознавания = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("АвтоматическоеРаспознаваниеИзображений", "HTTPСерверРаспознавания",,,"Администратор");
        Соединение = Новый HTTPСоединение(HTTPСерверРаспознавания);
        ЗапросСервера = Новый HTTPЗапрос("/upload");
        ЗапросСервера.УстановитьТелоИзДвоичныхДанных(СодержимоеФайла);
        ОтветСервера = Соединение.ВызватьHTTPМетод("POST", ЗапросСервера);
        РезультатСервера = ОтветСервера.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    КонецЕсли;  
    Возврат РезультатСервера;
КонецФункции

 

Вызов процедуры распознавания на сервере

&НаСервереБезКонтекста
Процедура РаспознаваниеИзображений() Экспорт

        ПроверитьДоступностьВнешнегоРесурса();

        Если НЕ РаспознаваниеВключено() Тогда
            ЗаписьЖурналаРегистрацииСервер(НСтр("ru = 'Распознавание отключено, включите или остановите регламентное задание.'"),);        
            Возврат;    
        КонецЕсли;

        УникальныйИдентификатор = Новый УникальныйИдентификатор;

        РазмерПорции = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("АвтоматическоеРаспознаваниеИзображений", "КоличествоФайловВПорции",,,"Администратор");

        Попытка

            РазмерПорцииТекущий = ?(РазмерПорции = Неопределено, 10, РазмерПорции);
            МассивВерсий = ПолучитьМассивВерсийДляРаспознавания(РазмерПорцииТекущий);

            Если МассивВерсий.Количество() = 0 Тогда

                Возврат;

            КонецЕсли;

            Для Индекс = 0 По МассивВерсий.Количество() - 1 Цикл

                //Проверим, если ВЫКлючили прервем цикл
                Если НЕ РаспознаваниеВключено() Тогда
                    Прервать;  
                КонецЕсли;

                ВерсияСсылка = МассивВерсий[Индекс];

                Попытка
                    СтруктураВозврата = РаботаСФайламиВызовСервера.ПолучитьДанныеФайлаИНавигационнуюСсылкуВерсииДляРаспознавания(ВерсияСсылка, УникальныйИдентификатор);
                    ДанныеФайла = СтруктураВозврата.ДанныеФайла;
                    АдресФайла = СтруктураВозврата.НавигационнаяСсылкаВерсии;
                    РасширениеФайлаРезультата = СтруктураВозврата.РасширениеФайлаРезультата;

                    Если ДанныеФайла.СтатусРаспознаванияТекста <> "НужноРаспознать" Тогда

                        Если ЭтоАдресВременногоХранилища(АдресФайла) Тогда
                              УдалитьИзВременногоХранилища(АдресФайла);
                        КонецЕсли;

                        Продолжить; // другой клиент уже обработал файл

                    КонецЕсли;  

                    РаспознанныйТекст = "";
                    СтрокаВозврата = "Успешно";
                    РаспознанныйТекст = РаспознатьНаВнешнемРесурсе(ВерсияСсылка);

                    Если Не ЗначениеЗаполнено(РаспознанныйТекст) Тогда

                        СтрокаВозврата = "Ошибка";
                        ЗаписьЖурналаРегистрацииСервер(нСтр("ru='Результат распознавания пустой'", "ru"), ВерсияСсылка);

                    КонецЕсли;  

                   ЗаписатьРезультатРаспознавания(ВерсияСсылка, СтрокаВозврата, Ложь, РаспознанныйТекст);

                Исключение

                    ИмяСРасширениемФайла = ФайловыеФункцииКлиентСервер.ПолучитьИмяСРасширением(ДанныеФайла.ПолноеНаименованиеВерсии, ДанныеФайла.Расширение);
                    ОписаниеОшибкиИнфо = ОписаниеОшибки();
                    ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                                        НСтр("ru = 'Во время распознавания изображения из файла ""%1"" произошла неизвестная ошибка.'"),
                                        ИмяСРасширениемФайла);
                    ТекстСообщения = ТекстСообщения + Строка(ОписаниеОшибкиИнфо);
                    ЗанестиИнформациюОбОшибкеРаспознавания(ВерсияСсылка, ТекстСообщения);      

                КонецПопытки;  

            КонецЦикла;

            ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                            НСтр("ru = 'Распознавание изображений завершено. Обработано файлов: %1'"),
                            МассивВерсий.Количество());

            ЗаписьЖурналаРегистрацииСервер(ТекстСообщения,);           
Исключение
            ОписаниеОшибкиИнфо = ОписаниеОшибки();
            ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                            НСтр("ru = 'Во время распознавания изображения из файла ""%1"" произошла неизвестная ошибка.'"), ИмяСРасширениемФайла);
                            ТекстСообщения = ТекстСообщения + Строка(ОписаниеОшибкиИнфо);
            ЗаписьЖурналаРегистрацииСервер(ТекстСообщения,);

        КонецПопытки;

КонецПроцедуры

 

Вызов процедуры распознавания с клиента

&НаКлиенте
Процедура РаспознатьВсе(Команда)
    РаспознаваниеВключено = Истина;
    ОбщегоНазначения.ХранилищеОбщихНастроекСохранить("АвтоматическоеРаспознаваниеИзображений", "РаспознаваниеВключено",  РаспознаваниеВключено,,"Администратор");
    КоличествоНераспознанныхФайловДоНачалаОперации = ПолучитьКоличествоНераспознанныхВерсий();
    РаспознаваниеИзображений();
    ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    НСтр("ru='Завершено распознавание всех нераспознанных файлов. Обработано файлов: %1.'"), КоличествоНераспознанныхФайловДоНачалаОперации);
    ПоказатьПредупреждение(, ТекстСообщения);
КонецПроцедуры

 

Первый запуск обработки РаспознаваниеPDF.epf

Запустите обработку и нажмите кнопку Настройка. Определите адрес ресурса localhost:5000 или внешний servername:5000. Определите количество документов - pdf файлов в одном цикле.

Кнопка Старт разрешает отправку файлов для извлечения текста.

Кнопка Стоп запрещает отправку файлов для извлечения текста.

Кнопка Распознать все отправляет определенное количество документов для извлечения текста и записи результата в Справочник ВерсииФайлов

Пробуйте :)

Буду рад, если вы оцените этот проект и решите присоединиться к его развитию.

 

Проект в свободном доступе

Проект imagemagick на GitVerse

Вступайте в нашу телеграмм-группу Инфостарт

HTTP Docker Flask Tesseract OCR

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

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

См. также

Тестирование QA DevOps и автоматизация разработки Программист Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Налоговый учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Бухгалтерия предприятие 3.0 и версии КОРП: 3.0.190.11.

5368 руб.

20.01.2022    11697    48    1    

21

DevOps и автоматизация разработки Тестирование QA Программист Пользователь 1С:Предприятие 8 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Платные (руб)

Автотесты 1С - готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарий – feature-файл, разработанный с помощью vanessa-automation. Запуск сценария выполняется интерактивно с помощью vanessa-automation или с помощью vanessa-runner в CI-системах. Доступно тестирование тонкого клиента. Поддерживаемые версии конфигураций 1С:Зарплата и Управление Персоналом 3 и версии КОРП: 3.1.35.48.

5000 руб.

05.08.2024    6002    36    1    

20

Тестирование QA DevOps и автоматизация разработки Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Налоговый учет Платные (руб)

Готовые тестовые сценарии, предназначенные для регресс-тестирования функционала конфигурации после обновления типовым релизом. Сценарии проверяют интерактивное заполнение форм документов, справочников и результат проведения документов. Сценарии возможно использовать как для vanessa-automation, так и для СППР. Поддерживаемые версии конфигураций ERP2 и КА2: 2.5.22.145.

5000 руб.

04.07.2022    13984    50    6    

39

DevOps и автоматизация разработки Программист Бесплатно (free)

Хватит ограничивать себя родным и уютным стеком 1С. Пора расширять кругозор и осваивать смежные стеки! Разберемся, как Docker может упростить жизнь одинэснику: от сборки и тестирования 1С до запуска инфраструктуры и автоматизации CI/CD, причем быстро, воспроизводимо и без лишнего мусора в системе.

08.05.2026    2621    sleemp    65    

34

DevOps и автоматизация разработки Программист Бесплатно (free)

Статья о том, как команда 1С смогла перейти от ручного управления к полноценной автоматизации, внедрив практики DevOps в среде 1С. Разбираем проблемы, которые мешали развиваться: медленный процесс командной разработки, отсутствие тестирования, длительные релизы, хаос с хотфиксами и ручные действия на каждом этапе. Объясняем, как внедренные решения – GitLab, Jenkins, автоматизированные пайплайны, тестовое окружение, стандарты разработки и тестирования – позволили масштабировать команду и повысить стабильность поставок.

14.04.2026    937    Sicuro    4    

3

DevOps и автоматизация разработки Мониторинг Системный администратор Программист Бесплатно (free)

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

06.04.2026    10030    vladimir-89    10    

29

DevOps и автоматизация разработки Программист Бесплатно (free)

Если вы думаете, что внедрение CDC конвейера — это геморрой, то вы правы. Но мы уже прошли через все боли: от настройки MSSQL CDC до танцев с Kafka и ClickHouse. Теперь конвейер работает и данные ключевых операций в 1С, от которых зависит бизнес, попадают в ClickHouse, где их можно анализировать и использовать для мониторинга в реальном времени. В этой статье я расскажу, как выглядит архитектура и с какими проблемами можно столкнуться

05.03.2026    1244    NesterTop1    4    

5

DevOps и автоматизация разработки EDT Программист Бесплатно (free)

Разбираемся, почему ручной деплой в 1С все еще жив и сколько времени он на самом деле занимает, несмотря на стремительное развитие CI/CD-подходов. На реальном кейсе показываем, что корень проблемы чаще кроется не в автоматизации, а в ее неэффективной настройке. Событийная модель вместо расписаний, параллельные тесты, использование кеша Gitlab для оптимизаций и правильные настройки для управления репозиториями на раннерах радикально меняют скорость delivery. Объясняем, почему переход на Docker иногда замедляет процесс, как платформенные особенности 1С влияют на пайплайны и какие стратегии позволяют устранить узкие места. Материал будет полезен тем, кто хочет понять реальную стоимость ручного деплоя и сравнить ее с возможностями правильно настроенной автоматизации.

04.03.2026    1428    konst1231    0    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. friskdb 33 20.08.24 15:07 Сейчас в теме
Интересная разработка. Микро сервис умеет распознавать табличные части или только текстовые документы?
romanichenko; +1 Ответить
2. romanichenko 13 20.08.24 15:32 Сейчас в теме
(1) с таблицами плохо дружит но текст достает, цель была достать текст документов для Полнотекстового поиска
Для отправки сообщения требуется регистрация/авторизация