Перейти к содержанию
Публикация AiManual

Обработка договоров в n8n: извлечение данных, проверка человеком и запись в CRM

Как подготовить обработку договоров в n8n: извлечение суммы без обрезки, обязательная проверка реквизитов, безопасная запись в Bitrix24 и оценка затрат.

Коротко

Что будет в материале

  1. 01

    Проблема, от которой хочется плакать

  2. 02

    Почему именно n8n, а не что-то ещё?

  3. 03

    Архитектура решения: что куда идёт

  4. 04

    Типичные ошибки (чтобы вы их не повторили)

Проблема, от которой хочется плакать

Представьте себе среднестатистическую компанию на 50 человек. Каждый месяц через неё проходит около 150 договоров: с клиентами, поставщиками, арендодателями. Каждый договор нужно:

  • Скачать с почты (иногда из трёх разных ящиков)
  • Переименовать по шаблону «Контрагент_Дата_Тип»
  • Заполнить Excel-таблицу с реквизитами
  • Загрузить в CRM (Bitrix24 в нашем случае)
  • Отправить уведомление юристу на проверку
  • После проверки — разослать контрагентам
  • И, наконец, положить в папку «Обработанные»

Для оценки эффекта возьмём условный расчёт: 3,5 часа в день × 20 рабочих дней = 70 часов в месяц. При ставке 1500 рублей это 105 000 рублей стоимости времени, а не подтверждённая экономия или сокращение расходов. Из результата нужно вычесть настройку, инфраструктуру, сопровождение и обязательную проверку человеком. Фактический эффект измеряют на пилоте.

Ошибки возможны и у человека, и у OCR/парсера. Неверная сумма или версия договора может попасть в CRM и дальнейшую переписку. Поэтому автоматизация готовит черновик, а реквизиты и документ проверяет ответственный сотрудник до записи в рабочую CRM и отправки контрагенту.

Почему именно n8n, а не что-то ещё?

n8n подходит для соединения почты, обработки файлов и CRM. Community Edition можно самостоятельно разместить в рамках её лицензии, но сервер, хранение, резервные копии и сопровождение не бесплатны. Возможности платных редакций и внешних сервисов проверяйте отдельно.

Готовые узлы помогают собрать процесс, а для нестандартного извлечения данных могут понадобиться код, тесты и работа с API. Перед подключением внешнего OCR или LLM согласуйте передачу договоров, состав данных и условия хранения; self-hosted n8n сам по себе не оставляет все данные внутри компании.

💡
Кстати, если вам нужно извлекать структурированные данные из текста без GPU, посмотрите мой гайд про GliNER2. Иногда проще вытащить данные из PDF, чем парсить шаблон.

Архитектура решения: что куда идёт

Что делали вручнуюКак делает n8nЧто измерить на пилоте
Мониторинг почтыEmail Trigger (IMAP) и фильтрация входящих писемЗадержку получения письма
Извлечение данных из PDFOCR через Unstructured.io + парсингДолю верно извлечённых реквизитов
Заполнение ExcelАвтозапись в Google SheetsВремя проверки и занесения
Загрузка в CRMAPI Bitrix24Число дублей и ошибок API
УведомленияTelegram-бот + emailСрок до проверки человеком

1Настраиваем мониторинг почты

Создаём новый workflow в n8n. Добавляем триггер «Email (IMAP)». Настраиваем подключение к корпоративной почте.

В интерфейсе Email Trigger (IMAP) выберите отдельные IMAP credentials: сервер вашего провайдера, TLS и соответствующий порт (для IMAPS обычно 993). Пароль или поддерживаемый провайдером токен храните в credentials, не в $vars и не в опубликованном JSON. Включите скачивание вложений и проверяйте их в следующих узлах. Это описание настройки, не импортируемый workflow.

После триггера поставьте IF/Filter: нужная тема письма, наличие вложений и разрешённый тип файла. Одного расширения недостаточно: проверяйте MIME/type, размер и допустимость обработки; документы из почты считайте недоверенными. Поля вложений проверьте на тестовом письме в своей версии узла.

Способ получения писем и ограничения соединений зависят от IMAP-провайдера; универсального правила «не чаще пяти минут» нет. Ограничьте права почтовой учётной записи. External secrets — отдельная возможность редакции, а обычные credentials предназначены для хранения подключения.

