Разбор задачи

Ввод данных из документов в учётную систему

Реквизиты со скана заводятся в учётную систему сами, вручную закрываются только несошедшиеся строки

Проверяется: очередь ручной проверки и журнал операций

Оптовая торговляРаботаем по NDA

Задача

Накладные, счета, акты и копии паспортов приходят почтой, в мессенджерах и фотографиями с телефона. Сотрудник открывает файл и перебивает реквизиты в 1С или CRM, ошибаясь в цифрах ровно там, где это дороже всего. Задача выглядит как «распознать и занести», но распознавание здесь меньшая часть работы: основное — сверка со справочниками и правила, когда заносить нельзя.

Где ломается

Что съедает срок и бюджет на самом деле

Почти никогда — не модель. Ниже места, из-за которых такие проекты встают, и что мы с каждым делаем.

Качество входа непредсказуемо

фотография накладной под углом, печать поверх суммы, две страницы в одном файле, скан 150 dpi. Главная сложность не в том, чтобы прочитать хороший документ, а в том, чтобы уверенно опознать нечитаемый и отдать его человеку вместо занесения наугад.

Сопоставление со справочниками

В документе «ООО Ромашка», в базе «Ромашка, ООО» и ещё дубль с другим ИНН; номенклатура поставщика не совпадает с вашей ни одним словом. Нужны правила сопоставления по ИНН и артикулу и таблица соответствий, которую кто-то ведёт постоянно.

Дубли и повторная доставка

один счёт приходит и на почту, и в мессенджер, и ещё раз после правки. Без ключа идемпотентности из номера, даты, ИНН и суммы агент создаёт второй документ, и его потом ищут руками по всей базе.

Цена ошибки выше, чем у ассистента

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

Ограничение, которое определяет решение

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

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

Как проверить, что работа сделана

Приёмка идёт на контрольной выборке из 100–300 документов, отложенных заранее и не участвовавших в настройке. Считаются три показателя отдельно: доля документов, занесённых без единой правки полей; доля ошибок, которые агент не заметил и провёл дальше — это критичный показатель, и порог по нему жёстче остальных; доля документов, честно отправленных человеку.

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

О чём спросить любого подрядчика

  • Спрашивайте не про точность распознавания, а про поведение на сомнительном документе.
  • Подрядчик, у которого нет внятного ответа «агент отказывается и передаёт человеку», будет тихо заносить мусор, и вы узнаете об этом на сверке.
  • Уточните, как решается сопоставление номенклатуры и кто ведёт таблицу соответствий после запуска.
  • Требуйте отдельную техническую учётную запись с ограниченными правами и отмену конкретной операции вместо отката базы.
  • И обратите внимание, поднял ли подрядчик тему паспортных данных сам: если этот вопрос пришлось задавать вам, с требованиями к персональным данным он не работал.
Как делали

Порядок работ по этапам

На каждом этапе назван результат, который остаётся у заказчика. На проверке — признак, по которому работу не приняли бы.

  1. Разбор первичкиСобрали архив сканов накладных, счетов и актов и разложили по формам поставщиков, отметив, где реквизиты расположены нестандартно. С бухгалтерией разобрали, на каких полях возникали опечатки, доходившие до отчётности, и выгрузили справочники контрагентов и номенклатуры.
  2. Архитектура агентаРаспознавание разместили внутри контура, наружу сканы не уходят; агент отделён от учётной системы и общается с ней через HTTP-сервис, документы ждут разбора в очереди. Правила сверки контрагента по ИНН и номенклатуры по таблице соответствий вынесли из кода, а от автопроведения отказались — документ создаётся только черновиком.
  3. Сборка по слоямСначала подняли разбор форм и заполнение реквизитов, затем проверку арифметики по строкам и итогу, затем очередь ручной проверки и журнал операций. Всё это гоняли на стенде с копией базы 1С, прежде чем подключать боевую.
  4. Проверка на архивеПрогнали архив сканов и сверили заполненные поля с документами, заведёнными бухгалтерами вручную. Провалом считали не только неверный реквизит, но и уверенно разобранное спорное поле, не ушедшее оператору; черновик с несходящейся суммой строк и итога — причина не принять работу.
  5. Передача бухгалтерииПередали исходный код агента, правила разбора под формы заказчика, очередь ручной проверки и журнал операций. Бухгалтеров научили работать с очередью, а администратора — добавлять форму нового поставщика и пополнять таблицу соответствий номенклатуры.
Архитектура и стек

Как это устроено внутри

Приёмник на FastAPI кладёт скан в MinIO и ставит задачу в RabbitMQ, распознавание и разбор идут отдельными воркерами: OCR занимает узел надолго, и на прямом вызове он держал бы HTTP-соединение, а очередь ещё и переживает перезапуск воркера. Разобранные реквизиты попадают в PostgreSQL черновиком со статусом, сверка контрагента по ИНН и номенклатуры по таблице соответствий выполняется там же запросами к справочникам, арифметика документа пересчитывается перед записью. В 1С документ уходит через HTTP-сервис с идемпотентным ключом из хеша файла и номера документа — повтор после таймаута не создаёт второй черновик. Поля ниже порога уверенности в 1С не отправляются, а встают в очередь оператора со ссылкой на исходный скан; каждое действие агента пишется в журнал операций, узлы подняты контейнерами.

Стек
  • Python
  • FastAPI
  • PostgreSQL
  • MinIO
  • RabbitMQ
  • Docker
  • PaddleOCR
  • 1С HTTP-сервис
  • Prometheus

Похожая задача у вас?

Разберём её на созвоне за 40 минут: назовём объём работ, ограничения контура и по каким числам вы будете принимать результат. Если задача не наша — скажем прямо.