К статье
Практический материал

Автоматизация · 15 мин

Бот в 1С: как создать и подключить к базе

Как создать бота в 1С: регистрация в BotFather, HTTP-запросы к Telegram API, webhook и long polling, обработка команд, типовые ошибки и проверка результата.

Бот в 1С — это программный механизм, который обменивается сообщениями с внешним мессенджером (чаще всего Telegram) прямо из информационной базы. С его помощью сотрудники получают уведомления о новых заказах, согласуют документы, запрашивают остатки по складу или остатки взаиморасчётов, не открывая саму 1С. Реализуется это без сторонних компонентов: встроенный язык платформы умеет выполнять HTTP-запросы, а этого достаточно для работы с Bot API Telegram.

Есть два принципиальных подхода. Первый — 1С сама периодически опрашивает серверы Telegram методом getUpdates (long polling). Второй — Telegram отправляет обновления на опубликованный HTTP-сервис вашей базы (webhook). Long polling проще в запуске и подходит для файловых баз и тестирования, webhook быстрее реагирует, но требует публикации базы на веб-сервере и корректного SSL-сертификата.

Ниже разобран полный цикл: регистрация бота, выбор способа получения сообщений, код обработки команд, отправка уведомлений из документов, типовые ошибки и проверка результата. Примеры ориентированы на управляемое приложение (1С:Предприятие 8.3), но логика одинакова для любой конфигурации.

Что понадобится перед началом работы

Минимальный набор: доступ к конфигуратору с правами на изменение (или возможность создать расширение), тестовая копия базы и аккаунт Telegram. Все эксперименты проводите на копии — ошибка в регламентном задании или HTTP-сервисе может замедлить работу рабочей базы или открыть наружу данные, которые не должны быть публичными.

Также заранее решите, где будет работать бот. Для long polling нужна база с постоянно запущенным сервером 1С или сеансом, выполняющим фоновые задания. Для webhook — опубликованный через веб-сервер (Apache или IIS) HTTP-сервис с валидным SSL-сертификатом: Telegram не отправляет обновления на адреса без HTTPS.

Доступ в интернет из 1СОбязателен для обоих схем

Проверьте, что с сервера 1С открывается api.telegram.org, нет блокировки прокси или файрвола

Публикация базыНужна только для webhook

База опубликована на веб-сервере, включён доступ к HTTP-сервисам, настроен HTTPS

Регламентные заданияНужны для long polling

В серверной базе фоновые задания выполняются автоматически; в файловой — требуется отдельный сеанс

Права и ролиОграничьте доступ

Определите, какие пользователи Telegram смогут получать данные, и как это будет проверяться

Регистрация бота в BotFather

Откройте Telegram и найдите официального бота @BotFather. Отправьте команду /newbot, придумайте отображаемое имя и уникальный username, обязательно заканчивающийся на «bot» (например, myfirma_1c_bot). В ответ BotFather пришлёт токен — строку вида «123456789:AAEhBOweik6ad9r_QXMENQjcrGbqCr4K-4c». Это ключ доступа к API, храните его как пароль.

Сразу настройте базовые параметры: /setdescription задаёт описание, /setcommands — список команд, которые увидит пользователь в меню бота (например, /ostatki — остатки на складе, /status — статус заказа). Токен в 1С удобно хранить в константе или в безопасном хранилище, но не зашивать в код — при публикации конфигурации или выгрузке в хранилище токен уедет вместе с кодом.

Отправка сообщений из 1С: метод sendMessage

Самая простая задача — уведомление из 1С в Telegram. Для неё не нужен ни webhook, ни опрос: достаточно вызвать метод sendMessage Bot API. Понадобится токен и chat_id получателя. Чтобы узнать chat_id пользователя, попросите его написать боту любое сообщение и один раз выполните getUpdates — в ответе будет нужный идентификатор чата.

Типовой код отправки выглядит так: формируется HTTPСоединение с сервером api.telegram.org по HTTPS, затем GET- или POST-запрос с параметрами chat_id и text. Ниже пример функции, которую можно разместить в общем модуле с признаком «Сервер».

Функция ОтправитьСообщениеTelegram(ChatID, Текст) Экспорт

