Развертывание 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

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

1С HTTP Docker Flask Tesseract OCR

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

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

См. также

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.3 1С 8.5 Бесплатно (free)

В прошлой статье у ERP оставалось 89 отказов загрузки, у ЗУП — 19. Теперь обе конфигурации совпали с эталонами, а собранные файлы прошли круг через платформу. Развертка выделена в открытый репозиторий cf-unwrapper: библиотека на Rust и консольная утилита. Показываю результаты, объясняю границы «100%» и приглашаю к проверкам и развитию проекта.

02.11.2026    210    oyti    1    

1

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

Практическое руководство для команд, которые хотят уйти с хранилища конфигурации на git, не переходя на новую среду разработки. Подойдёт разработчикам и тимлидам, которые настраивают командную разработку на типовых и собственных конфигурациях.

02.11.2026    426    vanya_gonchar    2    

4

Файловый обмен (TXT, XML, DBF), FTP DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.5 Бесплатно (free)

В прошлой статье я выгрузил Бухгалтерию в XML байт в байт и спросил, на чем проверить дальше. Вы ответили: ERP, старые релизы, зарплата. Прогнал пять конфигураций, от клиента ЭДО до ERP на 120 тысяч файлов. Рассказываю, что сломалось после Бухгалтерии, почему эталону платформы нельзя верить на слово, как выгрузить одну конфигурацию в формат трех версий платформы - и почему cf-конвертер становится отдельным продуктом, Разверткой.

02.11.2026    275    oyti    2    

3

Инструментарий разработчика DevOps и автоматизация разработки Разработчик 1С 8.3 Абонемент ($m)

Как отличить срочное исправление от обычного вечернего коммита? Проверила расчёт показателей поставок по отчёту хранилища 1С и истории двух открытых проектов. На стенде счётчики совпали со сценарием, а в выборке открытого проекта правило «те же объекты» ошиблось во всех шести случаях. Показываю границы такого замера и отличие от метрик DORA. Прилагаются инструмент и материалы опыта.

1 стартмани

29.10.2026    275    Ninel_S    0    

0

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С 8.5 Бесплатно (free)

Выгрузка типовой Бухгалтерии в XML через базу занимает больше четырёх минут. Я написал движок, который читает файл конфигурации напрямую и выгружает его за 35 секунд, совпадая с выгрузкой платформы байт в байт во всех 90 385 файлах. Загрузка обратно тоже работает: круг через платформу совпадает полностью. Рассказываю, как ускоряли, как проверяем и что при загрузке XML теряет сама платформа. А в конце спрашиваю, нужно ли это кому-то, кроме меня, и на какой конфигурации проверить следующей.

27.10.2026    849    oyti    20    

16

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Хук pre-commit проверяет полный снимок индекса Git в отдельной базе 1С. На «Нано-УТ» и платформе 8.3.27 повторила 12 попыток коммита: восемь прошли, четыре остановлены. Чистый коммит занял 31,8 с. Вызов несуществующего метода общего модуля хук останавливает только с ключом -ExtendedModulesCheck. В архиве версия 2, тесты, инструкция и журналы.

1 стартмани

26.10.2026    315    Ninel_S    2    

-1

Нейросети DevOps и автоматизация разработки Разработчик 1С 8.3 Абонемент ($m)

Я дала агенту Claude Code задачу словами: добавить в учебную конфигурацию документ «Внутреннее потребление товаров», который списывает товар по средней стоимости и не даёт уйти в минус. Три запуска с нуля, каждый принят проверкой на платформе 1С: 1 мин 49 с, 2 мин 33 с и 2 мин 56 с. Показываю, что агент поменял, где ошибался и почему на типовой УТ так быстро не будет.

1 стартмани

26.10.2026    560    Ninel_S    0    

-1

Нейросети DevOps и автоматизация разработки Разработчик 1С 8.3 Бесплатно (free)

ИИ пишет код на 1С все быстрее, а разработчик по-прежнему носит вопросы, ответы и статусы между чатом с агентом, аналитиком и архитектором. Показываю другой подход и демо-стенд: задача из Яндекс Трекера сама идет по этапам, ИИ-агент работает в GitLab CI, а люди только утверждают спецификацию, архитектуру, план и код. Живой пример задачи от заявки до merge, честный отказ агента, права агента, время и стоимость: вся задача обошлась в 68 центов.

22.10.2026    696    maxrubtsoff    1    

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