2Извлекаем текст и данные из документов

Сначала определите тип файла. Из текстового PDF или DOCX можно извлечь текст; для скана нужен OCR. После любого способа извлечения реквизиты остаются кандидатами: регулярное выражение не отличает итог договора от НДС, аванса или штрафа.

Я использовал связку:

  1. Совместимый OCR/парсер, например API Unstructured, через документированный способ подключения; наличие отдельного готового узла не предполагается
  2. Самописный JavaScript-узел для парсинга ключевых полей
function extractAmountCandidates(text) {
  // Узкий учебный формат: сумма целиком на отдельной строке.
  const pattern = /^(?:Сумма договора|Итого к оплате)[ \t]*:[ \t]*((?:0|[1-9]\d*|[1-9]\d{0,2}(?:[ \u00a0\u202f]\d{3})+)(?:[,.]\d{2})?)[ \t]*(?:руб(?:\.|лей)?|RUB|₽)[ \t]*\.?$/i;
  const candidates = [];
  const lines = String(text).split(/\r?\n/);
  for (let index = 0; index < lines.length; index++) {
    const rawLine = lines[index].trim();
    const match = rawLine.match(pattern);
    if (!match) continue;
    // Не преобразуем деньги в Number: сохраняем десятичную строку.
    const compact = match[1].replace(/[ \u00a0\u202f]/g, '');
    const parts = compact.split(/[,.]/);
    candidates.push({
      rawLine,
      lineNumber: index + 1,
      amountDecimal: parts[0] + '.' + (parts[1] || '00'),
      currency: 'RUB'
    });
  }
  return { candidates, reviewStatus: 'pending' };
}

Это чистая JavaScript-функция для кандидатов, не готовый workflow. Для Code node в режиме Run Once for Each Item добавьте вызов return { json: extractAmountCandidates($json.text) };, предварительно сопоставив поле text с выходом вашего парсера. Не сохраняйте результат напрямую в сумму сделки. Код намеренно пропускает другие подписи, переносы суммы, знак минус, суммы прописью и неизвестную валюту. Пустой список или несколько совпадений отправляются на ручную обработку; даже одно совпадение требует проверки. Дату договора и контрагента проверяют по оригиналу, а не берут первое похожее значение в тексте.

Для сложных сканов сравните доступные варианты на собственных документах: сравнение OCR-инструментов. Внешний API получает содержимое документа; перед передачей проверьте разрешение, тариф и политику обработки данных.

3Интегрируем с CRM и таблицами

Перед HTTP Request нужна отдельная очередь проверки. Ответственный сотрудник сверяет оригинал, итоговую сумму, валюту, НДС, контрагента и дату. Решение должно быть связано с хешем и версией файла и содержать автора/время подтверждения. Узел записи в CRM запускается только для подтверждённой версии; флаг approved нельзя принимать из OCR-текста или ответа модели. При замене файла подтверждение сбрасывается.

Ниже учебный JSON body для legacy-метода crm.deal.add, а не конфигурация n8n. Bitrix24 рекомендует новым интеграциям crm.item.add; поля и права проверяйте по документации вашего портала. Числа и названия в примере синтетические и должны быть заменены проверенными данными.

{
  "fields": {
    "TITLE": "Проверенный договор: учебный пример",
    "OPPORTUNITY": "1234567.89",
    "CURRENCY_ID": "RUB",
    "IS_MANUAL_OPPORTUNITY": "Y",
    "COMMENTS": "Учебный пример: реквизиты сверены с утверждённой версией документа"
  }
}

OPPORTUNITY — сумма сделки в указанной валюте. IS_MANUAL_OPPORTUNITY задаёт ручной расчёт; проверьте взаимодействие с товарными строками. DATE_CREATE не используйте как дату договора: это дата создания CRM-записи. Для даты договора заведите соответствующее пользовательское поле и получите его реальный код и тип через метаданные портала; универсальный UF_CRM-код здесь не придумывается. Webhook URL содержит секрет: храните его в защищённых настройках подключения и не выводите в журнал.

