<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Блог о ботах, парсинге и автоматизации — Тимур Семенеев</title>
    <link>https://tsemeneev.ru/blog/</link>
    <description>Статьи Тимура Семенеева о разработке чат-ботов для MAX и Telegram, мини-приложениях, парсинге сайтов и автоматической генерации документов: цены, инструкции, подводные камни.</description>
    <language>ru</language>
    <lastBuildDate>Mon, 02 Nov 2026 09:00:00 +0000</lastBuildDate>
    <atom:link href="https://tsemeneev.ru/blog/rss.xml" rel="self" type="application/rss+xml"/>
    <image><url>https://tsemeneev.ru/icon-192.png</url><title>Блог о ботах, парсинге и автоматизации — Тимур Семенеев</title><link>https://tsemeneev.ru/blog/</link></image>
    <item>
      <title>Сколько стоит разработать чат-бота для MAX в 2026 году</title>
      <link>https://tsemeneev.ru/blog/skolko-stoit-bot-max/</link>
      <guid isPermaLink="true">https://tsemeneev.ru/blog/skolko-stoit-bot-max/</guid>
      <pubDate>Mon, 02 Nov 2026 09:00:00 +0000</pubDate>
      <dc:creator>Тимур Семенеев</dc:creator>
      <category>MAX</category>
      <category>чат-боты</category>
      <category>цены</category>
      <description>Разбираю, из чего складывается цена бота для MAX, какие вилки встречаются на рынке, сколько стоит содержание после запуска и где можно сэкономить без потери качества.</description>
      <enclosure url="https://tsemeneev.ru/blog/og/skolko-stoit-bot-max.jpg" type="image/jpeg" length="0"/>
      <content:encoded><![CDATA[<p>«Сколько стоит бот?» — самый частый вопрос, и честный ответ на него звучит скучно: зависит от задачи. Но «зависит» не значит «невозможно оценить». Цена бота складывается из понятных частей, и если разобрать их по отдельности, вилку можно назвать ещё до подробного ТЗ.</p>
<p>Ниже — ориентиры на ноябрь 2026 года, особенности MAX, которые влияют на бюджет, и список того, что стоит подготовить до разговора с разработчиком.</p>
<h2 id="korotkiy-otvet-orientirovochnye-vilki">Короткий ответ: ориентировочные вилки</h2>
<p>Я собрал диапазоны из опубликованных прайсов нескольких студий и частных разработчиков, которые делают ботов для MAX. Это не прайс-лист и не «средняя цена по рынку» — просто рамки, в которые попадает большинство предложений.</p>
<div class="table"><table>
<thead>
<tr>
<th>Что за бот</th>
<th>Что умеет</th>
<th>Ориентировочно</th>
</tr>
</thead>
<tbody>
<tr>
<td>Перенос готового Telegram-бота</td>
<td>Те же сценарии, адаптация под MAX Bot API</td>
<td>от 15–50 тыс. ₽</td>
</tr>
<tr>
<td>Бот для заявок и записи</td>
<td>Меню на кнопках, анкета, уведомления менеджеру</td>
<td>25–120 тыс. ₽</td>
</tr>
<tr>
<td>Бот с интеграциями</td>
<td>CRM, Google Таблицы, рассылки, простая админка</td>
<td>90–250 тыс. ₽</td>
</tr>
<tr>
<td>Бот с приёмом оплаты</td>
<td>Предоплата через платёжный сервис, статусы, чеки</td>
<td>от 120 тыс. ₽</td>
</tr>
<tr>
<td>Бот-магазин</td>
<td>Каталог, корзина, оплата, управление товарами</td>
<td>150 тыс. – 1,5 млн ₽</td>
</tr>
<tr>
<td>Мини-приложение в MAX</td>
<td>Свой интерфейс внутри мессенджера</td>
<td>от 50–100 тыс. ₽ до 2 млн ₽</td>
</tr>
<tr>
<td>Бот с нейросетью</td>
<td>Ответы по базе знаний, GigaChat или YandexGPT</td>
<td>от 100–120 тыс. ₽</td>
</tr>
</tbody>
</table></div>
<p>Разброс внутри строки огромный, и это нормально. Нижняя граница — обычно частный разработчик и минимальный объём: один сценарий, без админки, без сложных интеграций. Верхняя — студия, отдельные аналитик, дизайнер и тестировщик, SLA и нагрузка в тысячи пользователей одновременно.</p>
<blockquote class="note"><p><strong>Важно.</strong> Это ориентиры по открытым прайсам, а не обещание цены. Точная сумма появляется только после разбора задачи.</p>
</blockquote>
<h2 id="iz-chego-skladyvaetsya-tsena">Из чего складывается цена</h2>
<p>Если разложить смету на части, почти любой бот собирается из одних и тех же блоков. Чем больше блоков и чем они глубже, тем дороже.</p>
<h3 id="stsenarii">Сценарии</h3>
<p>Сценарий — это путь пользователя: что бот спрашивает, какие кнопки показывает, что делает при неверном ответе. Пять экранов с кнопками и анкета из пяти вопросов — это немного. Сложнее, когда появляются ветвления, возврат на шаг назад, проверка ввода (телефон, email, сумма «150к» вместо «150 000»), черновики и напоминания тем, кто бросил анкету на середине.</p>
<p>На сценарии уходит больше времени, чем кажется: тексты, состояния, обработка ошибок. Зато именно здесь решается, будет бот удобным или раздражающим.</p>
<h3 id="integratsii">Интеграции</h3>
<p>Обычно это самая дорогая часть. Бот, который просто пересылает заявку в чат менеджеру, стоит заметно дешевле бота, который создаёт сделку в amoCRM или Битрикс24, проверяет дубли контактов, ставит ответственного и потом получает обратно смену статуса.</p>
<p>Каждая связка с внешней системой — это авторизация, обработка ошибок, повтор при сбоях и логирование. Если у системы нет нормального API, интеграция легко становится дороже всего остального бота.</p>
<h3 id="oplata">Оплата</h3>
<p>Приём денег добавляет платёжный сервис, проверку уведомлений об оплате, статусы заказа, возвраты и чеки. В MAX оплату обычно ведут на страницу платёжного сервиса через кнопку-ссылку, а результат бот получает от сервиса по вебхуку. Сам сценарий несложный, но ошибки здесь стоят денег, поэтому его аккуратно тестируют.</p>
<h3 id="adminka-i-otchety">Админка и отчёты</h3>
<p>Кому-то хватает команды <code>/stats</code> и уведомлений в рабочий чат. Кому-то нужна веб-панель: список заявок, фильтры, выгрузка в Excel, редактирование каталога и текстов без программиста. Полноценная админка иногда сопоставима по объёму с самим ботом.</p>
<h3 id="dokumenty-i-fayly">Документы и файлы</h3>
<p>Бот может собирать анкету или счёт в PDF и отправлять его прямо в чат. Это отдельный модуль с шаблоном, шрифтами и форматированием. Подробнее — в статье про <a href="https://tsemeneev.ru/blog/generaciya-dokumentov-pdf/">автоматическую генерацию документов</a>.</p>
<h3 id="mini-prilozhenie">Мини-приложение</h3>
<p>Когда кнопок мало — каталог на сотню товаров, календарь, конструктор, — к боту добавляют мини-приложение: веб-интерфейс, который открывается внутри MAX. По сути это отдельный фронтенд с дизайном и вёрсткой, поэтому цена растёт заметно.</p>
<h2 id="chto-v-max-vliyaet-na-byudzhet">Что в MAX влияет на бюджет</h2>
<p>Технически бот для MAX похож на бота для Telegram, но у платформы есть свои правила. Они не делают разработку в разы дороже, но их стоит учесть заранее.</p>
<p><strong>Бота создаёт бизнес, а не разработчик.</strong> Подключиться к платформе MAX для партнёров могут юрлица, ИП и самозанятые — резиденты РФ. Профиль нужно верифицировать: через Госуслуги или банковские сервисы T-Business ID и Alfa ID. Физическим лицам и нерезидентам верификация пока недоступна. Значит, бот регистрируется на вашу организацию, а разработчику вы передаёте токен.</p>
<p><strong>Модерация.</strong> Каждый новый бот проходит проверку — по документации до 48 часов в рабочие дни. Это не влияет на цену, но влияет на сроки: закладывайте пару дней до запуска.</p>
<p><strong>Вебхуки только по HTTPS.</strong> Для рабочего бота MAX рекомендует получать события через вебхук, а Long Polling оставить для разработки и тестов. Адрес вебхука должен работать по HTTPS на порту 443 с сертификатом доверенного центра (подходят и сертификаты Минцифры), самоподписанные не принимаются. На практике это значит: нужен сервер с доменом и нормальным сертификатом. Это недорого, но это строка в бюджете.</p>
<p><strong>Лимиты.</strong> Не больше 30 запросов в секунду к API и не больше двух сообщений в секунду в один чат. Для обычного бота это не проблема. Для рассылки на несколько тысяч человек нужна очередь, и её закладывают в архитектуру сразу.</p>
<p><strong>API ещё меняется.</strong> За 2026 год в API MAX сменился основной домен (теперь <code>platform-api2.max.ru</code>), токен перестали принимать в параметрах запроса — только в заголовке <code>Authorization</code>, а метод <code>GET /chats</code> с июня больше не поддерживается. Поэтому сопровождение для бота в MAX — не формальность: кто-то должен следить за изменениями и вовремя обновлять код.</p>
<h2 id="rashody-posle-zapuska">Расходы после запуска</h2>
<p>Разработку оплачивают один раз, но бот продолжает стоить денег и после запуска. Ориентиры:</p>
<ul>
<li><strong>Сервер.</strong> Простому боту хватает небольшого VPS — от нескольких сотен до 2–3 тысяч рублей в месяц. Ботам с нейросетью и тяжёлыми задачами нужно больше.</li>
<li><strong>Домен и сертификат.</strong> Домен в зоне .ru — от нескольких сотен рублей в год, сертификат Let&rsquo;s Encrypt бесплатный.</li>
<li><strong>Сопровождение.</strong> Мониторинг, обновления под изменения API, мелкие правки — у разных исполнителей от 10 до 30 тысяч рублей в месяц. Некоторые боты первое время обходятся без постоянного сопровождения и правятся разово.</li>
<li><strong>Внешние сервисы.</strong> Запросы к нейросети, SMS, комиссия платёжного сервиса — вы платите им напрямую, в смету разработки это обычно не входит.</li>
</ul>
<h2 id="kak-sekonomit-i-ne-pozhalet">Как сэкономить и не пожалеть</h2>
<p><strong>Начните с MVP.</strong> Сделайте один главный сценарий — например, запись или заявку — и запустите его. Через месяц будет видно, что люди реально нажимают, а что можно не делать вовсе.</p>
<p><strong>Один бэкенд для Telegram и MAX.</strong> Если бот нужен в обоих мессенджерах, логику пишут один раз, а разными остаются только адаптеры под API. Это дешевле двух отдельных ботов: по прайсам студий второй мессенджер добавляет примерно 30–40% к цене одного бота, а не все 100%.</p>
<p><strong>Не делайте мини-приложение раньше времени.</strong> Кнопки в MAX покрывают многое: ссылки, запрос контакта и геолокации, быстрые ответы, копирование промокода. Мини-приложение нужно, когда интерфейс действительно не помещается в чат.</p>
<p><strong>Описанный процесс дешевле.</strong> Если вы знаете, кто обрабатывает заявку, какие поля нужны в CRM и что происходит после оплаты, разработчику не придётся додумывать это за вас — и это время не попадёт в счёт.</p>
<p><strong>Код и доступы — у вас.</strong> Это не про экономию сегодня, а про то, чтобы не платить дважды завтра. Бот зарегистрирован на вашу организацию, сервер и репозиторий — на ваш аккаунт.</p>
<h2 id="chto-podgotovit-do-razgovora-s-razrabotchikom">Что подготовить до разговора с разработчиком</h2>
<p>Чтобы оценка была точной, а не «от 50 до 500 тысяч», достаточно ответить на несколько вопросов:</p>
<ol>
<li>Какую задачу решает бот и как вы поймёте, что он работает? Например: «заявки перестали теряться», «менеджер тратит меньше времени на одни и те же вопросы».</li>
<li>Кто им пользуется: клиенты, сотрудники или и те, и другие?</li>
<li>Основной сценарий по шагам — хоть списком в заметках.</li>
<li>С какими системами нужна связь: CRM, таблицы, платёжный сервис, сайт.</li>
<li>Нужна ли оплата, документы, рассылки, админка.</li>
<li>Есть ли верифицированный профиль организации на платформе MAX для партнёров.</li>
<li>Нужен ли бот ещё и в Telegram.</li>
</ol>
<h2 id="kak-vyglyadit-bot-srednego-urovnya">Как выглядит бот среднего уровня</h2>
<p>Чтобы было понятнее, о каком объёме речь, посмотрите мой демо-проект «Виртуальный рекрутер» — бота для MAX. Это не заказ клиента, а демо: вакансии и компании вымышлены. Зато бот работает, и весь путь кандидата можно пройти самому:</p>
<ul>
<li>меню на inline-кнопках, где сообщения редактируются, а не копятся в чате;</li>
<li>каталог вакансий с фильтрами и пагинацией;</li>
<li>скрининг из восьми шагов с проверкой ввода, кнопками «Назад» и «Отмена»;</li>
<li>расчёт процента совпадения с вакансией и анкета кандидата в PDF прямо в чат;</li>
<li>команды и уведомления для администратора.</li>
</ul>
<p>По набору функций это бот с несколькими сценариями, генерацией документов и простой админкой — то есть середина таблицы выше. Хорошая точка отсчёта, чтобы понять, что из этого нужно именно вам.</p>
<h2 id="chastye-voprosy">Частые вопросы</h2>
<h3 id="bot-dlya-max-dorozhe-chem-dlya-telegram">Бот для MAX дороже, чем для Telegram?</h3>
<p>По самой разработке — примерно так же, логика одна и та же. Разница в инфраструктуре и сопровождении: верификация бизнеса, модерация, требования к вебхукам и API, которое пока чаще меняется. Некоторые студии закладывают за это наценку.</p>
<h3 id="mozhno-li-oboytis-konstruktorom">Можно ли обойтись конструктором?</h3>
<p>Для простых сценариев — да, у MAX есть конструкторы без кода. Ограничения начинаются, когда нужны нестандартная логика, интеграции и собственные данные. Тогда бота пишут на коде через Bot API.</p>
<h3 id="skol-ko-dlitsya-razrabotka">Сколько длится разработка?</h3>
<p>Простой бот — от одной-двух недель, бот с интеграциями — от трёх-четырёх, магазин или мини-приложение — от месяца. Плюс до 48 рабочих часов на модерацию.</p>
<p>Если хотите прикинуть бюджет под свою задачу, напишите мне — разберу сценарий и назову честную вилку.</p>]]></content:encoded>
    </item>
    <item>
      <title>Бот в MAX для бизнеса: как подключить и что он умеет</title>
      <link>https://tsemeneev.ru/blog/bot-max-dlya-biznesa/</link>
      <guid isPermaLink="true">https://tsemeneev.ru/blog/bot-max-dlya-biznesa/</guid>
      <pubDate>Mon, 02 Nov 2026 09:00:00 +0000</pubDate>
      <dc:creator>Тимур Семенеев</dc:creator>
      <category>MAX</category>
      <category>чат-боты</category>
      <category>инструкция</category>
      <description>Кто может завести бота в MAX, как пройти верификацию и модерацию, что умеет MAX Bot API и какие сценарии в нём удобно делать бизнесу. По официальной документации на ноябрь 2026 года.</description>
      <enclosure url="https://tsemeneev.ru/blog/og/bot-max-dlya-biznesa.jpg" type="image/jpeg" length="0"/>
      <content:encoded><![CDATA[<p>MAX — российский мессенджер, в котором у бизнеса есть свои инструменты: каналы, мини-приложения и чат-боты. Боты в MAX устроены похоже на Telegram, но порядок подключения другой: бот привязан к проверенной организации, а не к случайному аккаунту.</p>
<p>Ниже — как это работает на практике. Всё сверено с документацией на dev.max.ru на начало ноября 2026 года. Платформа активно развивается, поэтому детали могут меняться — перед запуском стоит сверить их ещё раз.</p>
<h2 id="kto-mozhet-zavesti-bota">Кто может завести бота</h2>
<p>Подключиться к платформе <strong>MAX для партнёров</strong> и её сервисам — ботам, мини-приложениям, каналам — могут юрлица, ИП и самозанятые, которые являются резидентами РФ. Физическим лицам и нерезидентам верификация пока недоступна.</p>
<p>Количество ботов зависит от типа профиля:</p>
<div class="table"><table>
<thead>
<tr>
<th>Профиль</th>
<th>Сколько ботов можно создать</th>
</tr>
</thead>
<tbody>
<tr>
<td>Организация или ИП</td>
<td>5</td>
</tr>
<tr>
<td>Самозанятый</td>
<td>2</td>
</tr>
</tbody>
</table></div>
<p>Отсюда практический вывод: если бота вам делает подрядчик, регистрировать его нужно на свою организацию. Разработчику вы передаёте токен — это ключ доступа к API, — а сам бот и его аудитория остаются вашими.</p>
<h2 id="kak-podklyuchit-bota-po-shagam">Как подключить бота: по шагам</h2>
<h3 id="1-registratsiya-na-platforme">1. Регистрация на платформе</h3>
<p>Войти на платформу MAX для партнёров можно двумя способами: через веб-версию или через мини-приложение «MAX для бизнеса» внутри мессенджера. Шаги в обоих вариантах совпадают.</p>
<h3 id="2-profil-i-verifikatsiya">2. Профиль и верификация</h3>
<p>После регистрации создаётся профиль организации, ИП или самозанятого, и его нужно верифицировать. Для организаций и ИП доступны Госуслуги и банковские сервисы T-Business ID и Alfa ID; через банковские сервисы — пока только в веб-версии.</p>
<p>Верификацию от имени организации может пройти только её руководитель (единоличный исполнительный орган) или представитель с правом первой или единственной подписи. Если бота делает сотрудник или подрядчик, этот шаг всё равно проходит руководитель.</p>
<h3 id="3-sozdanie-bota">3. Создание бота</h3>
<p>В разделе «Чат-боты» нажимаете «Создать» и заполняете карточку:</p>
<ul>
<li><strong>логотип</strong> 500×500 px, JPG или PNG, до 5 МБ;</li>
<li><strong>название</strong> до 59 символов: кириллица, латиница, цифры, без эмодзи;</li>
<li><strong>описание</strong> до 200 символов: что бот делает, график работы оператора, контакты поддержки.</li>
</ul>
<p><strong>Никнейм</strong> пока формируется автоматически: <code>idИНН_bot</code> для юрлиц и ИП и <code>se…_bot</code> для самозанятых. Выбрать или изменить его пока нельзя. В логотипе и текстах запрещены ненормативная лексика, контент 18+ и данные других компаний, а описание должно соответствовать деятельности организации.</p>
<h3 id="4-moderatsiya">4. Модерация</h3>
<p>После создания бот получает статус «на модерации». По документации проверка занимает до 48 часов по рабочим дням. После неё бот получает статус «создан», и пользователи могут найти его по никнейму.</p>
<h3 id="5-token">5. Токен</h3>
<p>Токен находится на платформе: «Чат-боты» → нужный бот → ⋮ → «Настройки». Если бот создан в мини-приложении «MAX для бизнеса», токен можно получить там же или командой в боте «MAX для бизнеса». Токен никому не пересылайте в открытых чатах: тот, у кого он есть, управляет ботом.</p>
<h2 id="dva-puti-konstruktor-ili-kod">Два пути: конструктор или код</h2>
<p>Простой сценарий можно собрать <strong>без программирования</strong>: у MAX есть конструкторы с готовыми решениями. Это подходит для FAQ, сбора заявок и простой записи.</p>
<p>Когда нужны своя логика, база данных, интеграции с CRM или оплата, бота пишут на коде через <strong>MAX Bot API</strong>. У MAX есть официальные библиотеки для JavaScript/TypeScript (<code>@maxhub/max-bot-api</code>) и Go, а также спецификация OpenAPI — по ней можно сгенерировать клиент для Python, PHP, C# и других языков. Можно работать и с API напрямую: это обычные HTTPS-запросы с JSON.</p>
<h2 id="kak-ustroen-max-bot-api">Как устроен MAX Bot API</h2>
<h3 id="zaprosy-i-avtorizatsiya">Запросы и авторизация</h3>
<p>Базовый адрес API — <code>https://platform-api2.max.ru/</code>. Старый домен <code>platform-api.max.ru</code> документация просит заменить. Токен передаётся в заголовке <code>Authorization</code>; в параметрах запроса его больше не принимают.</p>
<p>Проверить, что токен рабочий, можно одним запросом:</p>
<div class="hl"><pre><span></span><code>curl<span class="w"> </span>-X<span class="w"> </span>GET<span class="w"> </span><span class="s2">"https://platform-api2.max.ru/me"</span><span class="w"> </span><span class="se">\</span>
<span class="w">  </span>-H<span class="w"> </span><span class="s2">"Authorization: &lt;токен бота&gt;"</span>
</code></pre></div>

<p>В ответ придёт информация о боте: идентификатор, имя, никнейм.</p>
<h3 id="otpravka-soobscheniya-s-knopkami">Отправка сообщения с кнопками</h3>
<p>Сообщения отправляются методом <code>POST /messages</code>. Получателя указывают в параметрах: <code>user_id</code> для личного диалога или <code>chat_id</code> для чата или канала. Кнопки — это вложение типа <code>inline_keyboard</code>:</p>
<div class="hl"><pre><span></span><code><span class="p">{</span>
<span class="w">  </span><span class="nt">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Здравствуйте! Чем помочь?"</span><span class="p">,</span>
<span class="w">  </span><span class="nt">"attachments"</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span>
<span class="w">    </span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"inline_keyboard"</span><span class="p">,</span>
<span class="w">    </span><span class="nt">"payload"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">      </span><span class="nt">"buttons"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w">        </span><span class="p">[{</span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"callback"</span><span class="p">,</span><span class="w"> </span><span class="nt">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Записаться"</span><span class="p">,</span><span class="w"> </span><span class="nt">"payload"</span><span class="p">:</span><span class="w"> </span><span class="s2">"book"</span><span class="p">}],</span>
<span class="w">        </span><span class="p">[{</span><span class="nt">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"link"</span><span class="p">,</span><span class="w"> </span><span class="nt">"text"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Наш сайт"</span><span class="p">,</span><span class="w"> </span><span class="nt">"url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.ru"</span><span class="p">}]</span>
<span class="w">      </span><span class="p">]</span>
<span class="w">    </span><span class="p">}</span>
<span class="w">  </span><span class="p">}]</span>
<span class="p">}</span>
</code></pre></div>

<p>Текст сообщения — до 4000 символов. Отправлять можно не больше двух сообщений в секунду в один чат, а всего к API — не больше 30 запросов в секунду. Для рассылок это значит одно: нужна очередь.</p>
<h3 id="vebhuki-i-long-polling">Вебхуки и Long Polling</h3>
<p>Бот узнаёт о действиях пользователей двумя способами:</p>
<ul>
<li><strong>Webhook</strong> — MAX сам присылает событие на ваш сервер. Подписка настраивается методом <code>POST /subscriptions</code>. Для рабочих ботов документация рекомендует именно его.</li>
<li><strong>Long Polling</strong> — бот сам опрашивает <code>GET /updates</code>. Способ ограничен по скорости и сроку хранения событий, поэтому подходит только для разработки и тестов.</li>
</ul>
<p>Одновременно использовать оба нельзя. Требования к вебхуку строгие: HTTPS на порту 443, сертификат доверенного центра или Минцифры, полная цепочка сертификатов, совпадение домена с сертификатом. HTTP и самоподписанные сертификаты не поддерживаются. Если при подписке указать <code>secret</code>, MAX будет присылать его в заголовке <code>X-Max-Bot-Api-Secret</code> — по нему сервер проверяет, что запрос пришёл именно от MAX.</p>
<h2 id="chto-umeet-bot-v-max">Что умеет бот в MAX</h2>
<h3 id="sem-tipov-knopok">Семь типов кнопок</h3>
<p>Под сообщением можно разместить до 210 кнопок: до 30 рядов, до 7 кнопок в ряду. Для кнопок-ссылок, запроса контакта, геолокации и открытия мини-приложения — не больше 3 в ряду.</p>
<div class="table"><table>
<thead>
<tr>
<th>Кнопка</th>
<th>Что делает</th>
<th>Пример</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>callback</code></td>
<td>Отправляет боту событие</td>
<td>Выбрать услугу, подтвердить запись</td>
</tr>
<tr>
<td><code>link</code></td>
<td>Открывает ссылку</td>
<td>Страница оплаты, сайт, каталог</td>
</tr>
<tr>
<td><code>request_contact</code></td>
<td>Запрашивает номер телефона</td>
<td>Регистрация, программа лояльности</td>
</tr>
<tr>
<td><code>request_geo_location</code></td>
<td>Запрашивает геолокацию</td>
<td>Ближайший филиал, доставка</td>
</tr>
<tr>
<td><code>open_app</code></td>
<td>Открывает мини-приложение</td>
<td>Каталог, калькулятор, календарь</td>
</tr>
<tr>
<td><code>message</code></td>
<td>Отправляет заранее заданный текст</td>
<td>Быстрые ответы</td>
</tr>
<tr>
<td><code>clipboard</code></td>
<td>Копирует текст в буфер</td>
<td>Промокод, трек-номер, реквизиты</td>
</tr>
</tbody>
</table></div>
<p>У кнопки <code>request_contact</code> есть полезная деталь: в сообщении с контактом приходит поле <code>hash</code>, по которому можно проверить, что человек поделился именно тем номером, который привязан к его аккаунту. Это позволяет использовать номер для регистрации. Но правила платформы ограничивают такие данные: использовать их можно только для работы с текущим ботом.</p>
<h3 id="diplinki">Диплинки</h3>
<p>Ссылка вида <code>https://max.ru/&lt;никнейм_бота&gt;?start=&lt;payload&gt;</code> открывает бота и передаёт ему параметр длиной до 128 символов. Бот получает событие <code>bot_started</code> с этим значением. Отсюда сценарии:</p>
<ul>
<li>QR-код на столике или в чеке ведёт в бота с номером заведения — бот сразу предлагает оставить отзыв;</li>
<li>кнопка «Отследить заказ» на сайте открывает бота с номером заказа, и он сразу показывает статус;</li>
<li>разные ссылки для разных площадок показывают, откуда пришли пользователи.</li>
</ul>
<p>Конфиденциальные данные в payload в открытом виде передавать нельзя — только одноразовые токены или закодированные идентификаторы. Отправлять через диплинки авторизационные сообщения правила тоже запрещают.</p>
<h3 id="fayly-i-redaktirovanie-soobscheniy">Файлы и редактирование сообщений</h3>
<p>Через <code>POST /uploads</code> бот загружает изображения, видео и файлы и прикрепляет их к сообщениям: так приходят PDF-анкеты, счета и договоры. Отправленные сообщения можно редактировать и удалять, поэтому меню не обязано копиться в чате: бот обновляет одно и то же сообщение.</p>
<h3 id="gruppovye-chaty-i-kanaly">Групповые чаты и каналы</h3>
<p>Бота можно добавить в групповой чат или канал. В чате он принимает команды и присылает уведомления — например, о новых заявках в рабочую группу менеджеров. В канале публикует посты. По умолчанию добавление в групповые чаты выключено, его включают в настройках приватности после модерации. Чтобы бот видел сообщения и мог отвечать, ему нужны как минимум права <code>read_all_messages</code> и <code>write</code>.</p>
<h3 id="mini-prilozheniya">Мини-приложения</h3>
<p>Когда кнопок не хватает, к боту подключают мини-приложение — веб-интерфейс, который открывается внутри MAX кнопкой <code>open_app</code>. Это тот же подход, что и Telegram Mini Apps: обычная веб-разработка плюс проверка данных пользователя на сервере. О том, как это устроено, — в статье про <a href="https://tsemeneev.ru/blog/telegram-mini-app-dlya-kafe/">Mini App для кафе и магазина</a>.</p>
<h2 id="stsenarii-kotorye-horosho-lozhatsya-na-bota">Сценарии, которые хорошо ложатся на бота</h2>
<ul>
<li><strong>Запись и заявки.</strong> Выбор услуги, даты и времени кнопками, подтверждение и напоминание накануне.</li>
<li><strong>Статус заказа.</strong> Диплинк с номером заказа с сайта или из SMS, уведомления о смене статуса.</li>
<li><strong>Поддержка.</strong> Ответы на частые вопросы кнопками и передача сложного вопроса оператору в рабочий чат.</li>
<li><strong>Документы.</strong> Счёт, договор или анкета в PDF прямо в чат — без почты и ручной сборки.</li>
<li><strong>Подбор персонала.</strong> Каталог вакансий, скрининг кандидата, анкета в PDF и уведомления рекрутеру. Так устроен мой демо-бот «Виртуальный рекрутер» — его можно открыть в MAX и пройти весь путь кандидата самому. Вакансии в нём вымышлены, это демонстрация, а не работа для клиента.</li>
<li><strong>Внутренние задачи.</strong> Уведомления сотрудникам, сбор отчётов, согласования в групповом чате.</li>
</ul>
<h2 id="chastye-oshibki-pri-zapuske">Частые ошибки при запуске</h2>
<ol>
<li><strong>Бот зарегистрирован не на того.</strong> Если бота заводит подрядчик на свой профиль, вы зависите от него. Профиль и бот должны принадлежать вашей организации.</li>
<li><strong>Long Polling в продакшене.</strong> Для отладки удобно, для живого бота — нет: события теряются и приходят с задержкой.</li>
<li><strong>Рассылка без очереди.</strong> Ограничение в два сообщения в секунду на чат и 30 запросов в секунду на API быстро даёт о себе знать.</li>
<li><strong>Не учли модерацию.</strong> Запуск «завтра утром» не получится, если бот ещё не прошёл проверку.</li>
<li><strong>Нет сопровождения.</strong> API меняется: за 2026 год сменился домен, способ передачи токена, а часть методов перестала поддерживаться. Кто-то должен следить за этим и обновлять бота.</li>
</ol>
<h2 id="chto-dal-she">Что дальше</h2>
<p>Если вы только присматриваетесь к MAX, начните с одного сценария: заявки, записи или статуса заказа. Сколько это может стоить и из чего складывается цена, я разобрал в статье <a href="https://tsemeneev.ru/blog/skolko-stoit-bot-max/">«Сколько стоит разработать чат-бота для MAX»</a>.</p>
<p>А если хотите понять, как бот впишется в ваши процессы, напишите — посмотрю на задачу и предложу, с чего начать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Telegram Mini App для кафе и магазина: как устроено и зачем</title>
      <link>https://tsemeneev.ru/blog/telegram-mini-app-dlya-kafe/</link>
      <guid isPermaLink="true">https://tsemeneev.ru/blog/telegram-mini-app-dlya-kafe/</guid>
      <pubDate>Mon, 02 Nov 2026 09:00:00 +0000</pubDate>
      <dc:creator>Тимур Семенеев</dc:creator>
      <category>Telegram</category>
      <category>мини-приложения</category>
      <category>чат-боты</category>
      <description>Разбираю, что такое мини-приложение в Telegram, как оно технически устроено, что даёт кафе и магазину и о чём стоит подумать в 2026 году, когда Telegram в России работает с перебоями.</description>
      <enclosure url="https://tsemeneev.ru/blog/og/telegram-mini-app-dlya-kafe.jpg" type="image/jpeg" length="0"/>
      <content:encoded><![CDATA[<p>Mini App — это веб-приложение, которое открывается прямо внутри Telegram. Гость кафе нажимает кнопку в боте, видит меню с фотографиями, собирает заказ и выбирает время самовывоза. Ему не нужно ставить приложение, регистрироваться и вводить телефон — он уже в мессенджере.</p>
<p>Для бизнеса это способ сделать «своё приложение» без публикации в магазинах приложений. Ниже — как это устроено, зачем это кафе и магазину и где подводные камни.</p>
<h2 id="chem-mini-app-otlichaetsya-ot-bota-i-sayta">Чем Mini App отличается от бота и сайта</h2>
<p><strong>Обычный бот</strong> общается сообщениями и кнопками. Для записи или анкеты этого достаточно, но меню на 40 позиций с модификаторами в чате превращается в бесконечную ленту.</p>
<p><strong>Сайт</strong> даёт полную свободу, но гостя туда нужно привести, а потом ещё и вернуть: заказ, статус, повторная покупка — всё через почту или SMS.</p>
<p><strong>Mini App</strong> — это сайт, который живёт внутри бота. Интерфейс как у приложения, а уведомления, статус заказа и повторные покупки — через чат с ботом, который у гостя уже есть.</p>
<h2 id="kak-mini-app-otkryvaetsya">Как Mini App открывается</h2>
<p>Telegram поддерживает несколько способов запуска. Для кафе и магазина полезны четыре:</p>
<ul>
<li><strong>кнопка меню</strong> в чате с ботом — постоянная точка входа, например «Меню»;</li>
<li><strong>кнопка под сообщением</strong> — «Открыть каталог» в приветствии или в рассылке;</li>
<li><strong>главное мини-приложение</strong> — кнопка запуска в профиле бота и ссылка вида <code>https://t.me/имя_бота?startapp</code>;</li>
<li><strong>прямая ссылка</strong> вида <code>https://t.me/имя_бота/имя_приложения</code> — её удобно ставить в QR-код на столике или кассе.</li>
</ul>
<p>В ссылке можно передать параметр <code>startapp</code>, например номер стола или точки. Он придёт в мини-приложение, и оно сразу откроется в нужном состоянии.</p>
<h2 id="kak-eto-ustroeno-tehnicheski">Как это устроено технически</h2>
<h3 id="frontend">Фронтенд</h3>
<p>Это обычная веб-страница на HTML, CSS и JavaScript — на чистом JS или на любом фреймворке. Чтобы связать её с Telegram, подключают скрипт <code>telegram-web-app.js</code>. После этого доступен объект <code>Telegram.WebApp</code>, через который приложение:</p>
<ul>
<li>получает тему пользователя — светлую или тёмную и цвета — и подстраивается под неё;</li>
<li>управляет нативными кнопками: главной кнопкой внизу экрана (<code>MainButton</code>) и кнопкой «Назад» в шапке;</li>
<li>включает вибрацию при нажатиях (<code>HapticFeedback</code>);</li>
<li>учитывает безопасные зоны экрана в полноэкранном режиме;</li>
<li>получает данные пользователя в поле <code>initData</code>.</li>
</ul>
<h3 id="bekend-i-proverka-initdata">Бэкенд и проверка initData</h3>
<p>Главное правило: <strong>данным из браузера доверять нельзя</strong>. В <code>initData</code> приходят идентификатор пользователя, имя и подпись. Сервер обязан проверить подпись, прежде чем принимать заказ. Документация Telegram описывает алгоритм: из токена бота и строки <code>WebAppData</code> получают секретный ключ, затем считают HMAC-SHA-256 от отсортированных полей и сравнивают с переданным <code>hash</code>.</p>
<p>На Python это выглядит примерно так:</p>
<div class="hl"><pre><span></span><code><span class="kn">import</span><span class="w"> </span><span class="nn">hmac</span><span class="o">,</span><span class="w"> </span><span class="nn">hashlib</span><span class="o">,</span><span class="w"> </span><span class="nn">time</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">urllib.parse</span><span class="w"> </span><span class="kn">import</span> <span class="n">parse_qsl</span>

<span class="k">def</span><span class="w"> </span><span class="nf">check_init_data</span><span class="p">(</span><span class="n">init_data</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">bot_token</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">max_age</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">3600</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
    <span class="n">fields</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="n">parse_qsl</span><span class="p">(</span><span class="n">init_data</span><span class="p">,</span> <span class="n">keep_blank_values</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
    <span class="n">received_hash</span> <span class="o">=</span> <span class="n">fields</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s2">"hash"</span><span class="p">,</span> <span class="s2">""</span><span class="p">)</span>
    <span class="n">data_check_string</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">k</span><span class="si">}</span><span class="s2">=</span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="s2">"</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
    <span class="n">secret</span> <span class="o">=</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="sa">b</span><span class="s2">"WebAppData"</span><span class="p">,</span> <span class="n">bot_token</span><span class="o">.</span><span class="n">encode</span><span class="p">(),</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">)</span><span class="o">.</span><span class="n">digest</span><span class="p">()</span>
    <span class="n">calc</span> <span class="o">=</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">secret</span><span class="p">,</span> <span class="n">data_check_string</span><span class="o">.</span><span class="n">encode</span><span class="p">(),</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">)</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">hmac</span><span class="o">.</span><span class="n">compare_digest</span><span class="p">(</span><span class="n">calc</span><span class="p">,</span> <span class="n">received_hash</span><span class="p">):</span>
        <span class="k">return</span> <span class="kc">None</span>                      <span class="c1"># подпись не сошлась — запрос не от Telegram</span>
    <span class="k">if</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">-</span> <span class="nb">int</span><span class="p">(</span><span class="n">fields</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"auth_date"</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span> <span class="o">&gt;</span> <span class="n">max_age</span><span class="p">:</span>
        <span class="k">return</span> <span class="kc">None</span>                      <span class="c1"># данные устарели</span>
    <span class="k">return</span> <span class="n">fields</span>
</code></pre></div>

<p>Второе правило вытекает из первого: <strong>цену считает сервер</strong>. Фронтенд присылает только состав заказа — позиции и опции, — а сумму бэкенд считает по своему прайсу. Иначе кто-нибудь обязательно попробует купить капучино за рубль.</p>
<h3 id="svyaz-s-botom">Связь с ботом</h3>
<p>После оформления заказа бэкенд через Bot API отправляет гостю сообщение: «Заказ №… принят». Дальше бот присылает статусы — «готовится», «готов» — а сотрудникам уходит уведомление в рабочий чат с кнопками смены статуса. Мини-приложение и бот — две половины одной системы.</p>
<h2 id="oplata">Оплата</h2>
<p>Здесь два разных случая, и путать их нельзя.</p>
<ul>
<li><strong>Физические товары и услуги</strong> — кофе, еда, товары с доставкой — оплачиваются через сторонних платёжных провайдеров. В России это, например, ЮKassa: провайдер подключается через @BotFather, бот выставляет счёт, а мини-приложение может открыть его методом <code>openInvoice</code>.</li>
<li><strong>Цифровые товары и услуги</strong> внутри Telegram — подписки, внутриигровые предметы, доступ к контенту — по правилам Telegram оплачиваются только в Telegram Stars.</li>
</ul>
<p>Для кафе актуален первый вариант. Можно обойтись и без оплаты в приложении — «оплата при получении» для самовывоза часто проще и для гостя, и для кассы. И отдельно не забудьте про онлайн-кассу и чеки по 54-ФЗ, если деньги принимаются онлайн: это вопрос к вашей кассе и платёжному сервису, а не к Telegram.</p>
<h2 id="zachem-eto-kafe-i-magazinu">Зачем это кафе и магазину</h2>
<p><strong>Предзаказ и самовывоз.</strong> Гость заказывает по дороге и выбирает время, бариста видит заказ заранее. Меньше очереди у кассы в часы пик.</p>
<p><strong>Меню, которое легко обновлять.</strong> Стоп-лист, сезонные напитки, цены — всё меняется в админке без перепечатки и правок в агрегаторах.</p>
<p><strong>Своя программа лояльности.</strong> Карта «каждый шестой кофе бесплатно» живёт в том же приложении, а не в отдельной картонке, которая теряется.</p>
<p><strong>Повторные покупки.</strong> У гостя остаётся чат с ботом. Через него можно напомнить о себе — аккуратно и по делу, а не спамом.</p>
<p><strong>Свой канал продаж.</strong> В отличие от агрегаторов, база клиентов и история заказов остаются у вас.</p>
<p>Чего Mini App не даст сам по себе: трафика. Его всё равно нужно приводить — QR-кодами в зале, ссылкой в соцсетях, на сайте и в картах.</p>
<h2 id="chto-uchest-v-2026-godu">Что учесть в 2026 году</h2>
<p>Это нельзя обойти стороной. С августа 2025 года Роскомнадзор ограничивает звонки в Telegram, а с февраля 2026 года объявил о «последовательных ограничениях» работы мессенджера. Пользователи по всей стране жалуются на медленную загрузку медиа и перебои с сообщениями. На момент публикации, в начале ноября 2026 года, официального решения о полной блокировке с конкретной датой нет, но работа мессенджера в России нестабильна.</p>
<p>Что это значит для бизнеса: строить продажи только на Telegram рискованно. Хорошая новость в том, что Mini App — это веб-приложение, и его можно сделать независимым от одной платформы:</p>
<ul>
<li><strong>общий бэкенд</strong> — меню, заказы, лояльность и админка не привязаны к мессенджеру;</li>
<li><strong>тот же интерфейс в MAX.</strong> В MAX тоже есть мини-приложения, которые открываются из бота кнопкой <code>open_app</code>. Отличаются способ запуска и проверка данных пользователя, а меню, корзина и заказы остаются общими;</li>
<li><strong>версия в обычном браузере</strong> — та же страница по прямой ссылке для гостей без мессенджера.</li>
</ul>
<p>Как подключить бота в MAX, я подробно разобрал в отдельной статье — <a href="https://tsemeneev.ru/blog/bot-max-dlya-biznesa/">«Бот в MAX для бизнеса»</a>.</p>
<h2 id="kak-eto-vyglyadit-vzhivuyu">Как это выглядит вживую</h2>
<p>Я сделал демо-проект «Зерно и Пар» — Telegram-бота кофейни с мини-приложением. Кофейня вымышлена, оплата ненастоящая, заказ никто не готовит, но всё работает, и заказ можно оформить самому:</p>
<ul>
<li>меню из 16 позиций в четырёх разделах, светлая и тёмная тема;</li>
<li>настройка напитка — объём, молоко, сиропы, дополнительный шот — с пересчётом цены на лету;</li>
<li>корзина, слоты самовывоза каждые 10 минут и комментарий к заказу;</li>
<li>нативные кнопки Telegram и вибрация;</li>
<li>проверка подписи <code>initData</code> на сервере, цену считает бэкенд;</li>
<li>статусы заказа в чат, чек заказа в PDF и карта лояльности.</li>
</ul>
<p>Мини-приложение открывается и в обычном браузере — именно так, как описано выше: интерфейс один, а точки входа разные.</p>
<h2 id="chastye-voprosy">Частые вопросы</h2>
<h3 id="skol-ko-stoit-mini-app">Сколько стоит Mini App?</h3>
<p>Зависит от объёма. По открытым прайсам студий и разработчиков простое мини-приложение начинается примерно от 100 тысяч рублей, а сложные проекты с каталогом на сотни товаров, личным кабинетом и интеграциями с учётной системой стоят в разы дороже. Подробнее о том, что влияет на цену, — в статье <a href="https://tsemeneev.ru/blog/skolko-stoit-bot-max/">про стоимость ботов</a>: логика расчёта для Telegram и MAX одна и та же.</p>
<h3 id="nuzhno-li-gostyu-chto-to-ustanavlivat">Нужно ли гостю что-то устанавливать?</h3>
<p>Нет. Mini App открывается внутри Telegram, как вкладка. Гостю нужен только сам мессенджер, а для браузерной версии — даже он не нужен.</p>
<h3 id="mozhno-li-podklyuchit-kassu-ili-uchetnuyu-sistemu">Можно ли подключить кассу или учётную систему?</h3>
<p>Да, через бэкенд. Заказ из мини-приложения можно передавать в учётную систему, CRM или таблицу так же, как заказы с сайта. Всё зависит от того, есть ли у системы API.</p>
<h3 id="chem-mini-app-luchshe-obychnogo-sayta-s-korzinoy">Чем Mini App лучше обычного сайта с корзиной?</h3>
<p>Не лучше, а удобнее в одном конкретном месте: гость уже в мессенджере, и связь с ним после заказа остаётся. Статус, чек, напоминание и повторный заказ идут через чат. Если ваши клиенты в мессенджерах не сидят, хороший мобильный сайт может оказаться проще и дешевле.</p>
<h2 id="s-chego-nachat">С чего начать</h2>
<ol>
<li>Опишите, что гость должен сделать за минуту: выбрать, настроить, указать время, подтвердить.</li>
<li>Решите, где хранится меню и кто его обновляет.</li>
<li>Определитесь с оплатой: онлайн через провайдера или при получении.</li>
<li>Продумайте уведомления для персонала: куда приходит заказ и как меняется статус.</li>
<li>Сразу закладывайте второй канал — MAX или браузерную версию, — чтобы не зависеть от одной платформы.</li>
</ol>
<p>Если хотите обсудить мини-приложение для своего кафе или магазина, напишите мне — покажу демо и прикину объём работ под вашу задачу.</p>]]></content:encoded>
    </item>
    <item>
      <title>Парсинг сайтов: что законно и как заказать парсер</title>
      <link>https://tsemeneev.ru/blog/parsing-saytov-zakonno/</link>
      <guid isPermaLink="true">https://tsemeneev.ru/blog/parsing-saytov-zakonno/</guid>
      <pubDate>Mon, 02 Nov 2026 09:00:00 +0000</pubDate>
      <dc:creator>Тимур Семенеев</dc:creator>
      <category>парсинг</category>
      <category>данные</category>
      <category>право</category>
      <description>Разбираю, где проходит граница между нормальным сбором открытых данных и рискованным, на что смотреть с точки зрения 152-ФЗ и прав на базы данных и как правильно поставить задачу на парсер.</description>
      <enclosure url="https://tsemeneev.ru/blog/og/parsing-saytov-zakonno.jpg" type="image/jpeg" length="0"/>
      <content:encoded><![CDATA[<p>Парсинг — это автоматический сбор данных с сайтов: цены конкурентов, каталоги поставщиков, курсы валют, объявления, отзывы. Технически это та же загрузка страницы, что и в браузере, только без человека. Поэтому главный вопрос не «можно ли парсить», а «что именно, как и зачем вы собираете».</p>
<blockquote class="note"><p><strong>Важно.</strong> Я разработчик, а не юрист, и эта статья — не юридическая консультация. Здесь собраны нормы и практики, о которых стоит знать при постановке задачи. Если проект затрагивает персональные данные или крупные базы чужих сайтов, обсудите его с юристом.</p>
</blockquote>
<h2 id="est-li-zakon-o-parsinge">Есть ли закон о парсинге</h2>
<p>Отдельного закона о парсинге в России нет. Конституция гарантирует право свободно искать, получать и распространять информацию любым законным способом (ч. 4 ст. 29). Сам по себе автоматический сбор открытой информации не запрещён.</p>
<p>Риски появляются не из-за способа, а из-за того, <strong>что</strong> собирается и <strong>как используется</strong>. Основных зон четыре: персональные данные, права на базы данных, авторские права на контент и способ доступа к сайту.</p>
<h2 id="personal-nye-dannye-i-152-fz">Персональные данные и 152-ФЗ</h2>
<p>Самая серьёзная зона. Имена, телефоны, email, фото, ссылки на профили — всё это персональные данные, и на их обработку распространяется закон «О персональных данных» (152-ФЗ). Сбор — тоже обработка.</p>
<p>Ключевая мысль, о которую спотыкаются чаще всего: <strong>«данные в открытом доступе» не значит «их можно собирать и использовать как угодно»</strong>. С 1 марта 2021 года в законе есть статья 10.1 о данных, которые человек разрешил распространять. Для такого разрешения нужно отдельное согласие, а человек вправе установить запреты и условия: например, разрешить показывать телефон на сайте, но запретить его дальнейшую передачу. Сам факт, что телефон виден на странице, не даёт права выгрузить его в свою базу для рассылок.</p>
<p>Если в задаче есть персональные данные, у вас должно быть законное основание для их обработки, понятная цель и сроки хранения. С 2025 года ответственность за нарушения в этой сфере, особенно за утечки, заметно ужесточили.</p>
<p>Практический вывод: парсер для цен, товаров, курсов и характеристик — почти всегда спокойная задача. Парсер, который собирает контакты людей, — задача, которую без юриста лучше не начинать.</p>
<h2 id="prava-na-bazy-dannyh">Права на базы данных</h2>
<p>Гражданский кодекс защищает не только тексты и фото, но и сами базы данных. Изготовитель базы, на создание которой ушли существенные затраты, получает исключительное право извлекать из неё материалы (ст. 1334 ГК РФ). Нарушением считается извлечение существенной части базы — по объёму или по значимости — без разрешения.</p>
<p>Это не теория: суды рассматривают такие споры. Например, в 2023 году Суд по интеллектуальным правам оставил в силе решения по делу № А56-39703/2022. Ответчик извлёк из чужой базы данных материалы в существенном объёме и встроил их в свой сайт. Суд признал это нарушением исключительного права на базу данных.</p>
<p>Что это значит на практике:</p>
<ul>
<li>собрать цены на сотню позиций конкурента для мониторинга и выгрузить весь каталог маркетплейса, чтобы показать его у себя, — очень разные истории;</li>
<li>риск резко растёт, если собранные данные публикуются или продаются как продукт, а не используются для внутренней аналитики;</li>
<li>регулярное извлечение даже несущественных частей, которое в сумме воспроизводит базу, тоже может быть нарушением.</li>
</ul>
<h2 id="avtorskie-prava-na-kontent">Авторские права на контент</h2>
<p>Тексты описаний, статьи, фотографии товаров — объекты авторского права. Собрать их для анализа — одно. Опубликовать у себя — другое: это использование чужого произведения без разрешения. Типичная ошибка — спарсить каталог поставщика вместе с фото и описаниями и выложить в свой магазин. Если поставщик не давал разрешения, это прямой риск претензии.</p>
<p>Факты — цена, артикул, наличие, размер — авторским правом не охраняются. Поэтому для мониторинга цен обычно собирают именно их.</p>
<h2 id="sposob-dostupa-robots-txt-nagruzka-i-zaschita">Способ доступа: robots.txt, нагрузка и защита</h2>
<h3 id="robots-txt-i-pol-zovatel-skoe-soglashenie">robots.txt и пользовательское соглашение</h3>
<p>Файл <code>robots.txt</code> — не закон, а инструкция для роботов от владельца сайта. Но это внятный сигнал: если раздел закрыт от роботов, владелец не хочет, чтобы его обходили автоматически. Пользовательское соглашение сайта может прямо запрещать автоматический сбор, и тогда к картине добавляются договорные риски.</p>
<p>Нормальная практика — уважать <code>robots.txt</code> и правила сайта, а если они мешают задаче, искать другой источник или договариваться с владельцем.</p>
<h3 id="nagruzka">Нагрузка</h3>
<p>Парсер, который отправляет сотни запросов в секунду, может положить небольшой сайт. Это уже не «сбор данных», а вред чужой инфраструктуре. Аккуратный парсер ходит с паузами, ограничивает число одновременных запросов, кэширует результаты и не запрашивает одно и то же повторно.</p>
<h3 id="obhod-zaschity">Обход защиты</h3>
<p>Здесь граница жёсткая. Использование чужих учётных данных, взлом авторизации и обход технических средств защиты — это уже не серая зона: за неправомерный доступ к компьютерной информации предусмотрена уголовная ответственность (ст. 272 УК РФ). Данные «за логином» — личные кабинеты, закрытые разделы — без разрешения владельца не собирают.</p>
<h3 id="api-luchshiy-variant">API — лучший вариант</h3>
<p>Если у сайта есть официальный API, используйте его. Это законный, стабильный и обычно более быстрый способ: данные приходят в структурированном виде, а условия использования прописаны. Например, Банк России публикует курсы валют в машиночитаемом виде, и парсить для этого страницы не нужно.</p>
<h2 id="chek-list-spokoynogo-parsinga">Чек-лист «спокойного» парсинга</h2>
<p>Задача почти наверняка в зелёной зоне, если:</p>
<ul>
<li>данные открыты без авторизации;</li>
<li>это не персональные данные: цены, товары, характеристики, курсы, расписания;</li>
<li>вы берёте нужные поля, а не копируете всю базу целиком;</li>
<li>данные нужны для внутренней аналитики, а не для публикации у себя;</li>
<li>парсер работает с паузами и не создаёт заметной нагрузки;</li>
<li><code>robots.txt</code> и правила сайта не запрещают такой сбор, либо у вас есть договорённость;</li>
<li>если есть официальный API, вы используете его.</li>
</ul>
<p>Если по какому-то пункту ответ «нет» — это не обязательно запрет, но это повод остановиться и разобраться подробнее.</p>
<h2 id="kak-zakazat-parser">Как заказать парсер</h2>
<p>Хорошее задание на парсер умещается в одну страницу. Вот что в нём должно быть.</p>
<h3 id="1-istochniki">1. Источники</h3>
<p>Список сайтов или разделов со ссылками. Если источников много, хватит трёх-пяти примеров и общего описания.</p>
<h3 id="2-polya">2. Поля</h3>
<p>Что именно нужно собрать: название, цена, старая цена, наличие, артикул, ссылка, дата. Лучше всего — пример таблицы, которую вы хотите получить на выходе.</p>
<h3 id="3-ob-em-i-chastota">3. Объём и частота</h3>
<p>Сколько страниц или позиций и как часто обновлять: один раз, раз в день, каждый час. От этого зависят архитектура и стоимость сервера.</p>
<h3 id="4-format-rezul-tata">4. Формат результата</h3>
<p>Excel, CSV, Google Таблица, загрузка в вашу CRM или базу, уведомление в Telegram или MAX при изменении цены.</p>
<h3 id="5-chto-delat-pri-sboyah">5. Что делать при сбоях</h3>
<p>Сайты меняют вёрстку, и парсер ломается — это нормально. Нужно заранее решить, кто и как узнаёт о поломке и как быстро её исправляют. Хороший парсер не молча отдаёт пустой файл, а сообщает: «источник изменился, собрано 0 из 1200».</p>
<h2 id="chto-vliyaet-na-tsenu-parsera">Что влияет на цену парсера</h2>
<ul>
<li><strong>Количество источников.</strong> Каждый сайт — это своя разметка, и под каждый пишется свой разборщик.</li>
<li><strong>Как сайт отдаёт данные.</strong> Обычный HTML разбирается быстро. Если страница собирается JavaScript-ом, нужен браузерный движок, а это медленнее и дороже в работе.</li>
<li><strong>Защита от роботов.</strong> Капчи и блокировки — отдельная работа. А иногда честный ответ: этот источник автоматически не собрать, и лучше договориться с владельцем.</li>
<li><strong>Регулярность.</strong> Разовая выгрузка проще, чем сбор по расписанию с историей изменений и уведомлениями.</li>
<li><strong>Куда отдавать результат.</strong> Файл — проще всего; интеграция с CRM или учётной системой — отдельная задача.</li>
<li><strong>Поддержка.</strong> Если сайты-источники часто меняются, нужен кто-то, кто будет чинить парсер.</li>
</ul>
<h2 id="kak-vyglyadit-akkuratnyy-parser">Как выглядит аккуратный парсер</h2>
<p>Чтобы показать подход, я сделал живое демо парсера. Он работает только с открытыми источниками: учебными сайтами, созданными специально для практики парсинга, и официальными данными Банка России о курсах валют. В демо видно то, о чём шла речь выше:</p>
<ul>
<li>прогресс и лог сбора в реальном времени;</li>
<li>ограничения: не больше двух парсингов одновременно, лимиты на страницы и запуски, паузы между запросами;</li>
<li>кэш: одинаковый запрос в течение 10 минут отдаётся без повторного обращения к источнику;</li>
<li>таблица с поиском и сортировкой, графики и выгрузка в Excel или CSV.</li>
</ul>
<p>Это демо-проект, а не заказ клиента, но устроен он так же, как рабочие парсеры: аккуратно к источнику и удобно для того, кто пользуется результатом.</p>
<p>Если у вас есть задача на сбор данных, напишите мне. Вместе посмотрим на источники, оценим риски и решим, как собрать данные проще и безопаснее — через API, парсер или договорённость с владельцем сайта.</p>]]></content:encoded>
    </item>
    <item>
      <title>Автоматическая генерация договоров, счетов и актов в PDF</title>
      <link>https://tsemeneev.ru/blog/generaciya-dokumentov-pdf/</link>
      <guid isPermaLink="true">https://tsemeneev.ru/blog/generaciya-dokumentov-pdf/</guid>
      <pubDate>Mon, 02 Nov 2026 09:00:00 +0000</pubDate>
      <dc:creator>Тимур Семенеев</dc:creator>
      <category>документы</category>
      <category>автоматизация</category>
      <category>PDF</category>
      <description>Как устроена автоматическая сборка документов: откуда берутся данные, как выбрать шаблон, на чём собирать PDF, где чаще всего ошибаются в расчётах и что с подписью. С примерами кода.</description>
      <enclosure url="https://tsemeneev.ru/blog/og/generaciya-dokumentov-pdf.jpg" type="image/jpeg" length="0"/>
      <content:encoded><![CDATA[<p>Счёт, договор, акт, коммерческое предложение — документы, которые в небольшой компании часто собирают вручную. Открыть прошлый файл, поменять реквизиты, пересчитать сумму, не забыть сумму прописью, сохранить в PDF, отправить. На один документ уходит 10–15 минут, а ошибка в ИНН или сумме всплывает уже у бухгалтера клиента.</p>
<p>Автоматизация здесь простая по смыслу: данные вводятся один раз, а документ собирается сам. Ниже — как это устроено и о чём подумать заранее.</p>
<h2 id="kakie-dokumenty-avtomatiziruyut-chasche-vsego">Какие документы автоматизируют чаще всего</h2>
<ul>
<li><strong>Коммерческое предложение.</strong> Не имеет строгой формы, зато его часто нужно быстро и красиво.</li>
<li><strong>Счёт на оплату.</strong> Важно: счёт — не первичный учётный документ, а предложение оплатить. Строгих требований закона к его форме нет, но в нём должны быть реквизиты для оплаты, позиции и итог.</li>
<li><strong>Договор.</strong> Обычно это шаблон с подстановкой сторон, предмета, сроков и сумм, иногда со спецификацией.</li>
<li><strong>Акт.</strong> Первичный документ, подтверждающий оказание услуг или выполнение работ.</li>
<li><strong>УПД, накладные, доверенности, анкеты, заявления</strong> — всё, что собирается по шаблону.</li>
</ul>
<h3 id="obyazatel-nye-rekvizity-pervichki">Обязательные реквизиты первички</h3>
<p>Для первичных документов, например акта, закон о бухучёте (ч. 2 ст. 9 402-ФЗ) перечисляет обязательные реквизиты:</p>
<ol>
<li>наименование документа;</li>
<li>дата составления;</li>
<li>наименование организации, составившей документ;</li>
<li>содержание факта хозяйственной жизни;</li>
<li>величина натурального или денежного измерения с единицами измерения;</li>
<li>должность ответственного лица;</li>
<li>подписи с расшифровкой — фамилией и инициалами.</li>
</ol>
<p>Шаблон акта стоит один раз сверить с этим списком, и дальше генератор будет следовать ему без исключений. Это одно из главных преимуществ автоматизации: человек может забыть поле, шаблон — нет.</p>
<h2 id="kak-ustroena-generatsiya">Как устроена генерация</h2>
<p>Схема одинаковая почти для любого проекта:</p>
<p><strong>данные → шаблон → документ → доставка → хранение</strong></p>
<h3 id="otkuda-berutsya-dannye">Откуда берутся данные</h3>
<ul>
<li><strong>форма в браузере</strong> — менеджер вводит реквизиты и позиции, документ собирается на экране;</li>
<li><strong>CRM</strong> — по кнопке в сделке Битрикс24 или amoCRM данные уходят в генератор, а готовый PDF возвращается в карточку сделки;</li>
<li><strong>бот</strong> — клиент отвечает на вопросы в Telegram или MAX и получает документ прямо в чат;</li>
<li><strong>таблица или учётная система</strong> — пакетная генерация, например актов за месяц по всем клиентам.</li>
</ul>
<p>Реквизиты контрагента по ИНН можно подтягивать из открытых сервисов, чтобы не вводить вручную название, КПП и адрес.</p>
<h3 id="shablon-html-ili-docx">Шаблон: HTML или DOCX</h3>
<p><strong>HTML и CSS → PDF.</strong> Шаблон вёрстается как веб-страница, а в PDF его превращает специальная библиотека. Плюсы: точный контроль над видом документа, таблицы, логотип, фирменные цвета, предпросмотр в браузере ровно таким, каким будет PDF. На Python для этого хорошо подходит WeasyPrint.</p>
<p><strong>DOCX-шаблон.</strong> Документ готовят в Word, ставят в нём метки вроде <code>{{ client_name }}</code>, а программа подставляет значения. Плюс — шаблон может править юрист или бухгалтер, не трогая код. Для Python есть <code>docxtpl</code> и <code>python-docx</code>; чтобы получить из DOCX ещё и PDF, используют LibreOffice в режиме без интерфейса.</p>
<p>Часто нужны оба формата: PDF — чтобы отправить клиенту, DOCX — чтобы можно было поправить вручную.</p>
<p>Минимальный пример сборки PDF из HTML-шаблона:</p>
<div class="hl"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">jinja2</span><span class="w"> </span><span class="kn">import</span> <span class="n">Environment</span><span class="p">,</span> <span class="n">FileSystemLoader</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">weasyprint</span><span class="w"> </span><span class="kn">import</span> <span class="n">HTML</span>

<span class="n">env</span> <span class="o">=</span> <span class="n">Environment</span><span class="p">(</span><span class="n">loader</span><span class="o">=</span><span class="n">FileSystemLoader</span><span class="p">(</span><span class="s2">"templates"</span><span class="p">),</span> <span class="n">autoescape</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">html</span> <span class="o">=</span> <span class="n">env</span><span class="o">.</span><span class="n">get_template</span><span class="p">(</span><span class="s2">"invoice.html"</span><span class="p">)</span><span class="o">.</span><span class="n">render</span><span class="p">(</span><span class="n">invoice</span><span class="o">=</span><span class="n">invoice</span><span class="p">)</span>
<span class="n">pdf_bytes</span> <span class="o">=</span> <span class="n">HTML</span><span class="p">(</span><span class="n">string</span><span class="o">=</span><span class="n">html</span><span class="p">,</span> <span class="n">base_url</span><span class="o">=</span><span class="s2">"templates"</span><span class="p">)</span><span class="o">.</span><span class="n">write_pdf</span><span class="p">()</span>
</code></pre></div>

<h2 id="gde-oshibayutsya-chasche-vsego">Где ошибаются чаще всего</h2>
<h3 id="den-gi-vo-float">Деньги во float</h3>
<p>Классическая ошибка — считать суммы в числах с плавающей точкой. В Python <code>0.1 + 0.2</code> даёт <code>0.30000000000000004</code>, и на большом счёте копейки в итоге могут разойтись с суммой строк. Деньги считают в <code>Decimal</code> с явным округлением до копейки.</p>
<h3 id="nds-v-tom-chisle-i-sverhu">НДС «в том числе» и «сверху»</h3>
<p>С 1 января 2026 года основная ставка НДС — 22%. Генератор должен уметь оба варианта:</p>
<ul>
<li><strong>НДС в том числе</strong> — цена уже включает налог, его выделяют из суммы;</li>
<li><strong>НДС сверху</strong> — налог начисляют на цену без НДС.</li>
</ul>
<p>Плюс другие ставки — 10%, 0%, ставки 5% и 7% для упрощенцев — и вариант «без НДС».</p>
<div class="hl"><pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">decimal</span><span class="w"> </span><span class="kn">import</span> <span class="n">Decimal</span><span class="p">,</span> <span class="n">ROUND_HALF_UP</span>

<span class="n">KOP</span> <span class="o">=</span> <span class="n">Decimal</span><span class="p">(</span><span class="s2">"0.01"</span><span class="p">)</span>

<span class="k">def</span><span class="w"> </span><span class="nf">vat_included</span><span class="p">(</span><span class="n">total</span><span class="p">:</span> <span class="n">Decimal</span><span class="p">,</span> <span class="n">rate</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Decimal</span><span class="p">:</span>
<span class="w">    </span><span class="sd">"""НДС в том числе: выделяем налог из суммы."""</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">total</span> <span class="o">*</span> <span class="n">rate</span> <span class="o">/</span> <span class="p">(</span><span class="mi">100</span> <span class="o">+</span> <span class="n">rate</span><span class="p">))</span><span class="o">.</span><span class="n">quantize</span><span class="p">(</span><span class="n">KOP</span><span class="p">,</span> <span class="n">ROUND_HALF_UP</span><span class="p">)</span>

<span class="k">def</span><span class="w"> </span><span class="nf">vat_on_top</span><span class="p">(</span><span class="n">net</span><span class="p">:</span> <span class="n">Decimal</span><span class="p">,</span> <span class="n">rate</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Decimal</span><span class="p">:</span>
<span class="w">    </span><span class="sd">"""НДС сверху: начисляем налог на сумму без НДС."""</span>
    <span class="k">return</span> <span class="p">(</span><span class="n">net</span> <span class="o">*</span> <span class="n">rate</span> <span class="o">/</span> <span class="mi">100</span><span class="p">)</span><span class="o">.</span><span class="n">quantize</span><span class="p">(</span><span class="n">KOP</span><span class="p">,</span> <span class="n">ROUND_HALF_UP</span><span class="p">)</span>

<span class="n">vat_included</span><span class="p">(</span><span class="n">Decimal</span><span class="p">(</span><span class="s2">"122000.00"</span><span class="p">),</span> <span class="mi">22</span><span class="p">)</span>   <span class="c1"># Decimal('22000.00')</span>
</code></pre></div>

<p>Отдельный вопрос — округлять налог построчно или по итогу. Правило нужно выбрать один раз, согласовать с бухгалтером и зашить в генератор.</p>
<h3 id="summa-propis-yu">Сумма прописью</h3>
<p>«Сто двадцать две тысячи рублей 00 копеек». Кажется мелочью, но в русском языке это склонения рублей, тысяч и миллионов, женский род у тысяч — «одна тысяча», «две тысячи» — и много граничных случаев. Такую функцию обязательно покрывают тестами: 1, 2, 5, 11, 21, 101, 1 000 000 и так далее.</p>
<h3 id="shrifty">Шрифты</h3>
<p>Если не встроить шрифт с кириллицей в PDF, на другом компьютере вместо текста могут появиться квадратики. Генератор должен встраивать шрифт в файл, а не надеяться на шрифты получателя.</p>
<h3 id="numeratsiya">Нумерация</h3>
<p>Номера счетов и актов должны идти по порядку и не дублироваться, даже если два менеджера нажали кнопку одновременно. Это решается на уровне базы данных, а не «возьмём последний номер и прибавим единицу».</p>
<h2 id="podpis-i-yuridicheskaya-znachimost">Подпись и юридическая значимость</h2>
<p>Сгенерированный PDF — это электронная копия. Как она становится документом с юридической силой, зависит от того, как вы его подписываете.</p>
<ul>
<li><strong>Печать и подпись на бумаге.</strong> PDF распечатывают, подписывают и сканируют или отправляют оригинал почтой. Генератор просто экономит время на подготовке.</li>
<li><strong>Картинка подписи в PDF.</strong> Удобно для КП и счетов, но картинка — не электронная подпись в смысле закона.</li>
<li><strong>Электронная подпись</strong> (63-ФЗ) и <strong>ЭДО.</strong> Для юридически значимого электронного документооборота документы подписывают квалифицированной электронной подписью и обычно передают через оператора ЭДО. Если документ подписывает не руководитель, а уполномоченный сотрудник, с 1 сентября 2024 года нужна личная подпись сотрудника и машиночитаемая доверенность — МЧД.</li>
</ul>
<p>Генератор хорошо встраивается в любую из этих схем: он собирает документ, а дальше файл уходит на подпись тем способом, который принят у вас и ваших контрагентов. Интересно, что подписание документов появляется и в мессенджерах: на платформе MAX для партнёров есть опция подписания документов «Госключом» — правда, только для юрлиц и ИП.</p>
<h2 id="dostavka-i-hranenie">Доставка и хранение</h2>
<p>Документ мало собрать — его нужно отправить и потом найти.</p>
<ul>
<li><strong>Отправка:</strong> на email клиента, в чат бота, в карточку сделки в CRM.</li>
<li><strong>Хранение:</strong> в облаке или на своём сервере, с понятной структурой — по клиентам и датам — и с поиском.</li>
<li><strong>Журнал:</strong> кто и когда сформировал документ, с какими данными. Это помогает разобраться, если клиент говорит «мне пришёл не тот счёт».</li>
</ul>
<p>Если в документах есть персональные данные — например, паспортные данные в договоре с физлицом, — к хранению применяются требования 152-ФЗ. Генерировать документ «на лету» и не хранить лишнего — хорошая практика.</p>
<h2 id="skol-ko-vremeni-eto-ekonomit">Сколько времени это экономит</h2>
<p>Считать стоит на своих цифрах. Если менеджер вручную собирает документ за 10–15 минут, а генератор — за минуту на ввод данных, то при 20 документах в неделю это несколько часов рабочего времени каждую неделю. Плюс меньше ошибок, которые потом исправляют бухгалтеры с обеих сторон. Если документов два в месяц, автоматизация, скорее всего, не окупится — и это тоже нормальный вывод.</p>
<h2 id="dokumenty-pryamo-v-chat-bote">Документы прямо в чат-боте</h2>
<p>Отдельный удобный сценарий — генерация документов в мессенджере. Клиент или сотрудник отвечает на несколько вопросов в Telegram или MAX, а бот присылает готовый PDF в тот же чат. Никаких форм на сайте и писем с вложениями.</p>
<p>Где это работает хорошо:</p>
<ul>
<li><strong>счёт по запросу</strong> — клиент выбирает услугу и вводит ИНН, бот присылает счёт на оплату;</li>
<li><strong>анкета или заявление</strong> — бот задаёт вопросы по очереди, проверяет ответы и собирает документ;</li>
<li><strong>акт после выполнения работ</strong> — менеджер нажимает кнопку в рабочем чате, акт уходит клиенту.</li>
</ul>
<p>Технически бот просто вызывает тот же генератор, а затем загружает файл в мессенджер и прикрепляет к сообщению. Так устроен мой демо-бот «Виртуальный рекрутер» в MAX: после скрининга он собирает анкету кандидата в PDF и присылает её прямо в чат.</p>
<p>Важная деталь: если в документ попадают персональные данные, бот должен получить согласие на их обработку и не хранить больше, чем нужно для задачи.</p>
<h2 id="kak-eto-vyglyadit-vzhivuyu">Как это выглядит вживую</h2>
<p>Я сделал онлайн-демо генератора документов. Это демо-проект, введённые данные нигде не сохраняются. В нём можно:</p>
<ul>
<li>собрать КП, счёт, договор со спецификацией и акт;</li>
<li>добавлять позиции и смотреть живой предпросмотр;</li>
<li>выбрать ставку НДС — 0, 5, 7, 10 или 22% — и вариант «в том числе», «сверху» или без НДС;</li>
<li>получить сумму прописью;</li>
<li>добавить логотип, выбрать тему оформления и скачать результат в PDF или DOCX.</li>
</ul>
<p>Под капотом — всё, о чём шла речь выше: расчёты в <code>Decimal</code>, сумма прописью с тестами, PDF из HTML-шаблона через WeasyPrint со встроенным шрифтом и нативные таблицы Word в DOCX.</p>
<h2 id="s-chego-nachat-avtomatizatsiyu">С чего начать автоматизацию</h2>
<ol>
<li>Выберите один документ, который делаете чаще всего, — обычно это счёт или акт.</li>
<li>Соберите эталонный шаблон и согласуйте его с бухгалтером.</li>
<li>Определите, откуда берутся данные: форма, CRM, бот или таблица.</li>
<li>Решите, куда уходит готовый файл и где он хранится.</li>
<li>Когда первый документ заработает, добавьте остальные по тому же шаблону.</li>
</ol>
<p>Если хотите автоматизировать документы под свои шаблоны и встроить генератор в CRM или бота, напишите мне — разберу процесс и предложу, как сделать его проще.</p>]]></content:encoded>
    </item>
  </channel>
</rss>
