Проблема, от которой хочется плакать
Представьте себе среднестатистическую компанию на 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 сам по себе не оставляет все данные внутри компании.
Архитектура решения: что куда идёт
| Что делали вручную | Как делает n8n | Что измерить на пилоте |
|---|---|---|
| Мониторинг почты | Email Trigger (IMAP) и фильтрация входящих писем | Задержку получения письма |
| Извлечение данных из PDF | OCR через Unstructured.io + парсинг | Долю верно извлечённых реквизитов |
| Заполнение Excel | Автозапись в Google Sheets | Время проверки и занесения |
| Загрузка в CRM | API 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. После любого способа извлечения реквизиты остаются кандидатами: регулярное выражение не отличает итог договора от НДС, аванса или штрафа.
Я использовал связку:
- Совместимый OCR/парсер, например API Unstructured, через документированный способ подключения; наличие отдельного готового узла не предполагается
- Самописный 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 сначала проверьте результат предыдущего запроса, иначе повтор создаст дубль.
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 работает, можно добавить:
- Вспомогательный поиск спорных формулировок через разрешённую LLM с последующей проверкой юристом; передачу договора внешнему сервису согласовать заранее
- Подготовку черновиков ответных писем; отправку только после согласования человеком
- Интеграцию с системой электронной подписи
- Дашборд в Grafana с аналитикой по типам договоров
И главное — не останавливайтесь на документах. Та же логика работает для счетов, актов, заявок. Долю автоматизации определяйте по собственным измерениям, сохраняя обязательные этапы проверки.
Самый частый вопрос: «А не заменю ли я этим себя?» Нет. Вы освободите время для задач, которые действительно требуют человека. Вместо переименования файлов — переговоры по сложным контрактам. Вместо заполнения таблиц — анализ рисков. Автоматизация не заменяет людей. Она заменяет рутину.
P.S. Если боитесь, что ваш босс увидит эту статью и задумается о сокращении — не волнуйтесь. Лучше сами предложите автоматизацию. Так вы станете не расходом, а активом. Как показывает статья про 2026 год, тех, кто умеет работать с AI, не увольняют. Увольняют тех, кто боится нажать кнопку «Запустить workflow».