В Google Sheets передавайте только разрешённые к хранению сведения и отмечайте статус проверки. Черновые кандидаты и подтверждённые реквизиты должны различаться. Для повторных запусков храните связь документа с созданной сделкой; после таймаута API сначала проверьте результат предыдущего запроса, иначе повтор создаст дубль.

💡
Если ваша CRM — экзотическая система без API, можно использовать подход из статьи про IDEAV. Преобразуйте бизнес-логику в запросы без прямого доступа к БД.

4Уведомления и логирование

Уведомление о необходимости проверки отправляйте уполномоченному сотруднику до записи в CRM. В Telegram или email достаточно номера задачи и ссылки на защищённую очередь; сумму, текст договора и публичную ссылку на файл отправлять не обязательно. Получатель должен иметь доступ к оригиналу в защищённом хранилище.

Пример текста уведомления: «Новый документ ожидает проверки. Задача №… Доступ к оригиналу и кандидатам — в защищённой очереди». Шаблон и права получателя проверьте на тестовых данных; ссылка не должна давать доступ без авторизации.

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

Типичные ошибки (чтобы вы их не повторили)

ОшибкаЧто происходитКак исправить
Нет обработки дублейОдин договор обрабатывается 5 разДобавить проверку хеша файла или messageId письма
Слишком строгий парсингНе распознаёт часть форматовНаправить на проверку; улучшать извлечение по тестовому набору, не отменяя ручного подтверждения
Нет обработки ошибок APIПри падении CRM весь workflow ломаетсяДобавить обработку ошибок; перед повтором создания сделки проверить, не выполнился ли первый запрос
Хранение паролей в workflowКомпрометация при экспорте настроекИспользовать credentials и ограничить доступ; доступность external secrets зависит от редакции

Что делать, когда документы становятся слишком сложными?

Бывают договоры с приложениями, спецификациями, нестандартными условиями. Мой совет — не усложняйте парсинг до бесконечности. Лучше выделите такие документы в отдельную очередь для ручной обработки.

Но если хочется автоматизировать всё, смотрите в сторону VLM (Vision-Language Models). Модели вроде Qwen3-VL могут «читать» документы с таблицами и схемами. У меня есть сравнение мультиязычных VLM — некоторые работают локально и дешевле, чем API GPT-4.

Как оценить расходы и эффект

Считайте отдельно VPS, диск для вложений, резервные копии, домен, OCR/LLM API, настройку и сопровождение. При выборе self-hosted инфраструктуры можно сравнить Timeweb Cloud с другими провайдерами по RAM, диску, резервному копированию и условиям хранения документов. Это партнёрская ссылка. Минимальный тариф не гарантирует работу OCR и n8n под вашей нагрузкой; проверьте конфигурацию на пилоте и текущую стоимость.

Измерьте время до и после автоматизации, включая ручную проверку, исправления ошибок и обслуживание. Стоимость высвобождённого времени не равна денежной экономии. Без измеренных затрат и результата нельзя заявлять ROI 6500% или гарантировать возврат 100 000 рублей в месяц.

А что дальше? Куда развивать систему

Когда базовый workflow работает, можно добавить:

  1. Вспомогательный поиск спорных формулировок через разрешённую LLM с последующей проверкой юристом; передачу договора внешнему сервису согласовать заранее
  2. Подготовку черновиков ответных писем; отправку только после согласования человеком
  3. Интеграцию с системой электронной подписи
  4. Дашборд в Grafana с аналитикой по типам договоров

И главное — не останавливайтесь на документах. Та же логика работает для счетов, актов, заявок. Долю автоматизации определяйте по собственным измерениям, сохраняя обязательные этапы проверки.

Самый частый вопрос: «А не заменю ли я этим себя?» Нет. Вы освободите время для задач, которые действительно требуют человека. Вместо переименования файлов — переговоры по сложным контрактам. Вместо заполнения таблиц — анализ рисков. Автоматизация не заменяет людей. Она заменяет рутину.

P.S. Если боитесь, что ваш босс увидит эту статью и задумается о сокращении — не волнуйтесь. Лучше сами предложите автоматизацию. Так вы станете не расходом, а активом. Как показывает статья про 2026 год, тех, кто умеет работать с AI, не увольняют. Увольняют тех, кто боится нажать кнопку «Запустить workflow».