# OneSwitch — полный текст сайта Сайты, веб-приложения, Telegram-боты и Mini App, интеграции, парсинг, 1С и AI-агенты. Делаю системы, которые работают без присмотра. # Услуги ## Разработка сайтов и лендингов под ключ URL: https://oneswitch.ru/uslugi/sajty-i-lendingi/ Делаю сайты, которые быстро загружаются, хорошо смотрятся на телефоне и сразу готовы к продвижению: структура, разметка, карта сайта и файлы для нейросетей. Что входит: Дизайн и адаптивная вёрстка; Формы заявок в почту, Telegram или CRM; SEO-основа: теги, микроразметка, sitemap, robots; Оптимизация под нейросети: llms.txt и структурированные данные; Аналитика и цели; Деплой на ваш хостинг или VPS Для кого: Бизнесу, которому нужна визитка или страница под рекламу; Экспертам и студиям с портфолио; Проектам, которым нужен сайт, генерируемый из данных Результат: Рабочий сайт, который можно сразу показывать клиентам и продвигать, и исходники у вас. Цена: от 20 000 ₽. Срок: 5–14 дней. Стек: HTML/CSS/JS, Python-генераторы, Next.js, Tailwind, CMS. Q: Чем статический сайт лучше конструктора? A: Он быстрее, дешевле в хостинге, лучше индексируется и не зависит от тарифов платформы. Контент можно вести через API или файлы. Q: Сколько занимает запуск лендинга? A: Обычно 5–7 дней при готовых текстах и материалах. ## Разработка веб-приложений и личных кабинетов URL: https://oneswitch.ru/uslugi/veb-prilozheniya/ Проектирую и пишу сервисы с авторизацией, базой данных и API: от внутренней админки до клиентского кабинета. Что входит: Проектирование данных и API; Авторизация и роли; Админка для управления контентом; Калькуляторы, каталоги, фильтры; Уведомления в Telegram и на почту; Интеграции с внешними сервисами Для кого: Компаниям, которые хотят вывести процесс из таблиц в сервис; Стартапам, которым нужен MVP; Проектам с каталогом и фильтрами Результат: Работающий сервис с понятной админкой и документацией по API. Цена: от 70 000 ₽. Срок: 3–6 недель. Стек: Python, aiohttp / FastAPI, PostgreSQL / SQLite, JavaScript, Docker. Q: Можно начать с MVP? A: Да. Выделяю главный сценарий, запускаю его за короткий срок и развиваю по итогам реального использования. ## Интеграции сервисов и разработка API URL: https://oneswitch.ru/uslugi/integracii-i-api/ Связываю сайт, CRM, платёжные системы, мессенджеры и учётные системы, чтобы данные ходили сами, а не вручную. Что входит: REST API и вебхуки; Обмен с CRM, 1С, таблицами; Подключение партнёрских API (например, Travelpayouts); Очереди, повторы при сбоях, логи; Документация по методам Для кого: Тем, кто переносит данные между сервисами вручную; Проектам с партнёрскими программами; Командам, которым нужен API для своих приложений Результат: Интеграция, которая работает по расписанию или событию и сообщает об ошибках. Цена: от 10 000 ₽. Срок: 2–10 дней. Стек: REST, Webhooks, n8n / Make, Python, PostgreSQL. Q: Что если у сервиса нет API? A: Тогда ищу альтернативу: выгрузки, вебхуки или автоматизацию браузера. Стараюсь выбирать самый стабильный путь. ## Автоматизация бизнес-процессов и рутины URL: https://oneswitch.ru/uslugi/avtomatizaciya-processov/ Нахожу повторяющиеся действия и превращаю их в сценарии, которые выполняются по расписанию или по событию, с логами и уведомлениями. Что входит: Аудит процессов и выбор, что автоматизировать; Сценарии в n8n и Make или собственные скрипты; Отчёты и выгрузки по расписанию; Контроль результата: логи, проверки, уведомления; Передача сценариев и инструкций Для кого: Менеджерам и маркетологам с большим объёмом рутины; Небольшим командам без своего разработчика; Проектам с регулярными публикациями и рассылками Результат: Меньше ручной работы, предсказуемый результат и понятные логи. Цена: от 10 000 ₽ за сценарий. Срок: 2–10 дней. Стек: n8n, Make, Python, Node.js, cron, PostgreSQL. Q: Что лучше: n8n или свой скрипт? A: Для типовых связок удобнее n8n: наглядно и легко править. Для сложной логики и больших объёмов надёжнее код. Выбираю по задаче. Q: Как понять, что сценарий сломался? A: Добавляю проверки результата и уведомления в Telegram, поэтому о сбое вы узнаете сразу. ## Разработка Telegram-ботов и Mini App URL: https://oneswitch.ru/uslugi/telegram-boty-i-mini-app/ Делаю ботов и приложения внутри Telegram: каталоги с фильтрами, подписки на новые предложения, уведомления, приём заявок и ИИ-консультанты. Что входит: Бот с меню, командами и сценариями; Telegram Mini App с каталогом, фильтрами и карточками; Подписки на уведомления по критериям; Админка и ручное управление при необходимости; Автопубликация в каналы и группы по темам; Связка с сайтом и базой данных Для кого: Проектам с каталогом: недвижимость, билеты, услуги; Бизнесу, которому нужны заявки прямо из мессенджера; Каналам и группам, где нужен автопостинг Результат: Бот или Mini App, которые открываются в один тап и работают круглосуточно. Цена: от 15 000 ₽. Срок: 3–21 день. Стек: Telegram Bot API, Mini App, Python, aiohttp, PostgreSQL, n8n. Q: Зачем Mini App, если есть сайт? A: Он открывается внутри Telegram без перехода и авторизации, поддерживает уведомления и удобен на телефоне. Сайт при этом остаётся для поиска и SEO. Q: Можно ли сделать подписку на новые объявления? A: Да, пользователь сохраняет критерии и получает сообщение, когда появляется подходящий вариант. ## Парсинг сайтов и работа с данными URL: https://oneswitch.ru/uslugi/parsing-i-dannye/ Собираю данные из открытых источников и API, привожу к единому виду и кладу туда, где ими удобно пользоваться: в базу, таблицу или каталог. Что входит: Сбор из API и открытых страниц; Очистка и дедупликация; Хранение в PostgreSQL или SQLite; Выгрузки в таблицы и отчёты; Мониторинг изменений и цен Для кого: Агрегаторам и каталогам; Маркетологам и аналитикам; Проектам с мониторингом цен Результат: Актуальная база и регулярные выгрузки без ручного копирования. Цена: от 10 000 ₽. Срок: 3–10 дней. Стек: Python, Playwright, PostgreSQL, SQLite, n8n. Q: Это законно? A: Работаю только с открытыми данными и API, соблюдая правила источников и ограничения по частоте запросов. ## Автоматизация контента и публикаций в соцсетях URL: https://oneswitch.ru/uslugi/kontent-i-soczseti/ Строю конвейеры: данные превращаются в статьи, карточки и видео, которые публикуются по расписанию с проверкой результата. Что входит: Генерация страниц и статей из структурированных данных; Подбор фото и монтаж видео; Публикация в Telegram, Instagram, TikTok, Pinterest, YouTube, Дзен; Расписание, очередь и повтор при сбое; Проверка, что публикация действительно вышла Для кого: Информационным порталам и блогам; Каналам с большим потоком предложений; Владельцам, у которых нет времени на ручной постинг Результат: Регулярный контент без ручной рутины и с контролем качества. Цена: от 25 000 ₽. Срок: 1–3 недели. Стек: Python, Playwright, ffmpeg, n8n, PostgreSQL. Q: Платформы не банят автопубликацию? A: Каждая площадка имеет свои правила. Использую официальные API, где они есть, и аккуратные сценарии с паузами, где их нет. Риски обсуждаю заранее. ## Разработка и доработка 1С URL: https://oneswitch.ru/uslugi/1c/ Пишу внешние обработки и отчёты, расширения конфигураций, формы и печатные формы, настраиваю обмен данными с сайтом и другими сервисами. Что входит: Внешние обработки и отчёты (EPF/ERF); Расширения конфигураций (CFE); Управляемые формы и СКД; Макеты и печатные формы; Роли и подсистемы; Обмен с сайтом и мессенджерами, HTML-формы внутри клиента; Автотесты форм через Vanessa Automation Для кого: Компаниям на 1С, которым нужны доработки без риска для типовой конфигурации; Командам, которым нужен обмен между 1С и сайтом; Тем, кто хочет автоматизировать выгрузки и отчёты Результат: Доработка в расширении, а не правка типовой конфигурации, плюс тесты и описание. Цена: от 2 500 ₽/час. Срок: по смете. Стек: 1С:Предприятие, XML-исходники, Git, Vanessa Automation. Q: Работаете с типовыми конфигурациями? A: Да, предпочитаю расширения: так обновление типовой конфигурации не ломает доработку. Q: Есть ли готовые решения? A: Да. Расширение «Локальное распознавание документов с фото для 1С» продаётся на Инфостарте: заполняет УПД и ТОРГ-12 из фото и PDF без интернета. Q: Можно ли подключить ИИ к 1С, не отправляя данные наружу? A: Да. Модель работает локально на компьютере клиента (LM Studio), документы и цены не уходят на сторонние серверы. ## Разработка AI-агентов и LLM-автоматизации URL: https://oneswitch.ru/uslugi/ai-agenty/ Делаю ассистентов, которые используют ваши данные и API: ищут билеты, отвечают клиентам, классифицируют обращения и подписывают на уведомления. Что входит: Агент с инструментами (поиск, подписка, запросы к API); Память диалога; Подключение моделей (OpenRouter, DeepSeek и др.); Классификация и маршрутизация обращений; Поиск по базе знаний; Лимиты, логи и защита от неверных ответов Для кого: Проектам, которым нужен консультант в Telegram или на сайте; Командам поддержки с потоком типовых вопросов; Сервисам, где ответ должен опираться на реальные данные Результат: Ассистент, который отвечает по вашим данным, а не придумывает. Цена: от 25 000 ₽. Срок: 1–3 недели. Стек: LLM, OpenRouter, DeepSeek, n8n, Python, REST API. Q: Как избежать выдуманных ответов? A: Агент получает данные через инструменты и API, а ответы формируются по ним. Ограничиваю тематику и логирую диалоги. ## SEO и оптимизация сайтов для нейросетей (GEO) URL: https://oneswitch.ru/uslugi/seo-i-ai-optimizaciya/ Готовлю сайт к поиску и к ответам нейросетей: чистая структура, микроразметка, карта сайта, файлы для ИИ и материалы, которые удобно цитировать. Что входит: Технический аудит и исправление ошибок; Микроразметка Schema.org (JSON-LD); sitemap.xml, robots.txt, canonical, Open Graph; llms.txt и машиночитаемые каталоги; Структура статей «кратко, затем подробно» для цитирования; Настройка метрик и вебмастеров Для кого: Информационным порталам; Проектам, которые хотят попадать в ответы Яндекс и других нейросетей; Сайтам после редизайна Результат: Сайт, который понятен и поисковикам, и языковым моделям. Цена: от 15 000 ₽. Срок: 5–10 дней. Стек: Schema.org, JSON-LD, llms.txt, sitemap, Яндекс Вебмастер, Search Console. Q: Что такое GEO? A: Generative Engine Optimization: подготовка контента так, чтобы нейросети могли найти, понять и корректно процитировать его в ответах. Q: Это гарантирует позиции? A: Нет, гарантий в SEO не бывает. Я улучшаю то, что зависит от сайта, и показываю, что именно изменилось. ## Автоматическое тестирование сайтов и приложений URL: https://oneswitch.ru/uslugi/avtotesty/ Пишу сценарии, которые сами проверяют критичные пути: формы, оплату, формы в 1С и публикации, и сообщают, если что-то сломалось. Что входит: Сценарии Playwright для сайтов; Проверка форм и заявок; Тесты форм 1С через Vanessa Automation; Скриншоты при ошибке; Запуск по расписанию или перед выкладкой Для кого: Проектам, которые часто обновляются; Командам, которые боятся выкладывать правки; Сайтам с формами заявок и оплатой Результат: Уверенность при каждой выкладке и быстрый сигнал о поломке. Цена: от 8 000 ₽. Срок: 2–7 дней. Стек: Playwright, Vanessa Automation, CI, Python, JavaScript. Q: Нужно ли покрывать всё тестами? A: Нет, начинаю с самых важных сценариев: там, где поломка стоит дороже всего. ## Деплой, хостинг и техническая поддержка URL: https://oneswitch.ru/uslugi/deploy-i-podderzhka/ Разворачиваю проект на сервере, настраиваю домен, HTTPS, автозапуск и резервные копии, а после запуска сопровождаю и дорабатываю. Что входит: VPS, nginx, HTTPS; Автозапуск через systemd и Docker; Бэкапы и восстановление; Мониторинг и уведомления; Доработки и сопровождение; Передача доступов и документации Для кого: Проектам без своего администратора; Тем, кто хочет надёжный запуск без простоев; Командам, которым нужен постоянный разработчик на поддержке Результат: Проект работает стабильно, а о проблемах вы узнаёте до клиентов. Цена: от 7 000 ₽/мес. Срок: по договорённости. Стек: Linux, nginx, systemd, Docker, Git, Certbot. Q: Что входит в поддержку? A: Мониторинг, обновления, бэкапы, небольшие правки и консультации. Крупные доработки считаются отдельно. # Работы ## InsureHub — страховой портал URL: https://oneswitch.ru/raboty/insurehub/ Информационный портал по ОСАГО, КАСКО, ипотеке, путешествиям и недвижимости. Страницы собирает Python-генератор. Задача: Запустить информационный портал по страхованию, который быстро растёт и хорошо индексируется поисковиками и нейросетями. Статический сайт, который Python-сборщик собирает из структурированных данных. Новый раздел или статья появляется за минуты, а не за дни вёрстки. Разделы: справочник, журнал, рейтинг компаний, направления страхования, партнёрские договоры. Серверный API принимает формы и заявки. Для поисковиков и нейросетей: sitemap, search.json, llms.txt и ai-catalog.json. Стек: Python, HTML/CSS/JS, REST API, SEO, Schema.org. ## HotTrip — авиабилеты, горящие туры, бот и Mini App URL: https://oneswitch.ru/raboty/hottrip/ Экосистема вокруг билетов и туров: портал, ИИ-бот, Telegram Mini App, API и автоматизированный канал. Задача: Собрать единую экосистему вокруг билетов и туров: сайт, который находят в поиске и нейросетях, бот-консультант и поток контента для каналов без ручной работы. Портал: поиск билетов с выбором города вылета, лента горящих рейсов из Telegram, курсы валют, журнал новостей и обзоров, направления, гайды, визы и страхование для выезжающих. ИИ-ассистент подсказывает билеты и подписывает на уведомления о падении цен. Бот и API: Telegram-бот на LLM-агенте (OpenRouter, DeepSeek) с инструментами поиска рейсов, популярных направлений, подписки на радар цен и определения города по геопозиции. Данные приходят из API Travelpayouts и собственного REST API на aiohttp. Mini App: каталог горящих билетов, поиск, радар цен, страховка и чек-лист путешественника внутри Telegram. Партнёрские ссылки идут через безопасный редирект с учётом кликов. Контент-фабрика: каждые 2 часа n8n забирает предложения, складывает в PostgreSQL, собирает дайджесты по городам, подбирает фото Pexels, монтирует видео через ffmpeg и публикует в автоматизированный канал. Стек: n8n, PostgreSQL, Telegram Bot API, Telegram Mini App, OpenRouter, DeepSeek, Travelpayouts, ffmpeg, aiohttp. ## Da Nang House — аренда жилья во Вьетнаме URL: https://oneswitch.ru/raboty/danang-house/ Русскоязычный каталог жилья в Дананге с ботом, Mini App, подписками на новые объявления и автопубликацией в группу. Задача: Собрать каталог жилья в Дананге, чтобы приезжие находили квартиры по району, типу и бюджету, а новые объекты появлялись без ручной работы. Каталог: фильтры по району, типу жилья и бюджету в донгах, сортировка, избранное, фото и видео в карточке, карта и кнопка контакта. База обновляется автоматически каждые 15 секунд. Автоматизация: объявление с сайта уходит вебхуком в n8n, сохраняется в PostgreSQL, публикуется в чат и обновляет каталог. Mini App и подписки: каталог внутри Telegram, карточка объекта с галереей и картой, сохранение поисков и подписка на новые объявления по критериям. Всё работает без участия администратора. Группа: темы по бюджету (до 7, 7–10, 10–15 и от 15 млн, «Цена по запросу»), автопубликация объявлений и закреплённая кнопка «Открыть каталог». Стек: n8n, PostgreSQL, Telegram Bot API, Telegram Mini App, Webhooks. ## Конвейер автопубликаций в соцсети URL: https://oneswitch.ru/raboty/publishing-pipeline/ Материал с сайта превращается в посты и видео, которые уходят на пять площадок по расписанию с проверкой результата. Задача: Публиковать материалы сайта в соцсетях без ручной работы и быть уверенным, что публикация действительно вышла. Площадки: Instagram, TikTok, Pinterest, YouTube и Дзен. Для каждой свой сценарий публикации. После публикации скрипты проверяют расписание и результат, а ошибки фиксируют скриншотом и логом. При сбое операция повторяется, а о проблеме приходит уведомление. Стек: Python, Playwright, ffmpeg, n8n. ## Локальное распознавание документов с фото для 1С URL: https://oneswitch.ru/raboty/raspoznavanie-dokumentov-1c/ Расширение 1С: из фото, скана или PDF накладной документ заполняется за 30–60 секунд. Локальный ИИ, без интернета и облака. Задача: Бухгалтеры и кладовщики вручную вводят накладные поставщиков: УПД и ТОРГ-12, строка за строкой. Один документ занимает 10–15 минут, а таких документов десятки в день. Облачные OCR-сервисы не подходят, потому что документы с ценами и ИНН уходят на чужие серверы. Расширение для 1С использует локальную модель ИИ, которая работает на компьютере клиента через бесплатную программу LM Studio. Данные не покидают компанию, интернет не нужен. Как это работает: сфотографировать или отсканировать документ (фото с телефона, скан, PDF, многостраничные), нажать «Распознать», проверить и провести. Расширение само определяет тип документа, находит поставщика и подбирает товары из справочника номенклатуры. Возможности: УПД и ТОРГ-12, автоопределение типа документа, форматы JPG, PNG и PDF, подбор номенклатуры, автопоиск поставщика. Новые типы документов добавляются отдельной услугой, под вашу учётную политику настраиваются правила заполнения. Проверено на 1С:Управление торговлей 11.5 и 1С:Бухгалтерия предприятия 3.0, для КА, ERP, УНФ и доработанных конфигураций делается индивидуальная интеграция. Код открыт. Продаётся на Инфостарте: расширение для УТ 11.5 или БП 3.0 с установкой и настройкой за 12 200 ₽, комплект с индивидуальной интеграцией за 30 500 ₽, добавление нового типа документов за 3 000 ₽, техподдержка за 3 000 ₽ в месяц. Стек: 1С:Предприятие, Расширение конфигурации, Локальный ИИ, LM Studio, OCR. ## Инструменты разработки для 1С URL: https://oneswitch.ru/raboty/1c-tools/ Рабочий конвейер для 1С: метаданные, сборка обработок, расширения, выгрузка в XML и тестирование форм. Задача: Разрабатывать для 1С так же, как для остальных систем: с исходниками в Git, проверками и автотестами. Создание и проверка метаданных, форм, макетов, ролей, подсистем и СКД. Сборка внешних обработок и отчётов, расширения конфигураций, выгрузка и загрузка конфигурации через XML. Обмен с сайтом и мессенджерами, HTML-формы внутри клиента 1С и тестирование форм в Vanessa Automation. Стек: 1С:Предприятие, XML, Git, Vanessa Automation. # Цены - Старт (Лендинг, визитка, страница под рекламу): от 20 000 ₽, 5–7 дней - Бизнес (Многостраничный сайт, веб-приложение, интеграции): от 70 000 ₽, 3–6 недель - Автоматизация (Бот, Mini App, парсер, скрипт, AI-агент): от 10 000 ₽, за сценарий, 2–10 дней - 1С: обработки, отчёты, расширения: от 2 500 ₽/час или по смете - Поддержка: от 7 000 ₽/мес: правки, мониторинг, бэкапы - Почасовая работа: 2 000 ₽/час для небольших доработок # Блог ## Уведомления в Telegram Mini App: как слать пуши через бота URL: https://oneswitch.ru/blog/uvedomleniya-v-telegram-mini-app/ Дата: 2026-10-30 Mini App открывается внутри Telegram, но **собственных push-уведомлений у него нет**. Всё, что пользователь получает «вне приложения», это сообщения от бота. Разберём, как это устроено и какие ошибки чаще всего мешают. ## Как работают уведомления Mini App всегда привязан к боту. Когда нужно уведомить пользователя (появился новый объект, цена упала, заказ готов), ваш сервер вызывает метод `sendMessage` Bot API от имени бота. Сообщение приходит в личный чат с ботом, и Telegram показывает обычное уведомление. Чтобы бот мог писать пользователю, выполняется одно из условий: - пользователь **запускал бота** (нажал «Start»); - Mini App **запросил разрешение** на сообщения от бота и пользователь согласился. ## Как получить разрешение из Mini App Если пользователь открыл приложение по прямой ссылке и бота не запускал, у него может не быть разрешения писать. В данных пользователя из `initData` есть признак `allows_write_to_pm`. Если он не установлен, запросите разрешение: ```javascript const tg = window.Telegram.WebApp; if (!tg.initDataUnsafe.user?.allows_write_to_pm) { tg.requestWriteAccess((granted) => { // granted === true: можно отправлять сообщения }); } ``` Метод `requestWriteAccess` доступен в версиях Bot API 6.9 и новее. Проверьте поддержку в клиентах пользователей и предусмотрите запасной вариант: кнопку «Включить уведомления», которая открывает диалог с ботом. Не просите разрешение при первом открытии. Лучше всего сделать это в момент, когда оно понятно: после нажатия «Подписаться на новые объявления» или «Сообщить о цене». ## Отправка уведомления Идентификатор личного чата с пользователем совпадает с его `user_id`. Сервер вызывает: ```python import requests def notify(token: str, user_id: int, text: str, app_url: str) -> bool: r = requests.post( f"https://api.telegram.org/bot{token}/sendMessage", json={ "chat_id": user_id, "text": text, "reply_markup": {"inline_keyboard": [[ {"text": "Открыть", "web_app": {"url": app_url}} ]]}, }, timeout=10, ) return r.ok ``` Кнопка с `web_app` открывает приложение прямо из сообщения. Токен бота храните на сервере и не отдавайте в приложение. ## Как открыть нужный экран Чтобы уведомление вело на конкретный объект, есть два способа: 1. **Адрес в кнопке `web_app`:** добавьте в URL параметры (`?item=123`), и приложение откроет нужную карточку. Не доверяйте им без проверки на сервере. 2. **Прямая ссылка Mini App** вида `https://t.me/<бот>/<приложение>?startapp=item_123`. Значение параметра доступно в приложении как `start_param` в `initData`. ## Ошибки и ограничения - **Пользователь заблокировал бота.** Telegram вернёт ошибку (код 403). Пометьте такого пользователя как отписанного и не пытайтесь слать снова. - **Лимиты.** Не отправляйте сообщения слишком часто: по правилам Telegram есть ограничения по скорости. Для массовых рассылок используйте очередь и паузы. - **Дубли.** Храните, что уже отправлено каждому, чтобы повторный запуск воркера не слал одно и то же. Подробности про защиту от дублей: [как не публиковать повторы](/blog/dedup-v-avtoposting-n8n-postgresql/). - **Частота.** Объединяйте события в один дайджест, а не шлите по сообщению на каждое. - **Тихие уведомления.** Для неважных событий используйте параметр `disable_notification`, чтобы сообщение приходило без звука. - **Согласие.** Давайте простой способ отключить уведомления прямо в сообщении или приложении. ## Где применено Так работают подписки в наших проектах: пользователь сохраняет критерии в Mini App, а бот присылает уведомление, когда появляется подходящий вариант. Подробнее в разборе [архитектуры каталога](/blog/katalog-v-telegram-mini-app-arhitektura/) и в проектах [Da Nang House](/raboty/danang-house/) и [HotTrip](/raboty/hottrip/). Услуга: [«Telegram-боты и Mini App»](/uslugi/telegram-boty-i-mini-app/). ## Частые вопросы ### Может ли Mini App отправить push сам, без бота? Нет. Уведомления отправляет бот, к которому привязано приложение. ### Нужно ли пользователю нажимать Start, чтобы получать сообщения? Нужно либо запустить бота, либо дать разрешение на сообщения через `requestWriteAccess`. Без этого бот не сможет написать первым. ### Как проверить, что пользователь заблокировал бота? По ошибке при отправке: Telegram вернёт отказ с кодом 403. После этого не отправляйте ему сообщения и пометьте подписку неактивной. ### Как передать данные из уведомления в приложение? Через параметры адреса в кнопке `web_app` или через параметр `startapp` прямой ссылки. На сервере всегда проверяйте, что пользователь имеет право видеть эти данные. ## Telegram-бот на n8n: inline-кнопки, меню и кнопка для открытия Mini App URL: https://oneswitch.ru/blog/telegram-bot-n8n-knopki-menu-mini-app/ Дата: 2026-10-30 В n8n бота можно собрать без отдельного кода: приём сообщений, меню, кнопки и ответы. Разберём схему сценария, обработку нажатий и кнопку, которая открывает Mini App. ## Из чего состоит бот в n8n 1. **Telegram Trigger**: принимает обновления (сообщения и нажатия на кнопки). 2. **Ветвление (Switch или IF)**: определяет, что пришло: команда, текст или нажатие кнопки. 3. **Узлы обработки:** запросы к базе, API, расчёты. 4. **Узел отправки Telegram** или **HTTP Request**: отправляет ответ пользователю. Чтобы триггер работал на постоянной основе, workflow должен быть **активирован**: тестовый режим подходит только для проверки, а боевой webhook регистрируется при активации. Для этого у n8n должен быть публичный адрес с HTTPS. ## Команды и меню Команды вида `/start` приходят обычным сообщением, поэтому в ветвлении проверяйте начало текста. Подсказки команд в интерфейсе Telegram задаются у **@BotFather** (команда `/setcommands`): это только список для пользователя, логику обрабатывает ваш сценарий. ## Inline-кнопки Inline-кнопки отправляются в узле отправки сообщения через настройку клавиатуры (Reply Markup, Inline Keyboard). У каждой кнопки есть текст и либо `callback_data`, либо ссылка. Когда пользователь нажимает кнопку с `callback_data`, Telegram присылает обновление **callback_query**, а не сообщение. В нём лежат данные кнопки и идентификатор запроса. Важные правила: - **Отвечайте на нажатие.** Нужно вызвать ответ на callback-запрос (в узле Telegram это операция Answer Query), иначе у пользователя на кнопке будет крутиться индикатор загрузки. - **Разбирайте `callback_data`** ветвлением: например, `catalog:next`, `sub:on`, `sub:off`. Держите значения короткими: у Telegram есть ограничение на длину. - **Редактируйте исходное сообщение** вместо отправки нового, если это переключение страницы или состояния. Так чат не засоряется. ## Кнопка, которая открывает Mini App Кнопку с открытием Mini App удобнее всего отправлять через узел **HTTP Request**, обращаясь к Bot API напрямую. Адрес: `https://api.telegram.org/bot<токен>/sendMessage`, тело в JSON: ```json { "chat_id": "{{ $json.message.chat.id }}", "text": "Открыть каталог", "reply_markup": { "inline_keyboard": [[ { "text": "Каталог", "web_app": { "url": "https://example.com/app" } } ]] } } ``` Адрес Mini App должен быть доступен по HTTPS. Токен бота храните в учётных данных n8n, а не в тексте узла. ## Подводные камни - **Один webhook на бота.** У бота может быть только один активный webhook. Если вы запускаете в n8n Telegram Trigger и одновременно опрашиваете `getUpdates` кодом или регистрируете другой webhook, получите конфликты и потерянные сообщения. - **Тестовые и боевые адреса.** В тестовом режиме у webhook другой адрес. Не оставляйте в боте тестовый URL. - **Повторные сообщения.** Telegram повторяет доставку, если не получил быстрый ответ. Не делайте в сценарии долгих операций до ответа и защитите критичные действия от повторов (запоминайте `update_id`). - **Лимиты отправки.** Не рассылайте много сообщений подряд: используйте паузы и очередь. - **Ошибки пользователю.** Если запрос к базе не удался, отправьте понятное сообщение, а не оставляйте бота молчать. ## Где это применено На n8n работает, например, ИИ-консультант HotTrip: n8n принимает сообщения, вызывает инструменты и API, а ответы приходят в Telegram. У проектов с Mini App кнопки бота ведут в приложение. Подробности в проектах [HotTrip](/raboty/hottrip/) и [Da Nang House](/raboty/danang-house/), а также в услугах [«Telegram-боты и Mini App»](/uslugi/telegram-boty-i-mini-app/) и [«Автоматизация процессов»](/uslugi/avtomatizaciya-processov/). ## Частые вопросы ### Нужен ли код, чтобы сделать бота в n8n? Для типового бота нет: меню, кнопки, ответы и запросы к API собираются из узлов. Код понадобится для нестандартной логики или функций, которых нет в узле Telegram. ### Почему кнопка «зависает» после нажатия? Не отправлен ответ на callback-запрос. Добавьте в сценарий операцию ответа на нажатие. ### Можно ли сделать бота и Mini App вместе? Да. Бот отправляет кнопку с `web_app`, Mini App открывается внутри Telegram и обращается к вашему API. Данные пользователя нужно проверять по подписи `initData`. ### Что делать, если бот перестал получать сообщения? Проверьте, что workflow активирован, что у бота установлен нужный webhook и что нет конфликта с другим процессом, который использует тот же токен. ## Сколько стоит Telegram-бот и Mini App: из чего складывается цена URL: https://oneswitch.ru/blog/skolko-stoit-telegram-bot-i-mini-app/ Дата: 2026-10-30 На вопрос «сколько стоит бот» честный ответ: от «недорого» до «как небольшое веб-приложение». Ниже типы проектов, факторы цены и ориентиры, которые я использую в работе. ## Три типа проектов | Тип | Что умеет | Ориентир | |---|---|---| | **Простой бот** | Меню, ответы, приём заявок в чат или таблицу | от 15 000 ₽, срок от 3 дней | | **Бот с интеграциями и ИИ** | Данные из CRM, 1С или API, подписки, уведомления, ИИ-консультант | дороже простого бота, зависит от числа интеграций, срок 1–3 недели | | **Mini App** | Интерфейс внутри Telegram: каталог, фильтры, карточки, личный кабинет | ближе к тарифу «Бизнес» (от 70 000 ₽), срок 3–6 недель | Это мои ориентиры «от», а не фиксированные цены: точную стоимость я называю после короткого брифа и фиксирую до начала работ. Подробный прайс в разделе [«Цены»](/ceny/). ## Что влияет на стоимость - **Число сценариев.** Один сценарий «оставить заявку» и пятнадцать веток с условиями — разный объём. - **Интеграции.** CRM, платежи, 1С, партнёрские API: каждая связь добавляет работу и тесты. - **Данные и база.** Если нужно хранить пользователей, подписки, историю, придётся проектировать базу и API. - **Интерфейс.** Бот работает на готовых элементах Telegram, а Mini App — это свой интерфейс, который нужно спроектировать и сверстать. - **ИИ.** Ассистент с доступом к вашим данным требует настройки инструментов, проверок и ограничений. - **Роли и админка.** Отдельная панель управления контентом или заявками — дополнительная часть проекта. - **Надёжность.** Логи, повторы, уведомления об ошибках и автотесты увеличивают цену, но снижают риск сбоев. - **Сроки.** Срочная работа обычно дороже. ## Чего не включено в цену разработки Эти расходы платятся отдельно и не зависят от исполнителя: - сервер или хостинг и домен; - платные внешние API и подписки; - токены ИИ-моделей, если используются облачные модели. Я называю их размер заранее, чтобы не было неожиданностей. ## Как сэкономить и не потерять в качестве 1. **Начните с минимальной версии.** Запустите главный сценарий и развивайте его по реальным данным. 2. **Опишите задачу своими словами:** что должно происходить, для кого и что считать успехом. 3. **Используйте готовые элементы** Telegram там, где отдельный интерфейс не нужен. 4. **Договоритесь об этапах и оплате по результатам.** 5. **Сразу попросите исходники и доступы.** ## Бот или Mini App Если нужны короткие сценарии (заявка, уведомление, ответ на вопрос), хватит бота. Если нужны каталог с фильтрами, фото и личный кабинет, Mini App заметно удобнее, а бот остаётся каналом уведомлений. Подробнее в сравнении [Mini App или сайт](/blog/telegram-mini-app-ili-sajt/) и в статье про [архитектуру каталога](/blog/katalog-v-telegram-mini-app-arhitektura/). ## Примеры работ Бот и Mini App с подписками и каталогом: [Da Nang House](/raboty/danang-house/). Бот с ИИ-консультантом, Mini App и автоматизированным каналом: [HotTrip](/raboty/hottrip/). Услуга: [«Telegram-боты и Mini App»](/uslugi/telegram-boty-i-mini-app/). ## Частые вопросы ### Можно ли сделать бота бесплатно или очень дёшево? Простого бота на конструкторе можно собрать самому. Но как только нужны интеграции, база данных или нестандартная логика, понадобится разработка. ### Сколько времени занимает разработка? Простой бот от нескольких дней, бот с интеграциями 1–3 недели, Mini App 3–6 недель. Сроки зависят от объёма и скорости согласований. ### Что нужно подготовить, чтобы получить точную оценку? Описание сценария, список интеграций и данных, примеры похожих решений, желаемый срок. Достаточно нескольких строк, остальное уточним на брифе. ### Нужна ли поддержка после запуска? Желательна: обновления, мониторинг и небольшие доработки. Поддержка считается отдельно, обычно помесячно. ## Распознавание УПД в 1С из фото и PDF: облако или локальный ИИ URL: https://oneswitch.ru/blog/raspoznavanie-upd-v-1s-chem-zagruzit-dokumenty/ Дата: 2026-10-30 Накладную поставщика можно занести в 1С четырьмя способами. У каждого свои условия, и универсального лучшего нет. Ниже сравнение, чек-лист проверки и список ошибок, на которых распознавание чаще всего ошибается. ## Четыре способа занести документ | Способ | Когда подходит | Что учесть | |---|---|---| | **Вручную** | Единицы документов в месяц | Долго: 10–15 минут на документ, легко ошибиться в строках | | **Из ЭДО (XML)** | Поставщик отправляет электронный УПД | Самый точный способ: распознавание не нужно, данные приходят структурой | | **Облачный OCR** | Бумажные документы, нет ограничений на отправку данных | Документы с ценами и ИНН уходят на сторонние серверы, нужен интернет | | **Локальная модель ИИ** | Бумажные или сканированные документы, данные нельзя отправлять наружу | Нужен компьютер с достаточной мощностью, результат зависит от модели и качества скана | Главное правило: **если документ приходит в электронном виде через ЭДО, распознавать его не нужно**. Распознавание нужно для бумаги, сканов и фото, то есть для документов, где структуры данных нет. ## Когда нужна локальная нейросеть Локальный вариант выбирают в трёх случаях: 1. **Данные нельзя отправлять наружу.** В накладных есть цены закупки, ИНН, список поставщиков. Для части компаний это коммерческая тайна или требование службы безопасности. 2. **Нет стабильного интернета** или он ограничен политикой компании. 3. **Нужен контроль над правилами заполнения:** как подбирать номенклатуру, какую учётную политику применять. Если таких ограничений нет, облачный сервис проще: не нужно настраивать компьютер и модель. ## Что нужно для локального режима - Программа для запуска модели. Например, **LM Studio**: бесплатная, работает на компьютере пользователя. - Модель, которая умеет читать изображения (vision-модель). - Компьютер с достаточной мощностью. Модель можно запустить и на процессоре, но на слабом железе документ будет обрабатываться заметно дольше. Ориентируйтесь на тест на вашем компьютере, а не на чужие цифры. - Расширение для 1С, которое отправляет изображение в модель и заполняет документ. ## Как проверить любое решение на своих документах Не верьте демонстрациям, проверьте на своих данных: 1. Возьмите **20–30 реальных документов** разного качества: чёткие PDF, сканы, фото с телефона, помятые, многостраничные. 2. Для каждого сравните: **поставщика и ИНН, номера и даты, количество и цены в строках, НДС и итоговую сумму**. 3. Отдельно посмотрите, как подбирается номенклатура: сколько позиций сопоставилось само, сколько потребовало ручной правки. 4. Измерьте время: от нажатия кнопки до заполненного документа. 5. Проверьте, что происходит с нераспознанным: должна быть понятная пометка, а не тихая ошибка. Критерий готовности простой: сумма документа в 1С совпадает с суммой на бумаге, а проверка человеком занимает меньше времени, чем ручной ввод. ## На чём распознавание ошибается чаще всего - **Похожие символы:** 0 и О, 1 и I, 5 и S в артикулах и ИНН. - **Склеенные или сдвинутые колонки** в узких таблицах. - **Штампы и подписи**, закрывающие цифры. - **Многостраничные документы,** где шапка и итог на разных страницах. - **Фото под углом** и плохое освещение. - **Единицы измерения** (шт, упак, кг), которые не совпадают со справочником. Поэтому полностью без проверки проводить такие документы нельзя. Правильная схема: система заполняет документ, **человек проверяет и проводит**. ## Как это сделано в моём расширении Расширение «Локальное распознавание документов с фото для 1С» работает на локальной модели через LM Studio: фото, скан или PDF отправляются в модель на компьютере пользователя, документ определяется как УПД или ТОРГ-12, подбираются поставщик и номенклатура, а документ заполняется за 30–60 секунд. Интернет не нужен, данные не покидают компьютер. Проверено на 1С:Управление торговлей 11.5 и 1С:Бухгалтерия предприятия 3.0, для других конфигураций делается индивидуальная интеграция. Подробности и цены на [странице проекта](/raboty/raspoznavanie-dokumentov-1c/) и на [Инфостарте](https://infostart.ru/marketplace/2700415/). О других услугах по 1С читайте в разделе [«1С и учётные системы»](/uslugi/1c/). ## Частые вопросы ### Нужно ли распознавание, если поставщик работает через ЭДО? Нет. Электронный УПД загружается из XML без распознавания и точнее любого OCR. Распознавание нужно для бумажных документов, сканов и фото. ### Можно ли запускать модель без видеокарты? Технически да, на процессоре, но обработка идёт медленнее. Проверьте скорость на своём компьютере на реальных документах, прежде чем внедрять. ### Как избежать ошибок в ИНН и суммах? Сверяйте итоговую сумму документа с суммой на бумаге, проверяйте ИНН по справочнику контрагентов и всегда оставляйте проверку человеком перед проведением. ### Насколько безопасно облачное распознавание? Это зависит от сервиса и ваших требований. Если документы содержат коммерческую тайну, уточните, где хранятся и обрабатываются данные, или выберите локальный вариант. ## Проверка initData в Telegram Mini App на Python: код и ошибки URL: https://oneswitch.ru/blog/proverka-initdata-telegram-mini-app-python/ Дата: 2026-10-30 Когда Mini App обращается к вашему серверу, вам нужно убедиться, что запрос действительно пришёл из Telegram от конкретного пользователя, а не от злоумышленника, который подставил чужой `user_id`. Для этого Telegram подписывает строку **initData**, а сервер проверяет подпись. ## Как устроена проверка Mini App получает `Telegram.WebApp.initData` — строку вида `query_id=...&user=...&auth_date=...&hash=...`. Проверка делается так: 1. Разобрать строку на пары ключ-значение (значения декодируются из URL). 2. Убрать поле `hash`, остальные пары отсортировать по ключу и склеить в строку `ключ=значение`, разделяя **переводом строки**. 3. Вычислить **секретный ключ**: HMAC-SHA256, где ключ — строка `WebAppData`, а сообщение — токен бота. 4. Вычислить HMAC-SHA256 строки из шага 2 с этим секретом и сравнить результат (в hex) с полученным `hash`. 5. Проверить, что `auth_date` не старше разумного срока. ## Рабочий код ```python import hashlib import hmac import json import time from urllib.parse import parse_qsl def validate_init_data(init_data: str, bot_token: str, max_age: int = 3600) -> dict: """Возвращает данные Mini App, если подпись верна и данные свежие, иначе бросает ValueError.""" pairs = dict(parse_qsl(init_data, keep_blank_values=True)) received_hash = pairs.pop("hash", None) if not received_hash: raise ValueError("нет hash") check_string = "\n".join(f"{k}={v}" for k, v in sorted(pairs.items())) secret_key = hmac.new(b"WebAppData", bot_token.encode(), hashlib.sha256).digest() expected = hmac.new(secret_key, check_string.encode(), hashlib.sha256).hexdigest() if not hmac.compare_digest(expected, received_hash): raise ValueError("подпись не совпала") if time.time() - int(pairs.get("auth_date", 0)) > max_age: raise ValueError("данные устарели") if "user" in pairs: pairs["user"] = json.loads(pairs["user"]) return pairs ``` Мы прогнали этот код на подписанном образце, на подмене данных, на чужом токене и на устаревшем `auth_date`: корректные данные принимаются, остальные отклоняются. ## Как передать initData на сервер Фронтенд отправляет строку в заголовке запроса, а сервер проверяет её на каждом обращении: ```javascript fetch("/api/me", { headers: { Authorization: "tma " + Telegram.WebApp.initData } }); ``` Префикс `tma` — распространённая договорённость, а не требование Telegram. Пример проверки в aiohttp: ```python from aiohttp import web async def me(request: web.Request) -> web.Response: auth = request.headers.get("Authorization", "") if not auth.startswith("tma "): raise web.HTTPUnauthorized() try: data = validate_init_data(auth[4:], BOT_TOKEN) except ValueError: raise web.HTTPUnauthorized() return web.json_response({"user_id": data["user"]["id"]}) ``` В FastAPI та же функция подключается как зависимость (`Depends`), которая читает заголовок и вызывает `validate_init_data`. ## Типичные ошибки - **Проверка на клиенте.** Подпись должна проверяться только на сервере: токен бота нельзя отдавать во фронтенд. - **Сравнение через `==`.** Используйте `hmac.compare_digest`, чтобы не открыть атаку по времени ответа. - **Забытый `auth_date`.** Без проверки срока старые перехваченные данные работают вечно. - **Неправильный порядок ключей** или лишние поля в строке проверки. Поле `hash` в строку не входит, остальные идут отсортированными по алфавиту. - **Не тот токен.** Подпись привязана к токену конкретного бота. Если у вас несколько ботов, храните токен вместе с приложением. - **Доверие к `initDataUnsafe`.** Это те же данные без проверки. Использовать их для авторизации нельзя. ## Где это пригодится Проверка `initData` нужна любому Mini App, который хранит данные пользователя: избранное, подписки на уведомления, сохранённые поиски. Так устроены Mini App в наших проектах: [Da Nang House](/raboty/danang-house/) и [HotTrip](/raboty/hottrip/). Если вы строите бота или Mini App, посмотрите услугу [«Telegram-боты и Mini App»](/uslugi/telegram-boty-i-mini-app/). ## Частые вопросы ### Можно ли доверять user_id из initDataUnsafe? Нет. `initDataUnsafe` — это распарсенные данные без проверки подписи. Для авторизации используйте только данные, которые прошли `validate_init_data`. ### Как долго initData действителен? Telegram передаёт время создания в `auth_date`, а срок годности определяете вы. Для обычных запросов хватает часа, для чувствительных операций берут меньше. ### Что делать при ошибке «подпись не совпала»? Проверьте, что токен принадлежит тому боту, из которого открыт Mini App, что `hash` исключён из строки проверки, что пары отсортированы по ключу и склеены переводом строки. ### Нужна ли проверка, если Mini App только читает публичные данные? Если данные публичны и не привязаны к пользователю, проверка не обязательна. Как только появляются личные данные или действия от имени пользователя, она обязательна. ## Отправка сообщений из 1С в Telegram: код, chat_id и подводные камни URL: https://oneswitch.ru/blog/otpravka-soobshchenij-iz-1s-v-telegram/ Дата: 2026-10-30 Уведомления из 1С в Telegram можно настроить без платных расширений: достаточно бота и нескольких десятков строк кода. Разберём схему, код и места, где чаще всего ошибаются. ## Как это устроено 1. В Telegram через **@BotFather** создаётся бот, вы получаете **токен**. 2. Пользователь пишет боту, и Telegram присваивает ему **chat_id**. 3. 1С вызывает метод **sendMessage** Telegram Bot API по HTTPS, передав токен и chat_id. Сложность не в отправке, а в **привязке**: Telegram позволяет писать только тому, кто сам начал диалог с ботом, и только по его chat_id. Поэтому в 1С нужно хранить соответствие «пользователь или сотрудник → chat_id». ## Отправка сообщения: код ```bsl Функция ОтправитьВTelegram(Токен, ИдЧата, Текст) Экспорт Данные = Новый Структура("chat_id, text, parse_mode", ИдЧата, Текст, "HTML"); Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, Данные); Тело = Запись.Закрыть(); Запрос = Новый HTTPЗапрос("/bot" + Токен + "/sendMessage"); Запрос.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8"); Запрос.УстановитьТелоИзСтроки(Тело, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Соединение = Новый HTTPСоединение("api.telegram.org", , , , , 30, Новый ЗащищенноеСоединениеOpenSSL()); Ответ = Соединение.ОтправитьДляОбработки(Запрос); Если Ответ.КодСостояния <> 200 Тогда ВызватьИсключение "Telegram вернул код " + Ответ.КодСостояния + ": " + Ответ.ПолучитьТелоКакСтроку(); КонецЕсли; Возврат Ответ.ПолучитьТелоКакСтроку(); КонецФункции ``` Проверьте код на своей версии платформы: имена методов и параметры конструктора могут отличаться в старых релизах. ## Как узнать chat_id пользователя Есть два рабочих способа: - **Вручную для себя или админа:** напишите боту, затем откройте в браузере `https://api.telegram.org/bot<токен>/getUpdates` и найдите `chat.id` в ответе. - **Для сотрудников:** бот предлагает кнопку «Поделиться контактом». Telegram присылает номер телефона, а 1С находит по нему пользователя и сохраняет chat_id в регистре сведений. **Обязательно проверяйте, что контакт принадлежит самому отправителю:** в данных контакта `user_id` должен совпадать с `from.id`. Иначе кто угодно сможет «подсунуть» чужой номер и получать чужие уведомления. ## Подводные камни - **Токен.** Не храните его в тексте модуля. Вынесите в константу с ограниченным доступом или в безопасное хранилище, чтобы он не попал в выгрузку конфигурации и в Git. - **Лимиты.** По справке Telegram, бот может отправлять около 30 сообщений в секунду в целом и около одного сообщения в секунду в один чат. Для массовых рассылок делайте паузу и очередь. - **Не блокируйте проведение.** Отправку выносите в **фоновое задание** или регламентное задание, иначе недоступный интернет замедлит документ. Ошибки пишите в журнал регистрации. - **Недоставленные сообщения.** Если пользователь заблокировал бота, Telegram вернёт ошибку: помечайте такого получателя и не пытайтесь слать снова. - **Формат текста.** При `parse_mode` = `HTML` экранируйте символы `<`, `>` и `&` в данных из базы. ## Входящие сообщения: webhook или опрос Если боту нужно принимать команды (например, «Согласовать документ»), есть два способа: - **Webhook:** Telegram сам присылает обновления на ваш HTTPS-адрес. Нужен доступный из интернета адрес с сертификатом, обычно это HTTP-сервис 1С или отдельный сервер. - **Опрос getUpdates** регламентным заданием: проще, не требует внешнего адреса, но с задержкой. ## Когда проще не писать самому Если нужны согласования в боте, карточки документов, связка с несколькими базами или интеграция сайта и бота, удобнее вынести логику на отдельный сервис (Python или n8n), а 1С оставить источником событий и данных. Подробнее об интеграциях 1С с Telegram, сайтами и другими системами в разделе [«1С и учётные системы»](/uslugi/1c/) и в услуге [«Telegram-боты и Mini App»](/uslugi/telegram-boty-i-mini-app/). ## Частые вопросы ### Можно ли отправить сообщение в группу или канал? Да. Добавьте бота в группу или канал администратором и используйте chat_id группы (он начинается с минуса) или `@имя_канала`. ### Нужен ли для отправки внешний сервер? Нет. Для отправки достаточно, чтобы сервер 1С имел доступ в интернет к `api.telegram.org`. Внешний адрес нужен только для приёма сообщений через webhook. ### Что делать, если из 1С запрос не проходит? Проверьте доступ сервера 1С к интернету и прокси, версию платформы, корректность токена и кодировку тела (UTF-8). В тексте ошибки Telegram обычно указано, чего не хватает. ### Как безопасно хранить токен? В константе или регистре с ограничением по ролям, а не в тексте модуля. Если токен попал в выгрузку или репозиторий, перевыпустите его в @BotFather. ## Обмен 1С с сайтом: HTTP-сервис или OData, авторизация и частые ошибки URL: https://oneswitch.ru/blog/obmen-1s-s-sajtom-http-servis-odata/ Дата: 2026-10-30 Сайт и 1С обмениваются данными в двух типовых сценариях: сайт забирает из 1С каталог, цены и остатки, а 1С забирает заказы и заявки с сайта. Разберём два способа и правила, которые не дают обмену превратиться в источник сбоев. ## Два способа: OData и HTTP-сервис | | **OData (стандартный интерфейс)** | **HTTP-сервис** | |---|---|---| | Что это | Встроенный REST-подобный доступ к объектам конфигурации | Свои методы с вашей логикой | | Когда выбирать | Простые чтение и запись справочников и документов | Нужна своя обработка: расчёты, проверки, сборка ответа под сайт | | Настройка | Включить состав стандартного интерфейса OData и опубликовать базу | Создать объект «HTTP-сервис», написать обработчики, опубликовать | | Минусы | Отдаёт структуру 1С как есть, тяжёлые выборки, неудобные имена | Нужно писать и сопровождать код | Практическое правило: **для каталога и остатков чаще удобнее свой HTTP-сервис** с компактным ответом, а OData годится для быстрых прототипов и административных задач. ## OData: пример чтения из Python После включения OData и публикации базы объекты доступны по адресу вида `http://сервер/база/odata/standard.odata/Catalog_Номенклатура`. ```python import requests BASE = "https://example.com/base/odata/standard.odata" def items(top: int = 10) -> list[dict]: r = requests.get( f"{BASE}/Catalog_Номенклатура", params={"$format": "json", "$top": top}, auth=("integration", "пароль-из-хранилища"), timeout=20, ) r.raise_for_status() return r.json()["value"] ``` Логин и пароль берите из переменных окружения или хранилища секретов, а не из кода. ## HTTP-сервис: пример метода В конфигураторе создаётся объект «HTTP-сервис» с корневым URL и шаблоном. Обработчик метода возвращает ответ с JSON: ```bsl Функция ТоварыGET(Запрос) Данные = Новый Массив; // ... заполнение данных из справочника ... Запись = Новый ЗаписьJSON; Запись.УстановитьСтроку(); ЗаписатьJSON(Запись, Данные); Ответ = Новый HTTPСервисОтвет(200); Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8"); Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8); Возврат Ответ; КонецФункции ``` Адрес метода формируется как `http://сервер/база/hs/корневойURL/шаблон`. Проверяйте синтаксис на своей версии платформы. ## Правила безопасности - **Не открывайте базу в интернет напрямую.** Ставьте перед 1С обратный прокси (например, nginx) с HTTPS и ограничением по IP-адресам сайта. - **Отдельный пользователь для интеграции** с минимальной ролью: только те объекты и права, которые нужны обмену. - **HTTPS обязательно.** Логин и пароль в Basic-авторизации по HTTP уходят открытым текстом. - **Пароли и токены не хранят в коде.** Переменные окружения или хранилище секретов. - **Ограничьте объём выдачи:** пагинация и лимиты, чтобы один запрос не загрузил сервер 1С. ## Правила надёжности обмена 1. **Идемпотентность.** Каждому заказу присваивайте уникальный идентификатор. Если запрос ушёл повторно, 1С должна понять, что заказ уже есть, а не создать дубль. 2. **Очередь и повторы.** Не пишите в 1С прямо из обработчика на сайте. Сохраняйте заказ у себя и передавайте в 1С отдельным процессом с повторными попытками. 3. **Статус обмена.** Храните у каждого заказа признак «передан в 1С» и время. Это позволит найти потерянные и увидеть сбои. 4. **Не блокируйте пользователя.** Если 1С недоступна, сайт должен принять заказ и передать позже. 5. **Версии и совместимость.** Меняя формат ответа, сохраняйте старые поля или версионируйте методы (`/v1/`, `/v2/`). 6. **Логи.** Пишите в журнал каждый вызов и ошибку, иначе разбор сбоев превращается в угадывание. ## Типичные ошибки - **Кодировка.** Отправляйте и принимайте JSON в UTF-8 и явно указывайте её в заголовке. - **Тяжёлые выборки.** Запрос «все товары» с реквизитами и остатками вешает сеанс. Делайте страницы и отдельный метод остатков. - **Сеансы и лицензии.** Каждое обращение использует сеанс базы: проверьте лицензирование и настройте тайм-ауты. - **Часовые пояса и даты.** Передавайте даты в едином формате и часовом поясе. - **Изменили конфигурацию.** После обновления проверьте, что методы опубликованы, права на месте и формат не изменился. ## Что дальше Если нужно связать 1С с сайтом, интернет-магазином, Telegram и другими сервисами, подробности в разделе [«1С и учётные системы»](/uslugi/1c/) и в услуге [«Интеграции и API»](/uslugi/integracii-i-api/). Родственные темы: [отправка сообщений из 1С в Telegram](/blog/otpravka-soobshchenij-iz-1s-v-telegram/). ## Частые вопросы ### Что лучше для сайта: OData или HTTP-сервис? Для быстрого прототипа и административных задач подойдёт OData. Для рабочего обмена с каталогом, остатками и заказами чаще удобнее HTTP-сервис с компактным ответом. ### Можно ли подключить сайт к 1С без прямого доступа из интернета? Да, и это правильнее. Держите 1С во внутренней сети и вызывайте её через прокси с ограничением по IP или через отдельный сервис-посредник, который сам обращается к 1С. ### Как избежать дублей заказов? Передавайте уникальный идентификатор заказа и проверяйте его на стороне 1С перед созданием документа. ### Что делать, если 1С временно недоступна? Принимайте заказ на сайте, храните его в очереди и повторяйте передачу, пока не получите подтверждение. ## n8n webhook: как защитить и принимать данные с сайта без дублей URL: https://oneswitch.ru/blog/n8n-webhook-zashchita-avtorizaciya/ Дата: 2026-10-30 Webhook в n8n принимает данные с сайта, из формы или от другого сервиса и запускает сценарий. Если оставить его без защиты, любой, кто узнает адрес, сможет слать запросы и запускать вашу автоматизацию. Разберём настройку шаг за шагом. ## Тестовый и боевой адрес У узла Webhook два адреса: - **Test URL** (`/webhook-test/...`) работает только пока вы нажали «Listen for test event» в редакторе. Подходит для отладки. - **Production URL** (`/webhook/...`) работает, когда workflow **активирован**. Частая ошибка: форма на сайте ссылается на тестовый адрес, и после закрытия редактора данные перестают приходить. На сайте всегда используйте боевой адрес. ## Авторизация В узле Webhook есть настройка **Authentication**: Basic Auth, Header Auth или JWT. Для запросов с сайта и от сервисов удобнее **Header Auth**: вы создаёте учётные данные с именем заголовка (например, `X-Webhook-Token`) и длинным случайным значением. Запрос без правильного заголовка отклоняется. Пример запроса: ```bash curl -X POST https://n8n.example.com/webhook/lead \ -H "X-Webhook-Token: <секретный-токен>" \ -H "Content-Type: application/json" \ -d '{"request_id": "7f3c...", "name": "Анна", "contact": "@anna", "msg": "Нужен сайт"}' ``` Важно: **секрет нельзя вставлять в код страницы**, потому что его увидит любой посетитель. Запрос с токеном должен идти с вашего сервера, а не из браузера. Если форма открытая, отправляйте её на свой бэкенд, а он уже обращается к n8n. ## Дополнительная защита на прокси Перед n8n обычно стоит nginx. Там можно: - **ограничить доступ по IP** к пути `/webhook/...` (только ваш сервер или сервис-отправитель); - **ограничить частоту запросов**, чтобы переполнение не положило сценарий; - **ограничить размер тела**, чтобы не принимать лишние мегабайты. Это работает независимо от токена и закрывает массовые попытки перебора. ## Как отвечать сайту В узле Webhook настраивается, **когда** отправлять ответ: - **Сразу** (Immediately): быстро, но ответ без результата. Подходит для заявок. - **После последнего узла:** сайт ждёт всю обработку, и при сбое запрос повиснет. - **Узлом Respond to Webhook:** вы сами решаете, где в сценарии отвечать, и что вернуть. Практическое правило: **ответьте как можно раньше** (подтвердите, что запрос принят), а тяжёлую работу (запись в базу, отправку сообщений, обращения к внешним API) делайте после ответа. Так сайт не зависит от скорости остальных систем. ## Защита от дублей и подделки 1. **Идентификатор запроса.** Отправляйте уникальный `request_id` (например, UUID). В сценарии сначала проверяйте, не обрабатывали ли вы его, и только потом выполняйте действия. 2. **Проверка данных.** Проверяйте обязательные поля и длину, не доверяйте типам: вебхук принимает любой JSON. 3. **Подпись.** Если отправитель поддерживает подпись тела (HMAC), проверяйте её в узле Code. Это надёжнее общего токена. 4. **Ограниченные права.** Учётные данные, которые использует сценарий (база, бот), должны иметь минимум прав. ## Типичная схема: заявка с сайта в базу и чат В нашем проекте каталога жилья это выглядит так: форма на сайте отправляет данные на webhook, в n8n они проверяются и записываются в PostgreSQL, затем публикуются в группу в Telegram, и сайту возвращается ответ. Подробнее об автоматизации каталога: [Da Nang House](/raboty/danang-house/). О схеме автопубликаций читайте в статье [автопостинг в Telegram на n8n и PostgreSQL](/blog/avtoposting-v-telegram-n8n-postgresql/). ## Что ещё проверить - **Обновления n8n и доступ к панели:** ограничьте вход в редактор и храните учётные данные только в разделе credentials. - **Логи выполнений.** Включите хранение ошибок, чтобы видеть неудачные запросы. - **Уведомление о сбоях.** Подключите отдельный workflow, который сообщает вам об ошибках. Если нужна помощь с интеграциями и автоматизацией, смотрите услугу [«Автоматизация процессов»](/uslugi/avtomatizaciya-processov/) и [«Интеграции и API»](/uslugi/integracii-i-api/). ## Частые вопросы ### Можно ли оставить webhook без авторизации? Только если запускаемый сценарий безопасен и ничего не меняет. Любой, кто знает адрес, сможет его вызвать. Для рабочих сценариев включайте авторизацию. ### Почему данные перестали приходить? Чаще всего форма указывает на тестовый адрес или workflow не активирован. Проверьте, что используется Production URL и workflow включён. ### Как не создавать дубли при повторной отправке? Передавайте уникальный идентификатор запроса и проверяйте его в сценарии до выполнения действий, например записью в таблицу с уникальным ключом. ### Нужен ли HTTPS для webhook? Да. Токены и данные пользователей не должны идти по открытому каналу, а для Telegram и многих сервисов HTTPS обязателен. ## Распознавание накладных в 1С без облака: УПД и ТОРГ-12 из фото URL: https://oneswitch.ru/blog/lokalnoe-raspoznavanie-dokumentov-v-1s/ Дата: 2026-10-30 Бухгалтеры и кладовщики каждый день вносят в 1С накладные поставщиков: открыть документ, найти контрагента, ввести каждую строку, цену, количество и НДС. На один документ уходит 10–15 минут, а документов десятки. ## Как это устроено 1. **Фото или скан.** Подходят снимок с телефона, скан или PDF, в том числе многостраничный. 2. **Распознавание.** Расширение отправляет изображение в локальную модель ИИ, определяет тип документа (УПД или ТОРГ-12), находит поставщика и подбирает товары из справочника номенклатуры. 3. **Проверка.** Документ в 1С уже заполнен, остаётся проверить и провести. В моём расширении для 1С модель запускается через бесплатную программу LM Studio прямо на компьютере пользователя. На один документ уходит 30–60 секунд. ## Почему локально, а не облачный OCR - **Безопасность данных.** Накладные содержат цены, ИНН и список поставщиков. Локальная обработка исключает отправку на чужие серверы. - **Работа без интернета.** Пропала связь, а документы продолжают обрабатываться. - **Контроль.** Правила заполнения и учётную политику можно настроить под вашу базу. ## Что учесть при внедрении - Компьютеру нужны ресурсы для работы модели, поэтому проверьте требования заранее. - Сначала запустите на типовых документах, затем добавляйте нетиповые: каждый новый формат настраивается отдельно. - Всегда оставляйте проверку человеком перед проведением. - Подбор номенклатуры зависит от качества справочника, поэтому дубли и устаревшие позиции лучше почистить. Готовое расширение проверено на 1С:Управление торговлей 11.5 и 1С:Бухгалтерия предприятия 3.0, для других конфигураций делается индивидуальная интеграция. Подробности и цены на [странице проекта](/raboty/raspoznavanie-dokumentov-1c/) и на [Инфостарте](https://infostart.ru/marketplace/2700415/). ## Частые вопросы ### Нужен ли интернет для работы? Нет. Обработка идёт на компьютере клиента, поэтому интернет не требуется. ### Какие документы поддерживаются? УПД и ТОРГ-12 в форматах JPG, PNG и PDF, в том числе многостраничные. Другие типы документов добавляются отдельной настройкой. ### Подойдёт ли это для моей конфигурации? Расширение проверено на УТ 11.5 и БП 3.0. Для КА, ERP, УНФ и доработанных конфигураций делается индивидуальная интеграция. ### Нужно ли проверять результат? Да. Расширение заполняет документ, а проводит его человек после проверки. ## llms.txt: пример файла, формат и чек-лист для сайта URL: https://oneswitch.ru/blog/llms-txt-primer-formata/ Дата: 2026-10-30 Файл `llms.txt` — это краткий путеводитель по сайту для языковых моделей. Он лежит в корне (`/llms.txt`) и написан в формате Markdown. Разберём структуру, пример и ограничения. ## Формат файла Распространённый формат состоит из таких частей: 1. **Заголовок первого уровня:** название сайта или проекта (обязательная часть). 2. **Цитата с кратким описанием:** одна-две фразы о том, что это за сайт. 3. **Необязательные абзацы** с важными пояснениями. 4. **Разделы второго уровня** со списками ссылок: `- [Название](адрес): краткое пояснение`. 5. **Раздел `Optional`** для второстепенных материалов, которые можно пропустить, если не хватает места. ## Пример ```markdown # OneSwitch > Разработка и автоматизация: сайты, Telegram-боты и Mini App, интеграции, 1С и AI-агенты. Автор: Владимир Кальянов. Язык: русский. Контакты: страница /kontakty/. ## Услуги - [Telegram-боты и Mini App](https://oneswitch.ru/uslugi/telegram-boty-i-mini-app/): боты, каталоги, подписки, уведомления. - [1С и учётные системы](https://oneswitch.ru/uslugi/1c/): расширения, обмен с сайтом, ИИ-распознавание документов. ## Работы - [HotTrip](https://oneswitch.ru/raboty/hottrip/): портал, ИИ-бот, Mini App и автоматизированный канал. ## Блог - [Проверка initData в Mini App](https://oneswitch.ru/blog/proverka-initdata-telegram-mini-app-python/): код и ошибки. ## Optional - [Полный текст сайта](https://oneswitch.ru/llms-full.txt) ``` ## Как составить хороший файл - **Только важные страницы.** Услуги, ключевые материалы, документация, контакты. Не вставляйте весь sitemap. - **Пояснение к каждой ссылке.** Короткая фраза о том, что на странице, помогает модели выбрать нужное. - **Полные адреса** с протоколом и доменом, без редиректов. - **Актуальность.** Файл должен обновляться вместе с сайтом, иначе в нём окажутся несуществующие страницы. - **Коротко.** Это справка, а не копия сайта. Для полного текста делают отдельный файл `llms-full.txt`. ## Генерация скриптом Файл удобно собирать из тех же данных, что и сайт. Пример на Python: ```python def build_llms_txt(title: str, summary: str, sections: dict[str, list[tuple[str, str, str]]]) -> str: """sections: {"Услуги": [(название, адрес, пояснение), ...]}""" lines = [f"# {title}", "", f"> {summary}", ""] for name, links in sections.items(): lines.append(f"## {name}") lines += [f"- [{t}]({u}): {d}" for t, u, d in links] lines.append("") return "\n".join(lines) ``` Так сделан файл на этом сайте: он собирается при каждой сборке из списка услуг, работ и статей, поэтому всегда совпадает с содержимым. ## Чем он отличается от других файлов | Файл | Для чего | |---|---| | `robots.txt` | Правила доступа для роботов: что можно и нельзя сканировать | | `sitemap.xml` | Полный список страниц для поисковых систем | | `llms.txt` | Краткий смысловой обзор сайта для языковых моделей | Они дополняют друг друга. Также полезны **структурированные данные** в формате JSON-LD, описывающие страницы для поисковиков и нейросетей. ## Чего ожидать `llms.txt` — предложение сообщества, а не стандарт, который обязаны поддерживать все системы. Не все модели и поисковые роботы его читают, поэтому **гарантий упоминаний в ответах он не даёт**. Зато он ничего не стоит, помогает тем, кто его использует, и заставляет вас ясно описать сайт. Ставьте его вместе с остальной подготовкой: [GEO и llms.txt](/blog/llms-txt-i-geo-seo-dlya-nejrosetej/). Услуга: [«SEO и AI-оптимизация»](/uslugi/seo-i-ai-optimizaciya/). ## Частые вопросы ### Где должен лежать llms.txt? В корне сайта по адресу `https://ваш-домен/llms.txt`, как и `robots.txt`. ### Нужно ли разрешать ИИ-ботам сканировать сайт? Если вы хотите, чтобы вас находили через нейросети, не закрывайте им доступ в `robots.txt`. Для платного или закрытого контента настройте ограничения. ### Заменяет ли llms.txt sitemap? Нет. Sitemap нужен поисковым системам, llms.txt даёт моделям краткий обзор. Лучше иметь оба. ### Что такое llms-full.txt? Дополнительный файл с полным текстом ключевых страниц в одном документе. Он удобен, когда модели нужно прочитать сайт целиком без перехода по ссылкам. ## Каталог в Telegram Mini App: архитектура API, фильтры и подписки URL: https://oneswitch.ru/blog/katalog-v-telegram-mini-app-arhitektura/ Дата: 2026-10-30 Каталог внутри Telegram удобен тем, что пользователь не покидает мессенджер: ищет, сохраняет поиск и получает уведомления о новинках. Разберём архитектуру, на которой работает такой каталог, на примере аренды жилья и билетов. ## Три части системы 1. **API каталога:** отдаёт объекты по фильтрам. 2. **Авторизация:** определяет пользователя по подписанным данным Mini App. 3. **Воркер подписок:** сопоставляет новые объекты с сохранёнными критериями и отправляет уведомления. Данные лежат в одной базе, поэтому каталог на сайте и в Mini App всегда одинаковый, а обновления видны сразу. ## API каталога Минимальный набор методов: | Метод | Назначение | |---|---| | `GET /api/items` | Список с фильтрами, сортировкой и пагинацией | | `GET /api/items/{id}` | Карточка объекта: фото, описание, карта, контакт | | `GET /api/places` | Подсказки для ввода района, города или направления | | `POST /api/subscriptions` | Сохранить критерии поиска и включить уведомления | | `GET /api/subscriptions` | Список подписок пользователя | | `DELETE /api/subscriptions/{id}` | Отключить подписку | Советы: - **Пагинация по курсору,** а не по номеру страницы: список не «прыгает», когда появляются новые объекты. - **Фильтры в параметрах запроса:** район, тип, диапазон цены, сортировка. Валидируйте значения на сервере. - **Индексы в базе** по полям фильтров и сортировки. Без них каталог с тысячами записей начнёт тормозить. - **Миниатюры вместо оригиналов.** Фото в списке должны быть лёгкими, оригиналы грузятся в карточке. - **Кэш** для частых запросов: популярные фильтры можно хранить на минуты. ## Авторизация Любой запрос, который работает с пользователем (подписки, избранное), должен нести подписанные данные Mini App, которые сервер проверяет. Подробный разбор с кодом: [как проверить initData в Python](/blog/proverka-initdata-telegram-mini-app-python/). Публичные методы каталога могут работать без авторизации. ## Подписки по критериям Пользователь сохраняет поиск: район, тип, диапазон цены. Критерии удобно хранить как JSON рядом с идентификатором пользователя: ```sql CREATE TABLE subscriptions ( id bigserial PRIMARY KEY, user_id bigint NOT NULL, criteria jsonb NOT NULL, -- {"district": "Son Tra", "type": "studio", "price_max": 10000000} active boolean NOT NULL DEFAULT true, last_notified_item bigint NOT NULL DEFAULT 0 ); ``` Воркер запускается по расписанию или по событию «появился новый объект». Для каждого нового объекта он находит подходящие подписки, отправляет сообщение и запоминает последний уведомлённый объект, чтобы не слать повторы. Принципы: - **Не дублируйте уведомления.** Храните, что уже отправлено каждому пользователю. - **Группируйте.** Если появилось много объектов, отправьте один дайджест, а не десять сообщений. - **Давайте простой выход.** В каждом уведомлении должна быть кнопка отключения подписки. - **Соблюдайте лимиты Telegram** и обрабатывайте ошибки доставки: пользователь мог заблокировать бота. ## Уведомление с переходом в приложение Сообщение отправляется ботом, а кнопка с `web_app` открывает карточку нового объекта в Mini App. Как отправить такую кнопку, описано в статье про [кнопки и меню бота на n8n](/blog/telegram-bot-n8n-knopki-menu-mini-app/). ## Что показывать и как обновлять - **Свежесть данных важна.** В нашем каталоге аренды в Дананге база обновляется автоматически каждые 15 секунд, а новые объявления попадают в каталог и группу без ручной работы. - **Показывайте дату добавления** и отметку «сегодня» для новых объектов. - **Сохраняйте состояние интерфейса:** выбранные фильтры лучше запоминать, чтобы пользователь возвращался к тому же поиску. ## Что получилось у нас По этой схеме построены Mini App в проектах [Da Nang House](/raboty/danang-house/) (каталог жилья с подписками) и [HotTrip](/raboty/hottrip/) (горящие билеты с радаром цен). Если нужен каталог в Telegram под вашу нишу, смотрите услугу [«Telegram-боты и Mini App»](/uslugi/telegram-boty-i-mini-app/) и [«Веб-приложения»](/uslugi/veb-prilozheniya/). ## Частые вопросы ### Нужен ли отдельный сайт, если есть Mini App? Желательно да: сайт нужен для поиска в Google и Яндексе, а Mini App удерживает пользователей и присылает уведомления. Данные при этом общие. ### Сколько объектов выдержит такой каталог? Тысячи объектов обслуживаются без проблем при правильных индексах, пагинации и миниатюрах. В нашем каталоге аренды их больше трёх тысяч. ### Как обновлять каталог автоматически? Источники данных подключаются к базе по расписанию или через вебхуки, а новые записи сразу попадают в API и в воркер подписок. ### Можно ли делать подписки без Mini App, только в боте? Можно, но в Mini App удобнее выбирать критерии и управлять подписками. Бот при этом остаётся каналом уведомлений. ## Защита от дублей в автопостинге: ключ, ON CONFLICT и очередь URL: https://oneswitch.ru/blog/dedup-v-avtoposting-n8n-postgresql/ Дата: 2026-10-30 Автопостинг и интеграции рано или поздно начинают слать повторы: сценарий запустили дважды, сервис повторил запрос, выгрузка пришла с теми же данными. Надёжнее всего защита, которая живёт в базе данных, а не в самом сценарии. ## Откуда берутся дубли - **Повторный запуск** по расписанию или вручную. - **Повторная доставка** вебхука: отправитель не получил ответ и прислал запрос ещё раз. - **Пересечение источников:** одно и то же предложение приходит из двух мест. - **Сбой посередине:** сообщение ушло, а отметка об этом не сохранилась, поэтому при повторе оно уйдёт снова. ## Шаг 1: уникальный ключ предложения Придумайте стабильный ключ, по которому две записи считаются одним и тем же предложением. Для билетов это маршрут, дата и ценовой диапазон, для объявлений адрес и цена, для заявок идентификатор запроса. ```sql CREATE TABLE offers ( id bigserial PRIMARY KEY, dedup_key text NOT NULL UNIQUE, payload jsonb NOT NULL, status text NOT NULL DEFAULT 'new', -- new, sending, sent, failed created_at timestamptz NOT NULL DEFAULT now(), published_at timestamptz ); ``` Ограничение `UNIQUE` не даст вставить второй раз то же самое, даже если два сценария запущены одновременно. ## Шаг 2: вставка без дублей ```sql INSERT INTO offers (dedup_key, payload) VALUES ($1, $2) ON CONFLICT (dedup_key) DO NOTHING RETURNING id; ``` Если запись новая, запрос вернёт её `id`. Если такой ключ уже есть, вернётся пустой результат, и вы просто пропускаете предложение. Это работает без отдельной проверки «есть ли уже такое», которая сама подвержена гонкам. ## Шаг 3: очередь на отправку Отправку делайте отдельным шагом, который берёт записи из очереди. Чтобы два обработчика не взяли одну и ту же запись, используйте блокировку строки с пропуском занятых: ```sql UPDATE offers SET status = 'sending' WHERE id = ( SELECT id FROM offers WHERE status = 'new' ORDER BY id FOR UPDATE SKIP LOCKED LIMIT 1 ) RETURNING id, payload; ``` `FOR UPDATE SKIP LOCKED` блокирует выбранную строку и пропускает те, что уже взяты другим обработчиком. Каждый обработчик получает свою запись. ## Шаг 4: статусы и повтор После отправки отметьте результат: ```sql UPDATE offers SET status = 'sent', published_at = now() WHERE id = $1; -- при ошибке: UPDATE offers SET status = 'failed' WHERE id = $1; ``` Теперь любой шаг можно безопасно повторить: - записи со статусом `failed` можно отправить снова; - записи, зависшие в `sending` дольше нескольких минут, возвращаются в `new` отдельным заданием (так вы не теряете сообщения при падении обработчика). ## Нюансы - **Сообщение могло уйти, а отметка нет.** Если процесс упал между отправкой и обновлением статуса, при повторе сообщение уйдёт снова. Для критичных случаев храните идентификатор отправленного сообщения и проверяйте перед повтором. Для постов в канал обычно достаточно небольшой возможной повторной публикации. - **Ключ должен быть стабильным.** Не включайте в него поля, которые меняются при каждой выгрузке (время запроса). - **Старые записи.** Чистите или архивируйте таблицу по расписанию: ограничение уникальности работает, пока запись существует. Если нужно помнить ключ дольше, храните только ключи. - **Пауза между отправками** защищает от лимитов Telegram. ## Как это встроено в n8n В сценарии n8n это узлы PostgreSQL: вставка с `ON CONFLICT`, выбор из очереди с блокировкой, отправка в Telegram и обновление статуса. Состояние лежит в базе, поэтому перезапуск сценария ничего не ломает. Общая схема конвейера описана в статье [автопостинг в Telegram на n8n и PostgreSQL](/blog/avtoposting-v-telegram-n8n-postgresql/), а приём данных с сайта в [защите webhook в n8n](/blog/n8n-webhook-zashchita-avtorizaciya/). Такой подход использован в проектах [HotTrip](/raboty/hottrip/) и [Da Nang House](/raboty/danang-house/). Услуга: [«Контент и соцсети»](/uslugi/kontent-i-soczseti/). ## Частые вопросы ### Почему нельзя проверять дубли в сценарии? Проверка «есть ли запись» и вставка выполняются не атомарно: два запуска могут одновременно решить, что записи нет. Ограничение уникальности в базе закрывает это без гонок. ### Что делать, если у предложений нет естественного ключа? Сформируйте его из набора полей (источник, идентификатор у источника, дата) и храните в виде хеша или строки. Главное, чтобы ключ не менялся при повторной выгрузке. ### Как обработать «зависшие» записи? Периодическим заданием возвращайте записи со статусом `sending` старше заданного времени обратно в `new` и пишите об этом в лог. ### Подходит ли это для других баз? Идея универсальна, но синтаксис отличается. `ON CONFLICT` и `SKIP LOCKED` есть в PostgreSQL, в других базах используют свои аналоги. ## Автопостинг в Telegram на n8n и PostgreSQL: схема конвейера URL: https://oneswitch.ru/blog/avtoposting-v-telegram-n8n-postgresql/ Дата: 2026-10-30 Автопостинг нужен там, где предложений много, а публиковать вручную долго: подборки билетов, объявления, новости. Ниже схема, которая работает у меня в проектах с Telegram-каналами. ## Из чего состоит конвейер 1. **Сбор.** Запрос к API источника по расписанию, например раз в два часа. 2. **Хранение.** Каждое предложение сохраняется в PostgreSQL с уникальным ключом, поэтому дубли не пройдут. 3. **Подготовка.** Из записей собираются дайджесты, подбираются фото и при необходимости монтируется видео. 4. **Очередь.** Публикации идут пачками с паузой между сообщениями, чтобы не упереться в лимиты Telegram. 5. **Проверка.** После отправки сценарий убеждается, что сообщение вышло, а ошибки пишет в лог. ## Почему именно n8n и PostgreSQL n8n наглядно показывает цепочку и позволяет быстро менять логику. PostgreSQL хранит состояние: что уже опубликовано, что в очереди, что завершилось ошибкой. Без базы сценарий забывает прошлое и публикует повторы. ## На что смотреть при запуске - Ставьте уникальный ключ на предложение, например маршрут и дату. - Делайте паузу между отправками и повторяйте попытку при ошибке. - Добавьте уведомление о сбое в личный чат. - Храните токены в переменных окружения, а не в сценарии. ## Частые вопросы ### Можно ли публиковать сразу в несколько каналов? Да. Достаточно добавить в таблицу поле назначения и вынести отправку в отдельный шаг, который работает по очереди. ### Что лучше: n8n или собственный скрипт? Для типовой цепочки n8n быстрее запускается и проще в сопровождении. Если логика сложная или объёмы большие, надёжнее код на Python. ### Как избежать блокировки за спам? Соблюдайте лимиты, не отправляйте одинаковые сообщения подряд и группируйте предложения в дайджесты. ## Aviasales API на Python: цены на авиабилеты через Travelpayouts URL: https://oneswitch.ru/blog/aviasales-travelpayouts-api-na-python/ Дата: 2026-10-30 Если вы делаете сайт, бота или Mini App с билетами, самый простой источник цен — **Data API Travelpayouts** (Aviasales). Ниже пример на Python, типичные запросы и ограничения, на которые мы наткнулись при работе над HotTrip. ## Что такое Data API и чем он отличается от живого поиска Data API отдаёт **кэшированные цены**, собранные из поисков пользователей Aviasales. Это быстро и бесплатно, но не то же самое, что поиск в реальном времени: - цена может быть **устаревшей**: по описаниям сторонних обёрток данные берутся из поисков примерно за последние двое суток; - для редких маршрутов и дат данных может **не быть**; - конечная цена на странице покупки может отличаться. Для живого поиска у Travelpayouts есть отдельный API с другими условиями доступа, их смотрите в документации. Для витрины «от X ₽» и подборок направлений Data API обычно достаточно. ## Что нужно - Аккаунт в **Travelpayouts** и **токен** (выдаётся в кабинете). - Ваш партнёрский **marker** для ссылок, если хотите получать комиссию. - Python и библиотека `requests`. Токен передавайте в заголовке `x-access-token` и храните в переменной окружения, а не в коде. ## Цены по направлению и датам Основной метод: `GET https://api.travelpayouts.com/aviasales/v3/prices_for_dates`. ```python import os import requests API = "https://api.travelpayouts.com/aviasales/v3/prices_for_dates" TOKEN = os.environ["TRAVELPAYOUTS_TOKEN"] def cheapest(origin: str, destination: str, month: str, limit: int = 10) -> list[dict]: """Самые дешёвые предложения. origin/destination: IATA-коды, month: '2026-12'.""" r = requests.get( API, headers={"x-access-token": TOKEN}, params={ "origin": origin, "destination": destination, "departure_at": month, "sorting": "price", "unique": "false", "currency": "rub", "limit": limit, }, timeout=10, ) r.raise_for_status() return r.json().get("data", []) for offer in cheapest("MOW", "IST", "2026-12"): print(offer["departure_at"][:10], offer["price"], offer.get("airline"), offer.get("transfers")) ``` В ответе приходит список предложений. В каждом обычно есть цена, авиакомпания, дата вылета, число пересадок и поле `link` с относительным адресом страницы поиска на Aviasales. Точные поля и актуальные параметры сверяйте с документацией Travelpayouts: они могут меняться. ## Популярные направления из города Для блока «Куда полететь» удобен метод `GET /v1/city-directions?origin=MOW¤cy=rub`. Он возвращает список направлений из города одним запросом, что быстрее, чем перебирать маршруты вручную. ## Коды городов и аэропортов Используйте IATA-коды. **MOW** означает Москву целиком (все аэропорты), **SVO** — конкретный аэропорт. Для подсказок при вводе есть автодополнение `https://autocomplete.travelpayouts.com/places2?term=...&locale=ru`, которое возвращает города и аэропорты. ## Ссылки и партнёрский marker Поле `link` содержит путь, который нужно собрать в полный адрес `https://www.aviasales.ru` + `link` и добавить партнёрский marker. Тогда переходы по ссылке будут учтены в вашем кабинете. Для коротких ссылок в Telegram в API есть метод создания сокращённых партнёрских ссылок. ## Подводные камни из практики 1. **Кэширование на вашей стороне.** Сохраняйте ответы в базу данных и обновляйте по расписанию (так устроены наши проекты), а не при каждом запросе пользователя: это быстрее и экономит лимиты. 2. **Пустые ответы.** Для части маршрутов данных нет. Показывайте понятное сообщение и соседние даты или направления. 3. **Свежесть.** Храните время получения цены и показывайте её как «от». Предупреждайте, что итоговая цена на странице покупки может отличаться. 4. **Тайм-ауты и ошибки.** Ставьте тайм-аут и повторяйте запрос при сбое. Не блокируйте пользователя ожиданием внешнего API. 5. **Валюта и язык.** Параметр `currency` управляет валютой цен, для разных стран храните цены по каждой валюте отдельно. ## Где это применено На основе Data API мы построили портал, Telegram-бота с поиском рейсов и подписками на цены, Mini App и автоматизированный канал, который каждые два часа публикует свежие предложения. Подробности в проекте [HotTrip](/raboty/hottrip/) и в услугах [«Интеграции и API»](/uslugi/integracii-i-api/) и [«Парсинг и данные»](/uslugi/parsing-i-dannye/). ## Частые вопросы ### Нужен ли платный тариф для Data API? Токен Travelpayouts выдаётся в кабинете партнёра. Условия доступа к разным API меняются, поэтому актуальные ограничения смотрите в документации Travelpayouts. ### Цены из Data API — это живой поиск? Нет. Это кэшированные данные из поисков пользователей, поэтому цена может отличаться от той, что вы увидите при покупке. ### Как получать комиссию с продаж? Добавляйте свой партнёрский marker к ссылкам на Aviasales. Тогда покупки по вашим ссылкам учитываются в кабинете Travelpayouts. ### Можно ли вызывать API прямо из браузера? Не рекомендуется: токен окажется доступен всем. Вызывайте API с сервера и отдавайте клиенту только нужные данные. ## Telegram Mini App или сайт: что выбрать для каталога URL: https://oneswitch.ru/blog/telegram-mini-app-ili-sajt/ Дата: 2026-10-29 Когда нужен каталог, например жилья, билетов или услуг, встаёт вопрос: делать сайт, Mini App или оба. Короткий ответ: оба, но с разными ролями. ## Что даёт Mini App - Открывается внутри Telegram в один тап, без регистрации. - Знает пользователя, поэтому легко сохранять поиски и подписки. - Может присылать уведомления через бота, когда появляются новые объекты. - Хорошо смотрится на телефоне, где и сидит основная аудитория. ## Что даёт сайт - Его находят в поиске и в ответах нейросетей. - На нём можно разместить статьи, гайды и страницы для каждого направления. - Он доступен без Telegram и удобен на компьютере. ## Как их связать Сайт приводит людей из поиска, а кнопки ведут в бота и Mini App, где человек сохраняет критерии и получает уведомления. Данные лежат в одной базе, поэтому каталог на сайте и в Mini App всегда одинаковый. ## Что понадобится технически 1. Общая база данных и API. 2. Бот с командами, подписками и рассылкой. 3. Mini App на HTML и JavaScript, который читает API. 4. Сайт с SEO-разметкой и каталогом. ## Частые вопросы ### Mini App сложно делать? Базовый вариант с каталогом и фильтрами делается за пару недель, если API уже есть. Сложнее всего данные и уведомления, а не интерфейс. ### Нужен ли Mini App, если есть бот? Бот хорош для коротких сценариев. Когда нужны фильтры, фото и карточки объектов, Mini App заметно удобнее. ### Индексируется ли Mini App в поиске? Нет, поэтому SEO-трафик приносит сайт, а Mini App работает на удержание и повторные визиты. ## llms.txt и GEO: как подготовить сайт к ответам нейросетей URL: https://oneswitch.ru/blog/llms-txt-i-geo-seo-dlya-nejrosetej/ Дата: 2026-10-28 Всё больше людей получают ответы не из списка ссылок, а от нейросети. Чтобы сайт попадал в такие ответы, его нужно подготовить так же внимательно, как к обычному поиску. ## Что такое GEO GEO (Generative Engine Optimization) — оптимизация контента так, чтобы языковые модели могли найти страницу, понять её и корректно процитировать. Он не заменяет SEO, а дополняет его. ## Что делать на практике 1. **Дайте краткий ответ в начале.** Блок «Кратко» из одного-двух предложений удобно цитировать. 2. **Добавьте микроразметку.** Article, FAQPage, Service, BreadcrumbList в формате JSON-LD описывают страницу машинным языком. 3. **Откройте доступ ИИ-ботам.** В robots.txt разрешите нужных ботов и укажите sitemap. 4. **Добавьте llms.txt.** Это файл в корне сайта с описанием проекта и ссылками на главные страницы в виде простого текста. 5. **Отдавайте Markdown-версии.** Чистый текст без оформления проще разбирать. 6. **Пишите фактами.** Даты, цифры, названия и источники повышают доверие и шанс на цитату. ## Чего ждать Гарантий попадания в ответы нет, как и в обычном SEO. Но сайт с понятной структурой и разметкой читается лучше, а значит, у него больше шансов. ## Частые вопросы ### Нужен ли llms.txt обязательно? Нет, это необязательный формат, и не все системы его используют. Но он ничего не стоит и помогает тем, кто читает. ### Чем GEO отличается от SEO? SEO борется за позицию в выдаче, GEO за то, чтобы вас упомянули и процитировали в ответе. Приёмы во многом общие: структура, факты, разметка. ### Нужно ли закрывать сайт от ИИ-ботов? Если вы хотите, чтобы вас находили через нейросети, закрывать не нужно. Если контент платный или закрытый, настройте ограничения в robots.txt. ## Сколько стоит сайт и автоматизация: из чего складывается цена URL: https://oneswitch.ru/blog/skolko-stoit-sajt-i-avtomatizaciya/ Дата: 2026-10-27 Вопрос «сколько стоит сайт» похож на вопрос «сколько стоит ремонт»: без подробностей названа может быть только вилка. Вот из чего она складывается. ## Что влияет на цену - **Объём.** Лендинг и каталог на тысячи объектов — разные задачи. - **Интеграции.** Каждая связка с CRM, платежами, 1С или мессенджером добавляет работы и тестов. - **Данные.** Сбор, очистка и хранение часто занимают больше времени, чем интерфейс. - **Надёжность.** Логи, повторы, уведомления об ошибках и автотесты стоят отдельно, но окупаются. - **Дизайн.** Готовые решения дешевле уникальной отрисовки. - **Сроки.** Срочная работа обычно дороже. ## Как не переплатить 1. Начните с главного сценария и запустите его первым. 2. Опишите задачу своими словами: что должно происходить и для кого. 3. Договоритесь об этапах и оплате по результатам. 4. Сразу попросите исходники и доступы. ## Ориентиры Лендинг обычно делается за 5–7 дней, многостраничный сайт или веб-приложение за 3–6 недель, отдельный сценарий автоматизации за 2–10 дней. Актуальные вилки цен смотрите в [разделе «Цены»](/ceny/). ## Частые вопросы ### Почему нельзя назвать точную цену сразу? Потому что она зависит от деталей. После короткого брифа я фиксирую объём, срок и стоимость до начала работ. ### Что дороже: сайт или автоматизация? Сайт чаще стоит больше из-за дизайна и контента, а автоматизация зависит от числа шагов и сервисов. Сравнивать нужно по задаче. ### Есть ли скрытые платежи? Отдельно платятся только внешние сервисы: домен, хостинг, API и подписки. Их стоимость я называю заранее.