Токен = Константы.ТокенTelegramБота.Получить();

Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , ,

Новый ЗащищенноеСоединениеOpenSSL);

ТекстЗапроса = "/bot" + Токен + "/sendMessage?chat_id="

+ ChatID + "&text=" + КодироватьСтроку(Текст,

СпособКодированияСтроки.КодировкаURL);

Запрос = Новый HTTPЗапрос(ТекстЗапроса);

Ответ = Соединение.Получить(Запрос);

Возврат Ответ.КодСостояния = 200;

КонецФункции

Типовой сценарий использования — подписка на событие «ПриЗаписи» документа реализации или заказа: при проведении документа менеджеру уходит сообщение с номером, суммой и контрагентом. Не отправляйте сообщение синхронно при интерактивной записи больших пакетов документов — сетевые вызовы замедлят проведение. Лучше складывать уведомления в очередь (регистр сведений) и отправлять их регламентным заданием.

Получение команд: long polling через getUpdates

Long polling — вариант, при котором 1С сама периодически спрашивает у Telegram, есть ли новые сообщения. Создайте общий модуль и регламентное задание с расписанием, например каждые 30–60 секунд. В обработчике вызывайте метод getUpdates с параметром offset — идентификатором последнего обработанного обновления плюс один, чтобы не получать одни и те же сообщения повторно.

Ответ приходит в формате JSON, который разбирается штатным методом ПрочитатьJSON. Для каждого входящего сообщения извлекайте текст, chat_id и имя отправителя, затем передавайте в процедуру маршрутизации команд. Последний обработанный update_id сохраняйте в константе или регистре — это критично: если offset не сдвигать, бот будет бесконечно реагировать на старые сообщения.

Процедура ОпроситьTelegram() Экспорт

Токен = Константы.ТокенTelegramБота.Получить();

Offset = Константы.ПоследнийUpdateID.Получить();

Соединение = Новый HTTPСоединение("api.telegram.org", 443, , , , ,

Новый ЗащищенноеСоединениеOpenSSL);

Запрос = Новый HTTPЗапрос("/bot" + Токен + "/getUpdates?offset="

+ Формат(Offset + 1, "ЧГ=") + "&timeout=20");

Ответ = Соединение.Получить(Запрос);

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку());

Данные = ПрочитатьJSON(Чтение, Истина);

Для Каждого Обновление Из Данные["result"] Цикл

ОбработатьКоманду(Обновление["message"]);

Константы.ПоследнийUpdateID.Установить(Обновление["update_id"]);

КонецЦикла;

КонецПроцедуры

У long polling есть ограничение: реакция на команду наступает не мгновенно, а в момент очередного опроса. Для уведомлений и редких запросов это приемлемо, для диалогового интерфейса с кнопками задержка в минуту уже заметна — тогда переходите на webhook.

Порядок запуска long polling
  1. 1
    Создайте константы для токена и последнего update_id
  2. 2
    Добавьте общий серверный модуль с функцией отправки и процедурой опроса
  3. 3
    Создайте регламентное задание с расписанием 30–60 секунд
  4. 4
    Напишите боту тестовое сообщение и убедитесь, что оно попало в обработчик
  5. 5
    Проверьте, что offset сохраняется и повторной реакции на старые сообщения нет

Получение команд: webhook через HTTP-сервис

Webhook — обратная схема: Telegram сам отправляет каждое обновление POST-запросом на URL вашего HTTP-сервиса. В конфигураторе создайте объект «HTTP-сервис» с шаблоном URL, например /telegram, и методом POST. В обработчике прочитайте тело запроса, разберите JSON и передайте в ту же процедуру маршрутизации команд. Ответить Telegram нужно быстро кодом 200, иначе он будет повторять отправку.

После публикации базы на веб-сервере зарегистрируйте webhook вызовом setWebhook: https://api.telegram.org/bot<токен>/setWebhook?url=https://ваш-сервер/база/hs/telegram. Важные условия: адрес должен быть доступен из интернета, сертификат — доверенным (самоподписанный потребует отдельной загрузки в setWebhook). Проверить состояние привязки можно методом getWebhookInfo — он покажет URL, число необработанных обновлений и текст последней ошибки доставки.

