Полная автоматизация сбора счетов-фактур и др - от почты до 1С с ИИ и MCP
02.07.2026 | Статья из категории: Нейросети
🚀 Пошаговое руководство: как настроить AI-агента, который сам забирает счета из почты, распознаёт, проверяет и записывает в 1С.
А главное — как 1С принимает данные: через HTTP-сервисы или напрямую в SQL. Разбираем оба подхода с кодом.
🏗️ Архитектура AI-агента на MCP
Вся система строится вокруг MCP-сервера — универсального шлюза между нейросетью и вашими системами. Нейросеть не знает, как работать с 1С или OCR, она просто вызывает нужный инструмент через MCP.
Это ключевой вопрос. 1С — это не просто база данных, это целая экосистема с бизнес-логикой, регистрами, документами и правами доступа. Есть два принципиально разных подхода:
🌐 Через HTTP-сервисы (REST / SOAP)
✅ Рекомендуемый
1С публикует веб-сервис с методами
Внешняя система отправляет JSON / XML
1С сама валидирует, проводит, пишет в регистры
Соблюдается бизнес-логика
Безопасно, контролируемо
🗄️ Напрямую в SQL-таблицы
⛔ Опасно!
Пишете INSERT / UPDATE напрямую в базу 1С
Обходите бизнес-логику
Нарушаете целостность данных
Можно сломать 1С
Потеря поддержки и обновлений
⚠️ Важное предупреждение: Никогда не пишите напрямую в SQL-таблицы 1С! Это приведёт к нарушению ссылочной целостности, ошибкам в отчётах и потере поддержки. 1С — это не просто таблицы, это сложная логика на встроенном языке. Всегда используйте HTTP-сервисы.
🌐 HTTP-сервис в 1С: как это устроено
В 1С есть механизм HTTP-сервисов (начиная с платформы 8.3.10). Вы описываете URL-шаблоны, методы (GET/POST) и привязываете к ним обработчики на встроенном языке.
// 1С: Модуль HTTP-сервиса "InvoiceService"
ПроцедураОбработкаЗапроса(Запрос, Ответ) Экспорт
// 1. Проверяем, что это POST-запрос Если Запрос.Метод <> "POST"Тогда
Ответ.УстановитьКодСостояния(405); // Method Not Allowed Возврат; КонецЕсли;
// 2. Читаем тело запроса (JSON)
ТелоЗапроса = Запрос.ПолучитьТело();
СтрокаJSON = ТелоЗапроса.Прочитать(); // Парсим JSON в структуру
Данные = ЧтениеJSON(СтрокаJSON);
// 5. Проверка на дубли ЕслиНайтиДубликат(Счет.Номер, Счет.Контрагент) Тогда
Ответ.УстановитьКодСостояния(409); // Conflict
Ответ.УстановитьТелоКакСтроку("Документ с таким номером уже существует"); Возврат; КонецЕсли;
// 7. Формируем ответ
Ответ.УстановитьКодСостояния(201); // Created
Ответ.УстановитьТелоКакСтроку( "{""status"": ""saved"", ""id"": " + Строка(Счет.Ссылка.УникальныйИдентификатор()) + "}"
);
КонецПроцедуры
🔧 Как опубликовать HTTP-сервис в 1С
Чтобы внешняя система (наш MCP-сервер) могла вызывать этот обработчик, нужно:
Создать HTTP-сервис в конфигураторе: раздел «Общие» → «HTTP-сервисы».
Описать шаблон URL: например, /invoice/save.
Привязать метод POST к процедуре ОбработкаЗапроса.
Опубликовать через веб-сервер (IIS / Apache) или встроенный веб-сервер 1С.
В итоге ваш MCP-сервер обращается по адресу: http://192.168.1.100:8080/1c/invoice/save
🧩 Где живёт бизнес-логика: Вся логика (проведение, расчёты, движение по регистрам) находится внутри 1С. MCP-сервер только передаёт сырые данные. Это правильно и безопасно.
🔌 Полный код MCP-сервера
Это сервер на Python, который регистрирует все инструменты (Tools) и слушает запросы от нейросети.
# mcp_server.py import asyncio, json, requests, re from mcp import Server import pdfplumber, paddleocr
server = Server("document-processor")
# ====== TOOL 1: OCR ====== @server.tool() async defocr_paddle(file_path: str) ->str:
ocr = paddleocr.PaddleOCR(use_angle_cls=True, lang='ru')
result = ocr.ocr(file_path, cls=True)
text = "" for line in result: for word_info in line:
text += word_info[1][0] + " " return text
# ====== TOOL 2: NLP через GigaChat ====== @server.tool() async defnlp_gigachat(text: str) ->dict:
prompt = f"""Извлеки из текста счета-фактуры:
номер, дата (ГГГГ-ММ-ДД), ИНН поставщика, название, сумма, НДС.
Текст: {text[:3000]}
Ответ дай в формате JSON."""
resp = requests.post("https://gigachat.ru/api/v1/completions",
headers={"Authorization": "Bearer YOUR_TOKEN"},
json={"prompt": prompt, "max_tokens": 500}) return resp.json()
# ====== TOOL 3: Проверка ИНН ====== @server.tool() async defcheck_inn(inn: str) ->bool: ifnot inn ornot inn.isdigit(): returnFalse if len(inn) == 10:
coeffs = [2, 4, 10, 3, 5, 9, 4, 6, 8]
control = sum(int(inn[i]) * coeffs[i] for i in range(9)) % 11 return control == int(inn[9]) or (control == 10and int(inn[9]) == 0) elif len(inn) == 12: # Аналогично для 12-значного ИНН returnTrue returnFalse
Нейросети передаётся промпт, в котором описаны все доступные инструменты и логика принятия решений. Она сама выбирает, что вызывать и в каком порядке.
# Промпт для нейросети-оркестратора
prompt = """
Ты — AI-агент по обработке входящих счетов-фактур.
Доступные инструменты (Tools) через MCP:
1. ocr_paddle(file_path) — распознаёт скан
2. nlp_gigachat(text) — извлекает данные
3. check_inn(inn) — проверяет ИНН
4. search_1c(doc_number, inn) — ищет дубли в 1С
5. save_1c(data) — сохраняет в 1С
6. send_email(to, subject, body) — отправляет письмо
Алгоритм:
- Определи тип файла (скан / текстовый PDF)
- Если скан → вызови ocr_paddle()
- Если текстовый PDF → прочитай напрямую через pdfplumber
- После получения текста → вызови nlp_gigachat()
- Проверь ИНН через check_inn()
- Если ИНН не прошёл → send_email() контрагенту с просьбой переслать
- Если ИНН прошёл → search_1c() на дубли
- Если дубли найдены → уведоми менеджера (Telegram / email)
- Если дублей нет → save_1c()
- Верни пользователю результат с меткой доверия
Входящий документ: {file_path}
"""
🏷️ Метки доверия
Нейросеть на основе анализа присваивает документу метку доверия, которая определяет дальнейшие действия:
🟢 Высокое
Текстовый PDF, ИНН ✅, дублей нет → Автосохранение
🟡 Среднее
Скан (DPI > 150), ИНН ✅ → Показать оператору
🔴 Низкое
Скан (DPI < 150), ИНН ❌ → Отправить на перескан
🚀 Пошаговый сценарий работы
1 📬 Письмо
→2 🐍 Парсер
→3 🧠 Решение
→4 🔧 OCR
→5 🔧 NLP
→6 🔧 Проверка
→7 🔧 1С
→8 ✅ Готово
1. 📬 Приходит письмо
Агент-парсер скачивает вложение и передаёт файл нейросети.
2. 🧠 Нейросеть анализирует
Определяет тип документа: скан или текстовый PDF.
3. 🔧 OCR (если нужно)
Вызывает ocr_paddle() через MCP, получает текст.
4. 🔧 Извлечение данных
Вызывает nlp_gigachat() → номер, дата, ИНН, сумма.
5. 🔧 Проверка ИНН
Вызывает check_inn(). Если не прошёл → письмо контрагенту.
6. 🔧 Поиск в 1С
Вызывает search_1c() через HTTP-сервис 1С.
7. 💾 Сохранение
Вызывает save_1c() → POST-запрос в 1С, документ проведён.
8. ✅ Готово
Оператор получает уведомление и нажимает «Подтвердить».
📊 Сравнение: HTTP-сервис vs Прямой SQL
Критерий
🌐 HTTP-сервис 1С
🗄️ Прямой SQL
Безопасность
✅ Высокая
⛔ Очень низкая
Бизнес-логика
✅ Соблюдается
⛔ Обходится
Целостность данных
✅ Гарантирована
⛔ Нарушается
Поддержка 1С
✅ Сохраняется
⛔ Потеря
Скорость
🟡 Средняя
🟢 Высокая
Сложность реализации
🟡 Средняя
🔴 Сложная (риск сломать)
💰 Стоимость внедрения
💻 Разработка
MCP-сервер: 50–100 ч
HTTP-сервис в 1С: 20–40 ч
Интеграция и тесты: 30–50 ч
Итого: 200–400 тыс. руб
☁️ Эксплуатация
Сервер с GPU: 15–20 тыс./мес
GigaChat API: ~200 руб/1000
Поддержка: 30–50 тыс./мес
💡 Окупаемость
4–6 месяцев
при 1000 документов/мес и экономии 2 операторов
📝 Чек-лист внедрения
Оцените объём документов и вариативность форматов.
Комментарии
Пока нет комментариев. Будьте первым!