惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
Y
Y Combinator Blog
罗磊的独立博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
Google DeepMind News
Google DeepMind News
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
云风的 BLOG
云风的 BLOG
Recorded Future
Recorded Future
N
News and Events Feed by Topic
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 【当耐特】
N
Netflix TechBlog - Medium
博客园 - 叶小钗
B
Blog
Vercel News
Vercel News
T
Tenable Blog
T
The Exploit Database - CXSecurity.com
Spread Privacy
Spread Privacy
T
Threat Research - Cisco Blogs
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Last Week in AI
Last Week in AI
F
Fortinet All Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Microsoft Security Blog
Microsoft Security Blog
S
Securelist
Microsoft Azure Blog
Microsoft Azure Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Palo Alto Networks Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
DataBreaches.Net
Cyberwarzone
Cyberwarzone
Engineering at Meta
Engineering at Meta
Martin Fowler
Martin Fowler
G
GRAHAM CLULEY
Project Zero
Project Zero
Cisco Talos Blog
Cisco Talos Blog
A
Arctic Wolf
C
CERT Recently Published Vulnerability Notes
L
LangChain Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Check Point Blog
A
About on SuperTechFans
W
WeLiveSecurity
The GitHub Blog
The GitHub Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
От ручного заполнения документов к автоматизации: как собрать генератор шаблонных договоров в Telegram на Python
florid696 · 2026-05-19 · via Все публикации подряд на Хабре

Коммерческие отделы ежедневно тратят много времени на ручное создание однотипных документов: копирование реквизитов из переписки, подстановка ФИО в нужном падеже, расчет графиков платежей, НДС и сумм прописью. Одна пропущенная цифра в ИНН или ошибка в склонении должности, и договор возвращается на доработку, а это задержка сделки.

В этой статье я покажу как собрал на Python Telegram-бота, который превращает 15-30 минут работы в ворде (борьбой с выравниваниями, шрифтами, отступами и пр.) в 5-минутный диалог. Никаких сложных CRM, никаких конструкторов с долгим обучением. Только async, последовательное управление состояниями, регулярные выражения и генерация готовых Word-файлов.

Архитектура решения

  • Интерфейс: Telegram Bot (python-telegram-bot v20+, асинхронный режим)

  • Управление состояниями: явное хранение шагов диалога в оперативной памяти с поддержкой возврата на предыдущий вопрос

  • Парсер реквизитов: регулярные выражения + правила для автоматического определения типа субъекта (ИП или ООО)

  • Генератор документа: docxtpl + шаблон .docx с динамическими блоками и вставкой внешних приложений

  • Запуск: облачный хостинг, секреты передаются через переменные окружения, корректное завершение работы при перезапуске

Ключевые технические решения

Telegram, очевидно, не сохраняет контекст переписки. А мне было необходимо собрать все ответы пользователя за итерацию, чтобы их аккуратно перенести в шаблон документа (предварительно размеченный). Для первой рабочей версии я реализовал явную машину состояний в оперативной памяти: каждый шаг фиксируется в словаре user_data[chat_id], а также реализовал команду возврата (/back), которая откатывает индексы и ответы пользователя. Это нужно для исправления ошибок ввода, которые часто видно сразу. То есть можно откатиться на шаг назад и исправить ответ.

# bot.py (фрагмент)
async def handle_back(update: Update, context: ContextTypes.DEFAULT_TYPE):
    chat_id = update.effective_chat.id
    state = user_data.get(chat_id)
    if not state: return
    
    step = state.get("step")
    if step == "main_flow":
        f_idx = state.get("flow_idx", 0)
        if f_idx > 0:
            # Удаляем текущий ответ, откатываем индекс
            curr_key = FLOW_STEPS[f_idx]
            state.pop(curr_key, None)
            state["flow_idx"] = f_idx - 1
            # Пропускаем лишние шаги, если они были скрыты логикой
            prev_key = FLOW_STEPS[state["flow_idx"]]
            if prev_key == "pay_date_3" and state.get("payment_type") == "50/50":
                state["flow_idx"] -= 1
                prev_key = FLOW_STEPS[state["flow_idx"]]
            await update.message.reply_text(QUESTIONS[prev_key])

Парсинг реквизитов