Безопасность webhook — отдельная тема. URL HTTP-сервиса потенциально доступен любому, кто его угадает, поэтому включите в путь случайный секретный фрагмент или проверяйте заголовок X-Telegram-Bot-Api-Secret-Token, который Telegram присылает, если задать secret_token при регистрации webhook. Иначе посторонний сможет подделать команды боту.

Long polling или webhook

Long polling (getUpdates)

Проще запустить, работает без публикации базы, подходит файловым базам. Минус — задержка реакции до интервала опроса и постоянная нагрузка регламентным заданием

Webhook (HTTP-сервис)

Мгновенная реакция на команды, нет лишнего фонового трафика. Минус — нужна публикация базы, HTTPS и защита endpoint от посторонних запросов

Гибрид

Уведомления отправляются напрямую sendMessage, а команды обрабатываются через webhook — самый распространённый рабочий вариант

Маршрутизация команд и контроль доступа

Бот, который отвечает любому написавшему, — угроза: chat_id подбирается, а данные базы ценны. Первый шаг защиты — белый список. Заведите регистр сведений «ПользователиTelegram» с полями: chat_id, ссылка на пользователя 1С, признак активности. В обработчике команд первым делом проверяйте, есть ли chat_id в регистре; если нет — отвечайте отказом и фиксируйте попытку в журнале регистрации.

Привязку удобно делать по одноразовому коду: пользователь 1С нажимает кнопку «Получить код для Telegram», система генерирует шестизначный код со сроком жизни 10 минут, сотрудник отправляет его боту, и бот связывает chat_id с учётной записью. Так исключается ручной ввод идентификаторов администратором.

Маршрутизацию команд делайте через соответствие или структуру: ключ — текст команды, значение — имя процедуры-обработчика. Типовые команды для учётной базы: /ostatki <номенклатура> — свободный остаток, /dolg — задолженность контрагента, /zakaz <номер> — статус заказа. Каждый обработчик должен проверять не только факт привязки, но и права пользователя на запрашиваемые данные — Telegram-интерфейс не должен давать больше, чем роль в 1С.

Типичные ошибки при создании бота
01
Токен зашит в код — при выгрузке конфигурации или публикации он утекает; храните токен в константе или безопасном хранилище
02
Не сохраняется offset при getUpdates — бот реагирует на одни и те же сообщения после каждого перезапуска
03
Нет проверки chat_id — любой, кто найдёт бота, получает доступ к данным базы
04
Отправка сообщений синхронно при проведении документов — запись тормозит, а при недоступности Telegram документ вообще не проводится; выносите отправку в фоновое задание
05
Webhook без секретного токена — endpoint доступен посторонним, возможны поддельные команды
06
Исключение в обработчике без попытки — регламентное задание завершается ошибкой и опрос останавливается незаметно

Проверка результата и диагностика

Проверяйте бота поэтапно. Сначала — отправка: выполните функцию sendMessage из внешней обработки или консоли кода с известным chat_id. Если сообщение не пришло, смотрите код ответа: 401 — неверный токен, 400 с описанием «chat not found» — неверный chat_id или пользователь ни разу не писал боту, ответа нет вообще — проблема с сетью, прокси или SSL на сервере 1С.

Затем — приём. Для long polling напишите боту и проверьте, что регламентное задание отработало без ошибок (журнал регистрации, отбор по имени задания) и что константа с update_id изменилась. Для webhook вызовите getWebhookInfo: поле pending_update_count должно быть нулевым, а last_error_message — пустым. Если Telegram сообщает об ошибке доставки, чаще всего виноваты сертификат, файрвол или неверный путь публикации.

Финальная проверка — сценарная: пройдите полный путь пользователя от привязки по коду до получения остатка по команде. Убедитесь, что отключённый пользователь (снятый флаг активности) получает отказ, а не данные.

Контрольные точки

Как проверить работу бота

Отправка sendMessage
Норма

Код ответа 200, сообщение пришло в чат

Тревожный признак

401 — токен неверен; 400 — неверный chat_id; таймаут — сеть или SSL

