Разработка AI-цифрового бухгалтера (AI Accountant) — автоматизация учёта

Рутинная работа с первичными документами отнимает время бухгалтеров и приводит к ошибкам. Мы разрабатываем AI-бухгалтера, который автоматизирует обработку счетов, актов и накладных, освобождая команду для сложных задач. Наша команда реализует проект под ключ — от аудита процессов до внедрения и последующей поддержки.
Часто задаваемые вопросы

Представьте: 300 документов в день, 4 бухгалтера, 40% времени уходит на ручной ввод и сверку. Типичная производственная компания теряет до $22k–32k в год на ошибках и задержках. Мы решили эту проблему с помощью AI-бухгалтера — цифрового сотрудника на основе нейросети, который автоматизирует бухгалтерию: обрабатывает первичные документы (счёт-фактуры, акты, накладные), сверяет счета, готовит проводки, мониторит дебиторскую задолженность. Это не RPA-робот, а умная VLM-система, которая понимает контекст и адаптируется без переобучения. Он не заменяет главного бухгалтера, но снимает до 60-70% операционной нагрузки, позволяя команде фокусироваться на сложных задачах. Наша команда — 10+ лет в автоматизации учёта, более 50 внедрений AI-решений, официальные партнёры 1С. Накопленный опыт позволяет гарантировать качество извлечения данных на уровне 99% и снижение ошибок ввода минимум на 90%. Получите консультацию по внедрению AI-бухгалтера.

Этапы внедрения AI-бухгалтера

Этап Длительность Результат
Обследование процессов 1-2 недели Карта документооборота, требования
Настройка OCR-пайплайна 2-3 недели Модель извлечения с точностью 99%
Разработка верификации 1-2 недели Автоматическая проверка ИНН, сумм
Интеграция с 1С 2-3 недели XML-загрузка проводок
Настройка AR-мониторинга 1 неделя Автоматические напоминания
Обучение и поддержка 1 неделя Документация, тестирование

Как AI-бухгалтер обрабатывает первичные документы?

Извлечение данных из сканов и PDF строится на Vision Language Models. Мы используем Claude Vision и GPT-4o — они понимают структуру российских документов: ИНН, КПП, номера, даты и суммы. В отличие от классического OCR, VLM учитывает контекст: распознаёт не только символы, но и семантику полей. Результат парсится в строгую Pydantic-модель.

import anthropic
import base64
from pathlib import Path
from pydantic import BaseModel
from typing import Optional, Literal

client = anthropic.Anthropic()

class InvoiceData(BaseModel):
    document_type: Literal["invoice", "act", "waybill", "upd"]  # УПД
    vendor_name: str
    vendor_inn: Optional[str]
    vendor_kpp: Optional[str]
    document_number: str
    document_date: str
    amount_without_vat: float
    vat_rate: Optional[float]  # 20, 10, 0, None (без НДС)
    vat_amount: Optional[float]
    total_amount: float
    items: list[dict]  # Строки документа
    payment_purpose: Optional[str]  # Назначение платежа
    contract_reference: Optional[str]

def extract_document_data(file_path: str) -> InvoiceData:
    """Извлечение данных из скана/PDF документа через Claude Vision"""
    with open(file_path, "rb") as f:
        file_content = base64.standard_b64encode(f.read()).decode("utf-8")
    ext = Path(file_path).suffix.lower()
    media_type = "application/pdf" if ext == ".pdf" else "image/jpeg"
    response = client.messages.create(
        model="claude-opus-4-5",
        max_tokens=2000,
        messages=[{
            "role": "user",
            "content": [
                {
                    "type": "document" if ext == ".pdf" else "image",
                    "source": {
                        "type": "base64",
                        "media_type": media_type,
                        "data": file_content,
                    },
                },
                {
                    "type": "text",
                    "text": """Извлеки все реквизиты финансового документа. Для российских документов: ИНН, КПП, номер документа, дату, суммы с НДС и без. Верни JSON согласно схеме InvoiceData. Если поле отсутствует — null.""",
                },
            ],
        }],
    )
    return InvoiceData.model_validate_json(response.content[0].text)

Почему Vision Language Models, а не классический OCR?

Классические OCR-движки (Tesseract, ABBYY) часто ошибаются на нестандартных макетах и плохих сканах. VLM-модели видят документ целиком: они понимают, что сумма в правом нижнем углу — это итог, а не отдельная строка. Точность извлечения на российских документах достигает 99% при умеренном качестве. При этом модель адаптируется к новым шаблонам без переобучения — достаточно показать 2-3 примера в промпте.

Верификация и сопоставление с договорами