Менеджеры присылают реквизиты в произвольном виде: кто-то копирует из 1С, кто-то из мессенджера, кто-то копирует со скриншота с распознаванием текста. Парсер вытаскивает ИНН, ОГРН/ОГРНИП, КПП, расчётный и корреспондентский счета, БИК, email и адрес, автоматически определяя статус субъекта.

# requisites_parser.py (фрагмент)
def parse_requisites(text: str) -> dict:
    text = clean(text)
    data = {"company_name": text.split("\n")[0].strip() if text else ""}
    full_text = text
    
    # ИНН (10 или 12 цифр)
    m = re.search(r"(?i)ИНН\s*[:\-]?\s*(\d{10,12})", full_text)
    data["inn"] = m.group(1) if m else ""
    
    # ОГРН / ОГРНИП: определяем тип субъекта по длине числа
    m_ogrn = re.search(r"(?i)ОГРН(?:ИП)?\s*[:\-]?\s*(\d{13,15})", full_text)
    if m_ogrn:
        ogrn_val = m_ogrn.group(1)
        data["ogrn"] = ogrn_val
        data["is_ip"] = len(ogrn_val) == 15  # 15 цифр = ИП, 13 = ООО
    else:
        # Резервный вариант: ищем "ИП" в названии компании
        data["is_ip"] = "ИП " in data["company_name"].upper()
    # ... дальнейший парсинг КПП, счетов, БИК, Email, Адреса
    return data

Сейчас пользователю не нужно заполнять отдельные поля. Достаточно отправить текст с реквизитами в чат. Регулярные выражения покрывают ~95% случаев копипасты из различных источников.

Динамический расчёт платежей и НДС

В договорах часто меняются схемы оплаты и порядок оплат, ставки НДС и суммы. Логика полностью вынесена в Python, что исключает ошибки при ручном пересчёте в таблицах. Суммы прописью генерируются через num2words, НДС считается корректно в общей сумме контракта в зависимости от выбранной системы налогообложения.

Русская грамматика в преамбуле

Юридически корректная формулировка требует родительного падежа: в лице Генерального директора Иванова И.И.. Полноценная языковая модель здесь избыточна, поэтому я применил ручной подход: правила склонения + словари несклоняемых исключений.

def decline_fio(fio: str) -> str:
    parts = fio.strip().split()
    if len(parts) != 3: return fio
    surname, name, patronymic = parts
    is_female = patronymic.endswith(('вна', 'шна')) # надёжный маркер пола
    
    # Склонение фамилии по правилам + исключения
    if surname.endswith(("ова", "ева", "ина")): surname = surname[:-1] + "ой"
    elif not is_female and surname[-1] not in "аеёиоуыэюя": surname += "а"
    # ... аналогично для имени и отчества
    return f"{surname} {name} {patronymic}"

Это покрывает ~90% кейсов. Для нестандартных имен оставлены резервные варианты, да и ручная правка текста в готовом файле остается рабочим вариантом.

Результаты

  • Время создания документа: ~5 мин диалога vs 15–30 минут ручного заполнения

  • Ошибки в реквизитах и расчетах сведены к минимуму благодаря автоматической проверке и формулам

  • Бот размещен в облаке, потребление памяти <128MB, холодный старт <3 сек

  • Бот работает в привычном мессенджере, не требует установки дополнительного ПО, доступен с телефона

Планы на развитие

  1. Переход на вебхук + базу данных для хранения истории сессий и аудита изменений.

  2. Проверка ИНН/ОГРН через открытые интерфейсы ФНС для мгновенной верификации контрагентов.

  3. Поддержка экспорта в форматы электронного документооборота.

  4. Поддержка разных валют и многоязычных шаблонов для внешних контрактов.

  5. Публикация исходного кода после финальной чистки конфигураций.

Заключение

Автоматизация юридических и коммерческих процессов не обязательно требует сложных корпоративных конструкторов. Связка Telegram + асинхронный Python + регулярные выражения + docxtpl дала мне быстрый, надежный и недорогой инструмент, которым менеджеры начинают пользоваться в первый же день. Код легко адаптируется под любой шаблонный договор: достаточно обновить .docx и скорректировать маппинг полей в логике диалога.