getWebhookInfo
Норма

url заполнен, pending_update_count = 0, нет last_error_message

Тревожный признак

Растёт счётчик необработанных обновлений, есть текст ошибки доставки

Регламентное задание
Норма

В журнале регистрации успешные выполнения по расписанию

Тревожный признак

Ошибки выполнения или задание не запускалось — проверьте расписание и сеанс фоновых заданий

Повторная реакция
Норма

После перезапуска бот не отвечает на старые сообщения

Тревожный признак

Бот снова обрабатывает вчерашние команды — не сохраняется offset

Границы самостоятельной работы и альтернативы

Описанных приёмов достаточно для уведомлений и простых команд. Самостоятельная доработка оправдана, когда сценарии понятны и данных немного. Когда появляются сложные диалоги с клавиатурами, загрузка файлов, интеграция с несколькими мессенджерами или требования по отказоустойчивости, стоит рассмотреть готовые подсистемы и расширения — их механику очередей, привязки пользователей и логирования писать с нуля долго.

Отдельный случай — коробочные решения вендора и отраслевые конфигурации: в некоторых уже есть встроенные механизмы уведомлений и взаимодействия с мессенджерами, и свой велосипед создаст конфликты при обновлении. Перед разработкой проверьте, нет ли в вашей конфигурации готовой подсистемы, и делайте доработку через расширение, чтобы не потерять её при обновлении.

Начинайте с односторонних уведомлений: это самый быстрый способ получить пользу и отладить сетевое взаимодействие. Двусторонний диалог с командами и правами доступа добавляйте вторым этапом, когда отправка уже стабильно работает — так проще локализовать ошибки.
ПЗ
Практическое замечание
Итог

Что важно запомнить

Бот в 1С создаётся через Bot API Telegram: регистрация в BotFather, токен, HTTP-запросы из общего модуля. Уведомления отправляйте методом sendMessage из фоновых заданий, команды принимайте через getUpdates с сохранением offset или через webhook на HTTP-сервисе с HTTPS. Обязательны белый список chat_id, хранение токена вне кода и тестирование на копии базы.

Частые вопросы

Можно ли создать бота в файловой базе 1С?

Да, для отправки уведомлений и long polling файловой базы достаточно. Учтите, что регламентные задания в файловом режиме выполняются только при запущенном отдельном сеансе с соответствующей настройкой. Webhook для файловой базы тоже возможен, но потребует публикации через веб-сервер.

Как узнать chat_id пользователя Telegram?

Попросите пользователя написать боту любое сообщение, затем выполните из 1С запрос getUpdates без параметров. В ответном JSON найдите объект message → chat → id — это и есть chat_id. Для личных чатов он положительный, для групп — отрицательное число.

Бот перестал отвечать после перезапуска сервера 1С. В чём причина?

Чаще всего не сохраняется offset: после перезапуска getUpdates возвращает старые обновления, а обработчик падает на уже обработанной команде или зацикливается. Проверьте, что update_id записывается в константу после каждой итерации, и что регламентное задание вообще запустилось — смотрите журнал регистрации.

Можно ли отправлять из 1С файлы и картинки в Telegram?

Да, методами sendDocument и sendPhoto. Файл передаётся либо ссылкой (если доступен по публичному URL), либо как multipart/form-data в теле POST-запроса — такой запрос в 1С формируется вручную с указанием границы разделителя. Есть ограничение на размер файла при отправке ботом, для больших документов лучше отправлять ссылку на веб-доступ.

Чем опасен бот с точки зрения безопасности данных?

Основные риски: утечка токена (полный контроль над ботом), отсутствие белого списка chat_id (доступ посторонних к данным), webhook без секретного токена (поддельные команды) и передача в чат чувствительных данных, которые Telegram хранит на своих серверах. Минимизируйте объём выгружаемой информации и логируйте все обращения.

Нужна ли для бота мобильная платформа или тонкий клиент?

Нет. Вся работа бота происходит на сервере 1С через HTTPСоединение — клиентские приложения не участвуют. Пользователи взаимодействуют с ботом из обычного приложения Telegram на телефоне или компьютере, а 1С лишь отправляет и принимает запросы к API.