Извлечённые данные автоматически проверяются: ИНН сверяется с ФНС (через API), суммы — с договорами и лимитами. Если обнаружено расхождение, документ помечается на ручной контроль. Дубликаты отсекаются по номеру и ИНН поставщика.

Алгоритм верификации счёта

Система параллельно проверяет ИНН через API ФНС, сумму по договору, дубликаты по номеру и ИНН. Все проверки выполняются асинхронно. Если обнаружено расхождение более 5% по сумме или несоответствие ИНН, документ помечается manual_review. Мелкие расхождения (до $1–1 по НДС) корректируются автоматически.

class DocumentVerifier:
    async def verify_invoice(
        self,
        invoice: InvoiceData,
        contract_id: str,
    ) -> dict:
        """Проверяет счёт против договора и справочников"""
        # Параллельная проверка
        contract_task = contracts_db.get(contract_id)
        vendor_task = vendor_db.get_by_inn(invoice.vendor_inn)
        previous_invoices_task = invoices_db.get_for_contract(contract_id)
        contract, vendor, previous = await asyncio.gather(
            contract_task, vendor_task, previous_invoices_task
        )
        issues = []
        # Проверка ИНН поставщика
        if vendor and vendor.inn != invoice.vendor_inn:
            issues.append(f"ИНН поставщика не совпадает: документ={invoice.vendor_inn}, справочник={vendor.inn}")
        # Проверка суммы против договора
        total_paid = sum(p.amount for p in previous if p.status == "approved")
        if total_paid + invoice.total_amount > contract.max_amount * 1.05:  # 5% допуск
            issues.append(f"Превышение суммы договора: оплачено {total_paid}, новый счёт {invoice.total_amount}, лимит {contract.max_amount}")
        # Проверка НДС
        if invoice.vat_amount and invoice.vat_rate:
            expected_vat = invoice.amount_without_vat * invoice.vat_rate / 100
            if abs(expected_vat - invoice.vat_amount) > 1:  # Допуск $1–1
                issues.append(f"Ошибка расчёта НДС: ожидается {expected_vat:.2f}, в документе {invoice.vat_amount:.2f}")
        # Дубликат?
        duplicate = next(
            (p for p in previous if p.document_number == invoice.document_number and p.vendor_inn == invoice.vendor_inn),
            None,
        )
        if duplicate:
            issues.append(f"Дубликат документа: номер {invoice.document_number} уже обработан {duplicate.processed_date}")
        return {
            "valid": len(issues) == 0,
            "issues": issues,
            "requires_manual_review": len(issues) > 0,
            "vendor_verified": vendor is not None,
        }

Обработка документов с ошибками

Система не просто отбрасывает проблемные документы — она классифицирует тип ошибки и предлагает действия. Мелкие расхождения (до $1–1 по НДС) автоматически корректируются. Серьёзные несоответствия направляются в очередь ручной проверки с указанием причины. Свяжитесь с нами для демонстрации работы на ваших документах.

Формирование проводок и интеграция с 1С

Классификатор на основе LLM определяет тип расхода (материалы, услуги, товары) и подбирает корреспонденцию счетов. Проводки с аналитикой загружаются в 1С через XML. Готовый блок кода ниже.

class AccountingEntryGenerator:
    ACCOUNT_MAPPING = {
        "materials": {"debit": "10.01", "credit": "60.01"},
        "services": {"debit": "26", "credit": "60.01"},
        "goods": {"debit": "41.01", "credit": "60.01"},
        "vat_input": {"debit": "19.03", "credit": "60.01"},
    }

    async def generate_entries(
        self,
        invoice: InvoiceData,
        cost_center: str,
    ) -> list[dict]:
        """Генерирует проводки для 1С"""
        # LLM классифицирует тип расхода
        classification = await client.messages.create(
            model="claude-opus-4-5",
            max_tokens=200,
            messages=[{
                "role": "user",
                "content": f"""Классифицируй расход для бухгалтерских проводок.
Поставщик: {invoice.vendor_name}
Наименования в документе: {[item['name'] for item in invoice.items[:5]]}
Верни JSON: {{"expense_type": "materials|services|goods|fixed_assets", "account": "26|44|10|08", "vat_deductible": true|false}}"""
            }],
        )
        classification_data = json.loads(classification.content[0].text)

        entries = []
        # Основная проводка
        account_map = self.ACCOUNT_MAPPING.get(classification_data["expense_type"], self.ACCOUNT_MAPPING["services"])
        entries.append({
            "debit": account_map["debit"],
            "credit": account_map["credit"],
            "amount": invoice.amount_without_vat,
            "description": f"{invoice.vendor_name} / {invoice.document_number} от {invoice.document_date}",
            "cost_center": cost_center,
            "analytic": invoice.vendor_inn,
        })

        # НДС
        if invoice.vat_amount and classification_data.get("vat_deductible"):
            entries.append({
                "debit": "19.03",
                "credit": "60.01",
                "amount": invoice.vat_amount,
                "description": f"НДС / {invoice.vendor_name} / {invoice.document_number}",
                "cost_center": cost_center,
            })

        return entries

    async def post_to_1c(self, entries: list[dict]) -> str:
        """Загружает проводки в 1С через COM-объект или API"""
        # Формируем XML для 1С
        xml_data = self.format_1c_xml(entries)
        result = await onec_api.post_document(xml_data)
        return result["document_id"]
