Ввод данных из документов в учётную систему
Реквизиты со скана заводятся в учётную систему сами, вручную закрываются только несошедшиеся строки
Проверяется: очередь ручной проверки и журнал операций
Оптовая торговляРаботаем по NDA
Накладные, счета, акты и копии паспортов приходят почтой, в мессенджерах и фотографиями с телефона. Сотрудник открывает файл и перебивает реквизиты в 1С или CRM, ошибаясь в цифрах ровно там, где это дороже всего. Задача выглядит как «распознать и занести», но распознавание здесь меньшая часть работы: основное — сверка со справочниками и правила, когда заносить нельзя.
Что съедает срок и бюджет на самом деле
Почти никогда — не модель. Ниже места, из-за которых такие проекты встают, и что мы с каждым делаем.
Качество входа непредсказуемо
фотография накладной под углом, печать поверх суммы, две страницы в одном файле, скан 150 dpi. Главная сложность не в том, чтобы прочитать хороший документ, а в том, чтобы уверенно опознать нечитаемый и отдать его человеку вместо занесения наугад.
Сопоставление со справочниками
В документе «ООО Ромашка», в базе «Ромашка, ООО» и ещё дубль с другим ИНН; номенклатура поставщика не совпадает с вашей ни одним словом. Нужны правила сопоставления по ИНН и артикулу и таблица соответствий, которую кто-то ведёт постоянно.
Дубли и повторная доставка
один счёт приходит и на почту, и в мессенджер, и ещё раз после правки. Без ключа идемпотентности из номера, даты, ИНН и суммы агент создаёт второй документ, и его потом ищут руками по всей базе.
Цена ошибки выше, чем у ассистента
проведённый документ меняет остатки и взаиморасчёты. Отсюда границы автономности, лимиты по сумме, создание черновика вместо проведения и механизм отмены конкретной операции, а не восстановление базы из резервной копии.
Ограничение, которое определяет решение
Паспортные данные — отдельная категория персональных данных: их нельзя пропускать через публичные сервисы распознавания и нельзя оставлять лежать в почтовых вложениях и в логах агента. Распознавание разворачивается внутри контура, в журнале вместо самих данных хранятся ссылка на документ и хеш, срок хранения копий и порядок их удаления фиксируются письменно до запуска.
Состав полей, цели обработки и основания согласуются с вашим ответственным за персональные данные — до того, как первый документ попал в систему.
Как проверить, что работа сделана
Приёмка идёт на контрольной выборке из 100–300 документов, отложенных заранее и не участвовавших в настройке. Считаются три показателя отдельно: доля документов, занесённых без единой правки полей; доля ошибок, которые агент не заметил и провёл дальше — это критичный показатель, и порог по нему жёстче остальных; доля документов, честно отправленных человеку.
Отдельным пунктом проверяется повторная отправка одного и того же счёта двумя каналами: второй документ создаваться не должен, и это видно по журналу. Пороги вписываются в акт до начала работ.
О чём спросить любого подрядчика
- Спрашивайте не про точность распознавания, а про поведение на сомнительном документе.
- Подрядчик, у которого нет внятного ответа «агент отказывается и передаёт человеку», будет тихо заносить мусор, и вы узнаете об этом на сверке.
- Уточните, как решается сопоставление номенклатуры и кто ведёт таблицу соответствий после запуска.
- Требуйте отдельную техническую учётную запись с ограниченными правами и отмену конкретной операции вместо отката базы.
- И обратите внимание, поднял ли подрядчик тему паспортных данных сам: если этот вопрос пришлось задавать вам, с требованиями к персональным данным он не работал.
Порядок работ по этапам
На каждом этапе назван результат, который остаётся у заказчика. На проверке — признак, по которому работу не приняли бы.
- Разбор первичкиСобрали архив сканов накладных, счетов и актов и разложили по формам поставщиков, отметив, где реквизиты расположены нестандартно. С бухгалтерией разобрали, на каких полях возникали опечатки, доходившие до отчётности, и выгрузили справочники контрагентов и номенклатуры.
- Архитектура агентаРаспознавание разместили внутри контура, наружу сканы не уходят; агент отделён от учётной системы и общается с ней через HTTP-сервис, документы ждут разбора в очереди. Правила сверки контрагента по ИНН и номенклатуры по таблице соответствий вынесли из кода, а от автопроведения отказались — документ создаётся только черновиком.
- Сборка по слоямСначала подняли разбор форм и заполнение реквизитов, затем проверку арифметики по строкам и итогу, затем очередь ручной проверки и журнал операций. Всё это гоняли на стенде с копией базы 1С, прежде чем подключать боевую.
- Проверка на архивеПрогнали архив сканов и сверили заполненные поля с документами, заведёнными бухгалтерами вручную. Провалом считали не только неверный реквизит, но и уверенно разобранное спорное поле, не ушедшее оператору; черновик с несходящейся суммой строк и итога — причина не принять работу.
- Передача бухгалтерииПередали исходный код агента, правила разбора под формы заказчика, очередь ручной проверки и журнал операций. Бухгалтеров научили работать с очередью, а администратора — добавлять форму нового поставщика и пополнять таблицу соответствий номенклатуры.
Как это устроено внутри
Приёмник на FastAPI кладёт скан в MinIO и ставит задачу в RabbitMQ, распознавание и разбор идут отдельными воркерами: OCR занимает узел надолго, и на прямом вызове он держал бы HTTP-соединение, а очередь ещё и переживает перезапуск воркера. Разобранные реквизиты попадают в PostgreSQL черновиком со статусом, сверка контрагента по ИНН и номенклатуры по таблице соответствий выполняется там же запросами к справочникам, арифметика документа пересчитывается перед записью. В 1С документ уходит через HTTP-сервис с идемпотентным ключом из хеша файла и номера документа — повтор после таймаута не создаёт второй черновик. Поля ниже порога уверенности в 1С не отправляются, а встают в очередь оператора со ссылкой на исходный скан; каждое действие агента пишется в журнал операций, узлы подняты контейнерами.
- Python
- FastAPI
- PostgreSQL
- MinIO
- RabbitMQ
- Docker
- PaddleOCR
- 1С HTTP-сервис
- Prometheus
Похожая задача у вас?
Разберём её на созвоне за 40 минут: назовём объём работ, ограничения контура и по каким числам вы будете принимать результат. Если задача не наша — скажем прямо.