"}

Мониторинг дебиторской задолженности

Ежедневно AI проверяет просроченные счета и автоматически отправляет напоминания с эскалацией по степени просрочки. Персонализация писем — через GPT-4o-mini.

class ReceivablesMonitor:
    async def daily_ar_check(self) -> dict:
        """Ежедневная проверка просроченной дебиторки"""
        overdue_invoices = await invoices_db.get_overdue()
        report = {
            "total_overdue": sum(i.amount for i in overdue_invoices),
            "by_aging_bucket": self.group_by_aging(overdue_invoices),
            "actions_taken": [],
        }
        for invoice in overdue_invoices:
            days_overdue = invoice.days_overdue
            if days_overdue <= 7:
                # Дружественное напоминание
                await self.send_reminder(invoice, tone="friendly")
                report["actions_taken"].append(f"Напоминание: {invoice.customer_name}")
            elif days_overdue <= 30:
                # Официальное требование
                await self.send_reminder(invoice, tone="formal")
                await crm.create_task(customer_id=invoice.customer_id, title="AR Follow-up")
                report["actions_taken"].append(f"Официальное требование: {invoice.customer_name}")
            elif days_overdue > 30:
                # Эскалация финансовому директору
                await self.escalate_to_cfo(invoice)
                report["actions_taken"].append(f"ЭСКАЛАЦИЯ: {invoice.customer_name}, {days_overdue} дней")
        return report

    async def generate_ar_reminder(self, invoice: dict, tone: str) -> str:
        response = await openai_client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{
                "role": "system",
                "content": f"Напиши напоминание об оплате. Тон: {tone}. Официальный деловой стиль. 2-3 абзаца."
            }, {
                "role": "user",
                "content": f"Счёт №{invoice['number']} от {invoice['date']} на {invoice['amount']:,.0f} руб, просрочка {invoice['days_overdue']} дней, клиент: {invoice['customer_name']}"
            }],
        )
        return response.choices[0].message.content

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

Ситуация: 4 бухгалтера обрабатывали 300 документов в день (счёт-фактуры, акты, накладные). 40% времени — ручной ввод и сверка. AI-бухгалтер обрабатывал сканы и PDF через OCR + Claude Vision, автоматическую верификацию ИНН через ФНС API, сопоставление с договорами, формирование проводок в 1С (загрузка XML), еженедельный AR-отчёт.

Результаты:

  • Документов обработано без участия бухгалтера: 68%
  • Ошибки ввода данных снижены на 94%
  • Среднее время обработки 1 документа: 12 мин → 40 сек (в 18 раз быстрее)
  • Бухгалтеры фокусируются на сложных документах, налоговых вопросах, аудите
Метрика Человек AI-бухгалтер
Время обработки 12 минут 40 секунд
Ошибки ввода 1-2% <0.1%
Объём в день 75 документов 300+ документов

Экономический эффект: сокращение ФОТ бухгалтерии на 40-60% за счёт перераспределения нагрузки. При среднем объёме документооборота окупаемость наступает в течение 4-6 месяцев.

Что входит в работу по внедрению AI-бухгалтера

  1. Обследование текущих процессов и типов документов
  2. Настройка OCR-пайплайна под ваши шаблоны
  3. Разработка верификационной логики и справочников
  4. Интеграция с 1С (COM / REST API)
  5. Настройка AR-мониторинга и шаблонов писем
  6. Документация и обучение сотрудников
  7. Техническая поддержка в течение первого месяца

Сроки и стоимость

Ориентировочный срок реализации — от 8 до 12 недель в зависимости от сложности интеграций. Стоимость рассчитывается индивидуально под ваш объём документов и требования. Свяжитесь с нами для оценки вашего проекта — мы предложим оптимальное решение. Получите консультацию по внедрению AI-бухгалтера.

Направления AI-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1543
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142